JPA和MyBatis各有各的好处,混合食用效果更佳。(hibernate是面向对象的,而MyBatis是面向关系的)
# Spring配置
spring:
datasource:
type: org.springframework.jdbc.datasource.DriverManagerDataSource
url: jdbc:mysql://127.0.0.1:3306/jpa?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: ******
driver-class-name: com.mysql.cj.jdbc.Driver
#配置 Jpa
jpa:
hibernate:
ddl-auto: update
# SQL语句打印
show-sql: true
# 配置方言
database-platform: org.hibernate.dialect.MySQL5Dialect
# MyBatis
mybatis:
# 配置包别名
typeAliasesPackage: com.demo.mybatisjpa.entity
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/*Mapper.xml
configuration:
# 下划线转驼峰命名法
map-underscore-to-camel-case: true
# 打印日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
/**
* 用户类
*/
@Data
@Entity
public class User implements Serializable {
/**
* 主键id 【自增长】
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 用户名
*/
@Column
private String userName;
/**
* 年龄
*/
@Column
private Integer age;
public User(String userName, Integer age){
this.userName = userName;
this.age = age;
}
}
public interface UserDao extends BaseDao<User,Long> {
/**
* 注意需要添加default进行默认实现,
* 这也是使用此方式,jpa实现与mybatis的一个差异
* statement参数是xml的namespace与id中间一个点分隔
*/
default List<User> getUserList(){
return getList("User.selectUserList");
}
}
/**
* jpa会将所有继承 Repository的类进行代理实例化,加上注解就不会
*/
@NoRepositoryBean
public interface BaseDao<T,ID> extends JpaRepository<T,ID> {
/**
* 通过spring容器获取SqlSessionTemplate
*/
SqlSessionTemplate instance = SpringUtils.getBean(SqlSessionTemplate.class);
/**
* 定义默认实现的接口方法
* 通过 SqlSessionTemplate 去实现mybatis的使用调用
*
* @param statement 表示xml文件中的名称(唯一)【namespace+id】
* @return 返回执行结果
*/
default List<T> getList(String statement) {
return instance.selectList(statement);
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="User">
<select id="selectUserList" resultType="User">
select id, user_name,age from user
</select>
</mapper>
@SpringBootTest
class MybatisJpaApplicationTests {
@Autowired
private UserDao userDao;
/**
* jpa 测试
*/
@Test
void jpaTest() {
User user = new User("张三", 22);
userDao.save(user);
}
/**
* mybatis测试
*/
@Test
void MybatisTest() {
//调用getUserList方法
List<User> userList = userDao.getUserList();
System.out.println(userList);
}
}
Spring自动处理事务问题,一般情况下这样同时用是没问题的。
但是如果JPA的接口和MyBatis的接口方法存在依赖,并且数据库表存在外键的情况下,可能会出问题。
遇到的时候自然就知道了,这时候可以统一用JPA或MyBatis。
作者:Teddy (公众号:鸡仓故事汇)
ok!到这里就大功告成,小编(Teddy)在这里先感谢大家的到来。
虽然不是太详细,小编已经很努力,给小编来个一键三连(点赞,关注,收藏),小编会越来越努力。。。