下面是关于Spring Boot整合JPA使用多个数据源的详细步骤和示例。
一、添加相关依赖
首先,需要在pom.xml文件中添加相关的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
其中,spring-boot-starter-data-jpa是Spring Boot与JPA整合的依赖,HikariCP是连接池的依赖,mysql-connector-java是连接MySQL数据库的依赖。
二、添加配置文件
接下来,在src/main/resources目录下添加application.yml或application.properties配置文件,分别对应YAML和Properties两种配置文件格式。以下是application.yml文件的样例:
datasource:
primary:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
username: root
password: root
secondary:
url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf8
username: root
password: root
spring:
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
dialect: org.hibernate.dialect.MySQL5Dialect
以上配置文件示例中,定义了两个数据源,分别是primary和secondary,都是连接的MySQL数据库。其中,spring.jpa.hibernate.ddl-auto用于定义jpa的建表策略,可以设置为create、update、create-drop等多种策略。
三、创建JPA实体类
在src/main/java/com/example/demo/entity目录下,创建两个JPA实体类,分别对应两个数据源:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
// getter and setter...
}
@Entity
@Table(name = "user", catalog = "test2")
public class User2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
// getter and setter...
}
以上示例中,创建了两个实体类User和User2,对应两个不同的数据源。
四、创建Repository
在src/main/java/com/example/demo/dao目录下,为每个数据源创建对应的Repository,如下所示:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
@Repository
public interface UserRepository2 extends JpaRepository<User2, Long> {
}
以上示例中,创建了两个Repository,分别对应User和User2实体类。
五、创建Service
接下来,创建Service层实现,用于注入对应的Repository并执行相应的业务逻辑。以下是示例代码:
@Service
@Transactional(transactionManager = "primaryTransactionManager")
public class UserService {
@Autowired
private UserRepository userRepository;
public User save(User user) {
return userRepository.save(user);
}
}
@Service
@Transactional(transactionManager = "secondaryTransactionManager")
public class UserService2 {
@Autowired
private UserRepository2 userRepository;
public User2 save(User2 user) {
return userRepository.save(user);
}
}
以上示例中,创建了两个Service实现,分别对应两个数据源,每个Service中注入对应数据源的Repository,并实现相应的业务逻辑。
六、创建Controller
最后,创建Controller,用于处理各种请求。以下是示例代码:
@RestController
public class UserController {
@Autowired
private UserService userService;
@Autowired
private UserService2 userService2;
@GetMapping("/save")
public String save() {
User user = new User();
user.setName("张三");
user.setAge(30);
userService.save(user);
User2 user2 = new User2();
user2.setName("李四");
user2.setAge(40);
userService2.save(user2);
return "success";
}
@GetMapping("/find")
public String find() {
List<User> userList = userService.findAll();
List<User2> user2List = userService2.findAll();
return "userList:" + userList.toString() + ", user2List:" + user2List.toString();
}
}
以上示例中,创建了一个Controller,注入对应数据源的Service,分别处理/save和/find的请求,并调用对应的Service执行相应的业务逻辑。
示例1:使用JdbcTemplate操作第二个数据源
除了使用JPA方式操作数据源,还可以使用JdbcTemplate的方式操作数据源。以下是示例代码:
@Configuration
public class JdbcConfig {
@Bean(name = "secondaryJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
@Repository
public class UserRepository3 {
@Autowired
@Qualifier("secondaryJdbcTemplate")
private JdbcTemplate jdbcTemplate;
public int insert(User2 user) {
String sql = "insert into user(name, age) values(?, ?)";
return jdbcTemplate.update(sql, user.getName(), user.getAge());
}
}
以上示例中,创建了一个JdbcConfig配置类,注入第二个数据源的JdbcTemplate。同时,为第二个数据源新增了一个Repository实现,使用JdbcTemplate完成新增操作。
示例2:使用Mybatis操作第二个数据源
除了使用JPA和JdbcTemplate方式操作数据源,还可以使用Mybatis来操作数据源。以下是示例代码:
@Mapper
public interface UserMapper {
@Insert("insert into user(name, age) values(#{name}, #{age})")
int insert(User user);
}
@Repository
public class UserRepository4 {
@Autowired
private SqlSessionFactory sqlSessionFactory;
public int insert(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.insert(user);
}
}
以上示例中,创建了一个UserMapper接口,使用注解的方式映射SQL语句。同时,为第二个数据源新增了一个Repository实现,使用Mybatis完成新增操作。特别地,需要注入SqlSessionFactory,并通过getMapper方法得到Mapper的实现,并完成相应的操作。
通过上述几个步骤,我们就可以实现在Spring Boot项目中,同时使用多个数据源进行开发。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot整合JPA使用多个数据源的方法步骤 - Python技术站