最近,项目正在逐渐从SpringMVC迁移到SpringBoot,发现原来Hibernate使用的Criteria已经被标记为淘汰,所以今天对dao中三种使用方式进行总结
### JPA
JPA的方便之处在于,如果方法名规范,可以直接映射到sql语句,缺点是有些复杂的sql语句会不太灵活
下面看一个demo
public interface QuizRepository extends JpaRepository<QuizEntity, Integer> {
Page findByQuizId(long quizId, Pageable pageable);
}
可以看到仅仅通过命名,就直接完成了dao的操作,但是当需要进行动态拼接sql时,可能就有点力不从心,可以书写多个dao,在service进行分别调用也可以使用mybatis框架。
Hibernate
Hibernate在更新后,老得语法已经标记为淘汰,今天就来分享一下新语法的使用,下面先分享一下5.2.1的文档地址
Hibernate 5.2.1
具体的使用
@Repository
public class QuizDao {
@Resource
private EntityManager entityManager;
public Pair> search(String keyword, int page, int size) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery criteria = builder.createQuery(QuizEntity.class);
Root root = criteria.from(QuizEntity.class);
criteria.where(builder.ge(root.get("status"), 0));
criteria.orderBy(builder.asc(root.get("createTime")));
TypedQuery query = entityManager.createQuery(criteria);
long total = query.getResultList().size();
query.setFirstResult((page - 1) * size);
query.setMaxResults(size);
List 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 findAll(@Param("offset") int offset, @Param("rowCount") int rowCount);
}
在项目时,我将常用的SQL关键字,抽离出来,可以防止写错,可以看出mybatis的可控性时极高的。
简单分析了几种dao框架后,如何选型就要根据我们自己的业务场景了,在简单业务中,使用JPA还是十分方便的。
当想要放弃时,就想想你现在所得到的,所拥有的,都是你付出了无数汗水才得来的,你又怎能轻言放弃