Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种。但是细分可以有如下几种:
一、HQL查询方式
这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。
###注意:
在hql中关键字不区分大小写,但是属性和类名区分大小写
适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。
二、QBC(Query By Criteria) 查询方式
这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:
Order类的常用方法:
方法名称 |
描述 |
Order.asc | 升序 |
Order.desc | 降序 |
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框架的学习成本?
相关推荐
"spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目"是针对这种需求的一个解决方案,旨在提供一种灵活且动态的数据源切换机制。 首先,Spring框架作为Java领域中最受欢迎的应用框架之一,其强大...
在IT行业中,构建高效、可扩展的Web应用是至关重要的,而Spring MVC、Hibernate和MyBatis这三大框架的整合正是实现这一目标的有效途径。本文将深入探讨如何将这三个强大的工具集成为一个统一的工作流,以优化Java ...
这些代码可以直接集成到你的项目中,只需要调整为匹配你的数据库配置,就可以实现Spring Boot 2下的多数据源支持,同时利用Hibernate和MyBatis的优势。 总之,多数据源的实现是Spring Boot 2应用中的高级特性,它...
整合这些框架时,我们需要配置相关的XML文件,例如Spring的beans.xml、Struts的struts.xml、Hibernate的hibernate.cfg.xml和MyBatis的mybatis-config.xml。在Spring中,我们需要配置数据源、SessionFactory或...
这样,不同的DAO实现可以根据不同的数据库技术(如JDBC、Hibernate、MyBatis等)来提供具体的实现。 在实现DAO层时,我们经常使用模板方法模式,将通用的数据库操作逻辑(如打开连接、关闭连接)封装在父类中,而...
在Java中,我们可以使用JDBC或者ORM框架(如Hibernate、MyBatis)来实现DAO层。 3. **Service层(业务层)**: Service层是整个应用的核心,它包含了具体业务逻辑的实现。Service层通常会调用DAO层来完成数据的...
在IT行业中,集成多种框架是常见的开发模式,以实现高效、灵活和可扩展的应用程序。本例子中的"Spring3+Struts2+Hibernate4+Mybatis整合的一个maven例子"就是一个典型的Java Web项目架构,它结合了四个核心的开源...
在IT行业中,SpringMVC、Hibernate和MyBatis是三个非常重要的框架,分别负责Web层、持久层和数据访问层的处理。它们的整合能够构建出高效、灵活且可维护的Java Web应用。下面将详细讲解这三个框架的核心概念、如何...
ORM(Object-Relational Mapping)框架如Hibernate、MyBatis等,简化了DAO层的开发,通过配置文件或注解将Java对象映射到数据库表,减少了手动编写SQL的工作量。 5. 事务管理 在DAO层,通常需要处理事务边界,...
《小鸟租房系统:Hibernate、MyBatis与Struts2的集成实践》 在软件开发领域,尤其是Web应用中,框架的选用对项目的高效实施至关重要。本文将以“小鸟租房系统”为例,详细介绍如何利用Hibernate、MyBatis和Struts2...
而映射文件的作用相当于定义Dao接口的实现类,这也是使用MyBatis时需要编写的最多的文件类型。 MyBatis的操作通常会涉及到SqlSession对象,它代表了和数据库的一次会话。使用SqlSession时需要注意,它的实例不是...
7. **优化与扩展**:虽然反向生成的代码满足了基本需求,但往往还需要根据项目的具体情况进行调整和优化。例如,可能需要添加事务控制、增加复杂的查询条件或者优化SQL性能。因此,开发者在使用生成的代码时,应结合...
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan ...
3. 易于扩展:如果需要添加新的数据库操作,只需在泛型接口中添加新方法,而不需要修改所有具体的DAO实现。 然而,泛型通用DAO也存在局限性,如上述描述所示,它通常只适用于单表操作,对于复杂的关联查询和多表...
对于复杂的查询,DAO层可以利用预编译的SQL(PreparedStatement)或者ORM框架(如Hibernate, MyBatis)来提高性能和防止SQL注入。 7. **单元测试** 由于DAO层是低级别的数据访问层,所以很容易编写单元测试。使用...
然后创建UserDAOImpl类,实现这些方法,使用JDBC或ORM框架(如Hibernate、MyBatis)来操作数据库。 4. **创建实体类**:定义User实体类,与数据库表结构相对应。 5. **实现Servlet**:创建UserControllerServlet,...
在实际开发中,DAO层的实现不仅需要关注数据库操作,还要考虑到性能、扩展性和维护性。例如,可以使用连接池来优化数据库连接,使用缓存提高数据读取速度,或者引入CQRS(命令查询责任分离)等高级设计原则,使代码...
本案例主要探讨如何利用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate以及MyBatis,结合MySQL数据库,实现一个跨数据源的分布式事务解决方案。 首先,Spring Boot是一个基于Spring框架的快速开发...
7. **编写 DAO 接口及实现**:定义数据访问接口,并提供具体的实现方法。 8. **编写测试类**:编写单元测试类验证数据操作的正确性。 #### 二、开发示例 **2.1 新建项目** - 在开发工具中选择“新建” -> “Java ...
在给定的标题“javaSE-day11-day12--主要实现了购物系统的dao层和service层”中,我们可以看到开发者在这两天的学习中重点集中在了系统的核心部分——数据访问对象(DAO)层和服务(Service)层的实现。 **数据访问...