有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我对Springboot和Spring Data JPA非常陌生,正在研究一个用例,需要在不同的数据库中创建用户。 应用程序将从队列接收2个输入——用户名和数据库名。 使用它,我必须在给定的数据库中配置给定的用户。 我无法理解项目架构。 因为我需要运行的查询的格式是——创建由密码标识的用户ABC; 项目在模型类、存储库等方面应该是什么样子?因为我没有一个实际的表来运行查询,所以我需要一个模型类,因为这样就不会发生列映射

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

我一直在使用这个GitHub repo作为参考-https://github.com/jahe/spring-boot-multiple-datasources/blob/master/src/main/java/com/foobar


共 (1) 个答案

  1. # 1 楼答案

    我将在这里做一些假设:

    • 根据提供的语法,您选择的数据库是Oraclecreate user ABC identified by password
    • 您想创建并列出用户
    • 您的数据库是众所周知的,并在JNDI中定义

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


    方法1:使用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初始化它。例如:

    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中定义数据源。上面的代码(您必须测试)是您真正需要的全部代码,因此您可以将其连接到@Controller中并使用它

    如果不使用JNDI,也没有问题:可以使用HikariCP来定义数据源,并提供附加参数作为参数

    无论您拥有多少不同的数据源,这个解决方案都可以工作,并且不需要重新部署,除非您真的需要使用它的功能。此外,它不需要开发人员了解JPA,也不需要将配置分散到所有地方