JPA和MyBatis各有各的好处,混合食用效果更佳。
根据前面的博文《Spring Boot2集成JPA》和《SpringBoot2集成MyBatis》,我们已经知道怎么分别集成JPA和MyBatis,两者一起集成也简单。
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/test
username: postgres
password: postgres
jpa:
properties:
hibernate:
hbm2ddl:
auto: update
dialect: org.hibernate.dialect.PostgreSQLDialect
temp:
use_jdbc_metadata_defaults: false
show-sql: true
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
type-aliases-package: com.wu.parker.jpamybatis
package com.wu.parker.jpamybatis.service.impl;
import com.wu.parker.jpamybatis.dao.UserMapper;
import com.wu.parker.jpamybatis.dao.UserRepository;
import com.wu.parker.jpamybatis.po.User;
import com.wu.parker.jpamybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author: wusq
* @date: 2018/11/28
*/
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private UserMapper userMapper;
@Override
public void testTransaction() {
User user1 = new User();
user1.setUsername("admin");
user1.setPassword("admin");
userRepository.save(user1);
User user2 = new User();
user2.setId("2");
user2.setUsername("test");
user2.setPassword("test");
userMapper.save(user2);
// 抛出异常则全部回滚,不会保存到数据库
// throw new RuntimeException();
}
}
package com.wu.parker.jpamybatis.test;
import com.wu.parker.jpamybatis.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @author: wusq
* @date: 2018/11/28
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void contextLoads() {
}
@Test
public void testTransaction() throws Exception {
userService.testTransaction();
}
}
Spring自动处理事务问题,一般情况下这样同时用是没问题的,但是如果JPA的接口和MyBatis的接口方法存在依赖,并且数据库表存在外键的情况下,可能会出问题,遇到的时候自然就知道了,这时候可以统一用JPA或MyBatis。