java - 使用 Spring Boot 在 Oracle、MySQL 数据库中创建用户 - Spring Data JPA

标签 java spring spring-boot spring-data-jpa

我对 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 表。主键可能是USERNAMEUSER_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/

相关文章:

maven-2 - java-6-openjdk 中的 javax.persistence

java - 类需要一个 main 方法吗?

java - 如何在 Spring 的秒 0 之前启动 quartz 调度程序?

Spring <窗体 :password> does not remember the value in multiform wizard

java - 如何使用maven生成JAR

java - 如何对泛型类型列表进行 instanceof 检查?

java - 对元素使用 Switch 而不是 if/elseif

spring - 使用 Spring 3.0.5 和 Jackson 向 Tomcat 发出 JSON PUT 请求时出现 403

java - 如何在 Spring Boot 中安排延迟增加的任务?

spring - Kubernetes Secret 和 Spring Boot 配置