欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

dao层采用hibernate实现了,是否还需要扩展mybatis?  

程序员文章站 2022-07-02 17:11:53
...

Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种。但是细分可以有如下几种:

 

一、HQL查询方式

    这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。

###注意:

     在hql中关键字不区分大小写,但是属性和类名区分大小写

适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。

二、QBC(Query By Criteria) 查询方式
   这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤: 

方法名称
描述
Restrictions.eq 等于
Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
Restrictions.gt 大于
Restrictions.ge 大于等于
Restrictions.lt 小于
Restrictions.le 小于等于
Restrictions.between 对应SQL的between
Restrictions.like 对应SQL的like
Restrictions.in 对应SQL的in
Restrictions.and and关系
Restrictions.or or关系
Restrictions.sqlRestriction SQL限定查询

Order类的常用方法:

方法名称
描述
Order.asc 升序
Order.desc 降序

Projections类的常用方法

方法名称
描述
Projections.avg 求平均值
Projections.count 统计某属性的数量
Projections.countDistinct 统计某属性不同值的数量
Projections.groupProperty 指定某个属性为分组属性
Projections.max 求最大值
Projections.min 求最小值
Projections.projectionList 创建一个ProjectionList对象
Projections.rowCount 查询结果集中的记录条数
Projections.sum 求某属性的合计

适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较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框架的学习成本?