关于springboot持久层框架mybatis+jpa组合使用

一、简介
JPA和MyBatis各有各的好处,混合食用效果更佳。(hibernate是面向对象的,而MyBatis是面向关系的)
  • 个人总结(总结自己的理解)
    1.表关联较多的项目,优先使用mybatis
    2.持续维护开发迭代较快的项目建议使用mybatis,因为一般这种项目需要变化很灵活,对sql的灵活修改要求较高
    3.对于传统项目或者关系模型较为清晰稳定的项目,建议JPA(比如DDD设计中的领域层)
    4.目前微服务比较火,基于其职责的独立性,如果模型清晰,可以考虑使用JPA,但如果数据量较大全字段返回数据量大的话可能在性能有影响,需要根据实际情况进行分析
二、上代码
  • 配置文件
# 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
  • User实体
/**
 *  用户类
 */
@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;
    }
}
  • UserDao.java
public interface UserDao extends BaseDao<User,Long> {

    /**
     * 注意需要添加default进行默认实现,
     *  这也是使用此方式,jpa实现与mybatis的一个差异
     *   statement参数是xml的namespace与id中间一个点分隔
     */
    default List<User> getUserList(){
        return getList("User.selectUserList");
    }
}
  • BaseDao.java
/**
 * 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);
    }
}
  • userMapper.xml (放在resources下配置文件中自己配置路径)
<?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>
  • SpringUtils.java 请自行下载: 点击下载 SpringUtils.java
  • Test测试
@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)在这里先感谢大家的到来。
虽然不是太详细,小编已经很努力,给小编来个一键三连(点赞,关注,收藏),小编会越来越努力。。。

你可能感兴趣的:(日常栏目,java,mybatis,spring,boot,mysql)