繁体   English   中英

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

[英]Create users in Oracle, MySQL databases using Springboot - 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 ,基于提供的语法: create user ABC identified by password
  • 您要创建和列出用户
  • 您的数据库是众所周知的,并在 JNDI 中定义

不幸的是,我不能只提供代码,因为设置它需要我做一些工作,但我可以给你它的要点。


方法一:使用JPA

  • 首先,创建一个User实体和一个对应的UserRepository 将实体绑定到all_users表。 主键可能是USERNAMEUSER_ID列......但这并不重要,因为您不会对该表进行任何插入。
  • 要创建用户,请向您自己的UserRepository添加专用方法,在@NativeQuery注释中指定用户创建查询。 它应该是开箱即用的。
  • 要列出用户,您不需要做任何事情,因为此时您的实体已经绑定到正确的表。 只需在您的存储库中调用适当的(并且已经存在的)方法。

以上理论上涵盖了使用 JPA 在给定数据库中创建和列出用户。

如果此时您的数据库数量有限(因此众所周知的 JNDI 数据源数量有限),您可以按照您引用的 GitHub 示例中所示继续操作,为每个不同的DataSource提供不同的@Configuration类,每个类都有相关(相同)存储库位于单独的包中。

您当然必须添加一些逻辑,以允许您适当地选择要用于操作的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,也不需要将配置散布到各处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM