加入收藏 | 设为首页 | 会员中心 | 我要投稿 武陵站长网 (https://www.50888.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

java - 使用Spring Boot在Oracle

发布时间:2022-12-08 14:34:51 所属栏目:MySql教程 来源:未知
导读: 我是Springboot和Spring Data JPA的新手,正在研究一个用例,该用例需要在不同的数据库中创建用户。
该应用程序将从队列接收2个输入-用户名和数据库名称。
使用此方法,我必须在给定的数据

我是Springboot和Spring Data JPA的新手,正在研究一个用例,该用例需要在不同的数据库中创建用户。

该应用程序将从队列接收2个输入-用户名和数据库名称。

使用此方法,我必须在给定的数据库中设置给定的用户。

我无法理解项目架构。

由于我需要运行的查询将采用以下格式-创建由密码标识的用户ABC;

在模型类,存储库等方面,项目的外观如何?由于我没有要针对其运行查询的实际表,因此我需要一个模型类,因为这样就不会发生任何列映射。

TLDR-帮助构造Springboot-Spring Data JPA应用程序,该应用程序配置有多个数据源,以运行以下格式的查询:创建由密码标识的用户

我一直在使用此GitHub存储库作为参考-

最佳答案

我将在此处进行一些假设:

根据提供的语法,您选择的数据库为Oracle:create user ABC identified by password

您要创建并列出用户

您的数据库是众所周知的,并在JNDI中定义

不幸的是,我不能仅仅提供代码,因为设置代码会花费我一些时间,但是我可以为您提供要点。

方法1:使用JPA

首先,创建一个User实体和相应的UserRepository。将实体绑定到all_users表。主键可能是USERNAME或USER_ID列...但是这并不重要,因为您不会在该表中进行任何插入。

要创建用户,请在您自己的UserRepository中添加专用方法,以在@NativeQuery批注中指定用户创建查询。它应该开箱即用。

列出用户mysql数据库,您无需执行任何操作,因为此时您的实体已绑定到正确的表。只需在存储库中调用适当的(并且已经存在)方法即可。

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

如果此时数据库数量有限(因此,有限数量的知名JNDI数据源),则可以按引用的GitHub示例所示进行操作,方法是为每个不同的@Configuration提供不同的DataSource类,每个都具有相关的(相同的)存储库,这些存储库位于单独的程序包中。

当然,您将必须添加一些逻辑,这些逻辑将允许您适当地选择JpaRepository用于操作。

这将导致某些代码重复,并且仅在需求随时间推移保持非常简单的情况下才能正常工作。也就是说:如果您所有的“微服务”都需要做的就是创建/列出(甚至删除)用户,并且随着时间的推移数据源的数量仍然很少,那么这是可行的,因为每个新的数据源都需要您添加新的类,重新编译并重新部署微服务。

或者,尝试使用此处提出的方法:

但是,就我个人而言,我会完全抛弃JPA,因为除了动态地配置任意DataSource对象并重新配置存储库以使其每次针对不同的DataSource进行工作之外,这都很容易,并且上述解决方案将迫使您不断进行此类维护。一个简单的应用程序。

我会坚持使用NamedParameterJdbcTemplate通过使用JndiTemplate对其进行初始化。例:

void createUser(String username, String password, String database) {
    DataSource ds = (new JndiTemplate()).lookup(database);
    NamedParameterJdbcTemplate npjt = new NamedParameterJdbcTemplate();
    Map params = new HashMap<>();
    params.put("USERNAME", username);
    params.put("PASSWORD", password);
    npjt.execute('create user :USERNAME identified by :PASSWORD', params);
}
List> 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,也不需要将配置散布到各处。

(编辑:武陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!