JPA和Hibernate5.2.1和Mybatis的对比

最近,项目正在逐渐从SpringMVC迁移到SpringBoot,发现原来Hibernate使用的Criteria已经被标记为淘汰,所以今天对dao中三种使用方式进行总结

### JPA

JPA的方便之处在于,如果方法名规范,可以直接映射到sql语句,缺点是有些复杂的sql语句会不太灵活

下面看一个demo

// 传入Pageable对象和quizId,返回一个Page对象
public interface QuizRepository extends JpaRepository<QuizEntity, Integer> {
    Page<QuizEntity> findByQuizId(long quizId, Pageable pageable);
}

可以看到仅仅通过命名,就直接完成了dao的操作,但是当需要进行动态拼接sql时,可能就有点力不从心,可以书写多个dao,在service进行分别调用也可以使用mybatis框架。

Hibernate

Hibernate在更新后,老得语法已经标记为淘汰,今天就来分享一下新语法的使用,下面先分享一下5.2.1的文档地址
Hibernate 5.2.1

具体的使用

@Repository
public class QuizDao {

    // 注入EntityManager
    @Resource
    private EntityManager entityManager;

    public Pair<Long, List<QuizEntity>> search(String keyword, int page, int size) {
        // 创建构造器
        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        // 设置语句查询对应的实体     
        CriteriaQuery<QuizEntity> criteria = builder.createQuery(QuizEntity.class);
        // 设置from的来源
        Root<QuizEntity> root = criteria.from(QuizEntity.class);
        // 设置查询的条件
        criteria.where(builder.ge(root.get("status"), 0));
        // 设置排序的属性
        criteria.orderBy(builder.asc(root.get("createTime")));
        TypedQuery<QuizEntity> query = entityManager.createQuery(criteria);
        // 获取总数据量
        long total = query.getResultList().size();
        // 设置第几页,和每页的数据
        query.setFirstResult((page - 1) * size);
        query.setMaxResults(size);
        List<QuizEntity> resultList = query.getResultList();
        return new Pair<>(total, resultList);
    }
}

从上面的例子看,hibernate操作还是比较繁琐的,但是语句拼接更加灵活。

MyBatis

Mybatis如同一种半自动化的框架,与Hibernate的全自动化不同,需要我们自己手动编写SQL语句,但也带来了更大的便利性

下面给出一个小demo,没有使用xml,而是直接使用了注解

@Mapper
public interface BookDao {

    String TABLE_NAME = "book";
    String ALL_FIELDS = " id, bookName, userId, coverUrl, pdfUrl, downloadCount, createTime, updateTime, status";
    String INSERT_FIELDS = " bookName, userId, coverUrl, pdfUrl, createTime, updateTime";

    /**
     * 获得所有图书,按照上传时间和分数降序排序,并进行分页
     *
     * @return 图书List
     */
    @Select({SystemUtil.SELECT, ALL_FIELDS, SystemUtil.FROM, TABLE_NAME, SystemUtil.WHERE, "status >= 0",
            " ORDER BY createTime DESC", " LIMIT #{offset}, #{rowCount}"})
    List<Book> findAll(@Param("offset") int offset, @Param("rowCount") int rowCount);
}

在项目时,我将常用的SQL关键字,抽离出来,可以防止写错,可以看出mybatis的可控性时极高的。

简单分析了几种dao框架后,如何选型就要根据我们自己的业务场景了,在简单业务中,使用JPA还是十分方便的。

当想要放弃时,就想想你现在所得到的,所拥有的,都是你付出了无数汗水才得来的,你又怎能轻言放弃

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值