我对 Springboot 和 Spring Data JPA 非常陌生,正在研究一个需要在不同数据库中创建用户的用例。 应用程序将从队列接收 2 个输入 - 用户名和数据库名称。 使用这个我必须在给定数据库中配置给定用户。 我无法理解项目架构。 由于我需要运行的查询的格式为 - 创建由密码标识的用户 ABC; 该项目在模型类、存储库等方面应该是什么样子?由于我没有要运行查询的实际表,因此我是否需要一个模型类,因为不会发生这样的列映射。
TLDR - 帮助构建配置有多个数据源的 Springboot-Spring Data JPA 应用程序,以运行以下格式的查询:创建由密码标识的用户
我一直在使用这个 GitHub 存储库作为引用 - https://github.com/jahe/spring-boot-multiple-datasources/blob/master/src/main/java/com/foobar
最佳答案
我将在这里做出一些假设:
- 您选择的数据库是
Oracle
,基于提供的语法:创建由密码标识的用户 ABC
- 您想要创建并列出用户
- 您的数据库众所周知并在 JNDI 中定义
不幸的是,我不能只提供代码,因为设置它需要我做一些工作,但我可以告诉你它的要点。
<小时/>方法一:使用JPA
- 首先,创建一个
User
实体和相应的UserRepository
。将实体绑定(bind)到all_users
表。主键可能是USERNAME
或USER_ID
列...但这并不重要,因为您不会对该表进行任何插入。 - 要创建用户,请将专用方法添加到您自己的
UserRepository
中,并在@NativeQuery
注释中指定用户创建查询。它应该开箱即用。 - 要列出用户,您不需要执行任何操作,因为此时您的实体已经绑定(bind)到正确的表。只需调用存储库中适当的(并且已经存在的)方法即可。
理论上,上述内容涵盖了使用 JPA 在给定数据库中创建和列出用户。
如果此时您的数据库数量有限(因此众所周知的 JNDI 数据源数量有限),您可以按照您引用的 GitHub 示例中所示的方式继续操作,方法是提供不同的 @Configuration
每个不同 DataSource
的类,每个类都具有位于单独包中的相关(相同)存储库。
您当然必须添加一些逻辑,以便您能够正确选择要用于操作的 JpaRepository
。
这将导致一些代码重复,并且只有当需求随着时间的推移保持非常简单时才能正常工作。也就是说:如果您所有的“微服务”所要做的就是创建/列出(也许删除)用户,并且随着时间的推移,数据源的数量仍然很小,那么它就可以工作,因为每个新的数据源都需要您添加新的类,重新编译并重新部署微服务。
或者,尝试使用此处建议的方法: https://www.endpoint.com/blog/2016/11/16/connect-multiple-jpa-repositories-using
<小时/>但就个人而言,我会完全将 JPA 扔出窗外,因为动态配置任意 DataSource
对象并重新配置存储库以每次针对不同的 DataSource
工作并不容易> 上述解决方案将迫使您不断维护这样一个简单的应用程序。
我要做的就是坚持使用 NamedParameterJdbcTemplate
使用 JndiTemplate
对其进行初始化。示例:
void createUser(String username, String password, String database) {
DataSource ds = (new JndiTemplate()).lookup(database);
NamedParameterJdbcTemplate npjt = new NamedParameterJdbcTemplate();
Map<String, Object> params = new HashMap<>();
params.put("USERNAME", username);
params.put("PASSWORD", password);
npjt.execute('create user :USERNAME identified by :PASSWORD', params);
}
List<Map<String, Object>> listUsers() {
DataSource ds = (new JndiTemplate()).lookup(database);
NamedParameterJdbcTemplate npjt = new NamedParameterJdbcTemplate();
return npjt.queryForList("select * from all_users", new HashMap<>());
}
如果您的容器已定义 JNDI 数据源,则上述代码应涵盖用户的创建和用户列表。无需定义实体或存储库或其他任何东西。您甚至不必在 spring @Configuration
中定义数据源。上面的代码(您必须测试)确实是您所需要的,因此您可以将其连接到 @Controller
中并完成它。
如果您不使用 JNDI,也没有问题:您可以使用 HikariCP
定义数据源,提供附加参数作为参数。
无论您拥有多少个不同的数据源,此解决方案都将有效,并且不需要重新部署,除非您确实需要使用其功能。另外,它不需要开发人员了解 JPA,也不需要将配置分散到各处。
关于java - 使用 Spring Boot 在 Oracle、MySQL 数据库中创建用户 - Spring Data JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59319530/