当前位置: 首页 > 知识库问答 >
问题:

使用Spring Data JDBC和CrudRepository接口实现多数据源

葛宏爽
2023-03-14

我有一个重要的问题:

    null

这是一个简单的4步过程:

  1. 定义属性
  2. 定义您的实体
  3. 定义扩展CrudRepository和
  4. 的接口
  5. 使用该接口

但是在使用两个数据库的情况下,有一个5。必须定义@configuration类的步骤。

 <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
## D1
datasource.db1.driverClassName=...
datasource.db1.username=...
datasource.db1.password=...
datasource.db1.jdbcUrl=...
## D2
datasource.db2.driverClassName=...
datasource.db2.username=...
datasource.db2.password=...
datasource.db2.jdbcUrl=...
@Table("STUDENT_TABLE")
public class Student{
    @Id
    @Column("MAT_NR")
    private BigDecimal matNr;

    @Column("NAME")
    private String name;
}
@Table("TEACHER_TABLE")
public class Teacher{
    @Id
    @Column("EMPLOYEE_NR")
    private BigDecimal employeeNr;

    @Column("NAME")
    private String name;
}
@Repository
public interface StudentRepository extends CrudRepository<Student, BigDecimal> {}
@Repository
public interface TeacherRepository extends CrudRepository<Teacher, BigDecimal> {}
  • 您也可以在一门课上同时上两门课,但我是这样做的:

db1config.java

@Configuration
public class Db1Config {
    @Primary
    @Bean("db1DataSource")
    @ConfigurationProperties("datasource.db1")
    public DataSource db1DataSource() {
        return DataSourceBuilder.create().build();
    }
}

java db2config.java

@Configuration
public class Db2Config {
    @Bean("db2DataSource")
    @ConfigurationProperties("datasource.db2")
    public DataSource db2DataSource() {
        return DataSourceBuilder.create().build();
    }
}
@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired @Qualifier("studentRepository") StudentRepository studentRepository
    @Autowired @Qualifier("teacherRepository") TeacherRepository teacherRepository 

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        studentRepository.findById(30688).ifPresent(System.out::println); // DB1
        teacherRepository.findById(5).ifPresent(System.out::println); // DB2
    }
}

谢谢你的帮助。

共有1个答案

何超英
2023-03-14

类似于Rimidal,我不相信这行得通。这里的文档表明您需要一个NamedParameterJdbcOperations Bean和一个TransactionManager Bean(可选)。https://docs.spring.io/spring-data/jdbc/docs/current/reference/html" target="_blank">html/#jdbc.java-config

NamedParameterJdbcOperations是CrudRepositories将用于访问数据库的JDBCTemplate。

似乎没有一种方法可以将不同名称的ParameterJDBCOperations/JDBCTemplates与不同的存储库关联起来。在我的测试中,这无论如何都不起作用。无论哪个命名的ParameterJDBCOperations Bean被标记为@Primary都是所有CrudRepository操作都要执行的操作,而不考虑将内容分离到不同的包中,并明确地告诉@Configuration类将哪些包与@EnableJDBCrepositories一起使用。

 类似资料:
  • 我需要创建一个实现接口的类吗?如果是,如何实施?有什么例子吗?或者我只是把它留空然后Spring来做这些工作? 我使用以下简单代码进行尝试: loginbean.java 但我得到 更新 好的,我发现了问题,是因为我的autowired accountRepository是空的,你知道吗?

  • 他能给我建议和解决方案。非常感谢。请帮帮我!

  • 本文向大家介绍使用mock.js随机数据和使用express输出json接口的实现方法,包括了使用mock.js随机数据和使用express输出json接口的实现方法的使用技巧和注意事项,需要的朋友参考一下 前端项目都会用到后端的接口,但当后台接口没有写好的时候,这时候可以用mock.js先随机生成一些假数据来调试页面 安装mock.js 先用express创建一个nodejs的web项目,名字假

  • 我必须使用任何额外的关键字的id Param吗?什么是“!”签名里的刻薄?

  • 我有一个实现两个接口的bean。准骨骼代码如下: 在AppConfig中,我指定了以下内容: 解决办法是引入一个扩展和的新接口,然后让实现它。但是,我不愿意因为框架的限制而改变我的设计。

  • 我试图实现Comparable和compareTo(),但似乎无法实现。我一直在尝试不同的方法,但我真的不明白。我知道我应该实现可比较的接口,并且我需要在使用它之前创建方法(对我来说很奇怪,从python到面向对象编程)。 我希望它能比较两个人的年龄,所以我试着编写如下所示的代码,但似乎我不能使用compareTo()。我收到错误消息:“此方法必须返回int类型”,但在我看来,我只返回1、-1和0