dao层采用hibernate实现了,是否还需要扩展mybatis?
Order类的常用方法:
Projections类的常用方法
适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。
?
三、QBE(Query By Example)例子查询方式
?
? ?将一个对象的非空属性作为查询条件进行查询
?
?
四、DetachedCriteria:离线条件查询
?
? ?离线查询就是建立一个DetachedCriteria对象,将查询的条件等指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。
?
?
?
?
八、Query.iterator的N+1查询(基于一的HQL,多见于一对多、多对多的关联映射)
? N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题
? ?所谓的N+1是在查询的时候发出了N+1条sql语句
? ?1: 首先发出一条查询对象id列表的sql
? ?N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
* list和iterate的区别?
? ?* list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
? ?* iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题
? 示例:Query q=session.createQuery(“from UserInfo”);
? ? ?Iterator<UserInfo> list=q.iterate();
? ? ?While(list.hasNext()) {
? ? ?UserInfo st = (UserInfo) it.next();
? ? ?System.out.println(st.getName());
? ? }
避免N+1查询解决方法:
? ? 1、可以将fetch抓取数据的属性改为“join”,来避免N+1次的查询;
?
? ? 2、使用二级缓存
九、复查查询(基于二:QBC的深度查询)
?
? 复合查询就是在原有查询的基础上再进行查询,可以调用Criteria对象的createCriteria()方法在这个Criteria对象的基础上再进行查询。
?
各位看官,hibernate已经支持这么多的查询方式,如果数据库类型确定了,使用原生的sql,是否就可以取代mybatis了,而不需要再增加mybatis框架的学习成本?