[英]How to create a simple CRUD application using Spring Data JPA and MYSQas DB using SpringBoot?
[英]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
不幸的是,我不能只提供代码,因为设置它需要我做一些工作,但我可以给你它的要点。
方法一:使用JPA
User
实体和一个对应的UserRepository
。 将实体绑定到all_users
表。 主键可能是USERNAME
或USER_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.