最近,项目正在逐渐从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还是十分方便的。
当想要放弃时,就想想你现在所得到的,所拥有的,都是你付出了无数汗水才得来的,你又怎能轻言放弃