Hibernate日常应用的相关问题

简介:

1.在控制台中显示Hibernate打印的SQL中的参数

默认情况下,hibernate的sql中都是以问号代表参数,并没有显示参数的真实值,但是也不是做不到,只需要两步配置就可以显示出参数的真实值了:

(1)spring的配置文件中增加: 
<prop key="hibernate.show_sql">true</prop> 
或者在hibernate的配置文件中增加: 
<property name="show_sql">true</property>

(2)在log4j.properties中做如下配置: 
log4j.appender.STDOUT.Threshold=trace 
log4j.category.org.hibernate.SQL=trace 
log4j.category.org.hibernate.type=trace

2.spring进行事务控制时,何时得到session,何时开启事务,何时打开连接?

在方法开始前spring通过动态代理,利用AOP的方式,为普通要调用的方法在方法开始处添加事务控制,如果在方法中要进行save操作,则进行getSession。
在调用getSession()方法时,拿到数据库连接,如果在一个循环中多次调用save方法,因为Spring会控制在一个事务中只有同一个Session,

所以跟数据库的连接也只有一次,所以如果循环保存一个list,在service层循环和在Dao层循环都是一样的(spring事务是加在service层的情况)。

3.Hibernate delete操作的理解

delete()方法用于从数据库中删除与Java对象对应的记录。如果传入的参数是持久化对象,Session就计划执行一个delete语句。
如果传入的参数是游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一个delete语句。
值得注意的是,Session只有在清理缓存的时候的才执行delete语句。
此外,只有当调用Session的close()方法时,才会从Session的缓存中删除该对象。

例如以下代码先加载一个持久化对象,然后通过delete()方法将它删除:

1
2
3
4
5
6
7
Session session1 = sessionFactory.openSession();
Transaction tx1 = session1.beginTransaction();
// 先加载一个持久化对象
Customer customer = (Customer)session.get(Customer. class new  Long( 1 ));
session.delete(customer);  // 计划执行一个delete语句
txt1.commit();  // 清理缓存,执行delete语句
session.close();子 // 从缓存中删除Customer对象

以下代码直接通过delete()方法删除一个游离对象:

1
2
3
4
5
6
7
Session session2 = sessionFactory.openSession();
Transaction tx2 = session1.beginTransaction();
// 假定customer是一个游离对象,先使它被Session关联,使它变为持久化对象,
// 然后计划执行一个delete语句
session2.delete(customer);
tx2.commit();  // 清理缓存,执行delete语句
session2.close();  // 从缓存中删除customer对象 

如果希望删除多个对象,可以使用另一种重载形式的delete()方法:

1
session.delete( "from Customer as c where c.id>8" );

以上delete()方法的参数为HQL查询语句,delete()方法将从数据库中删除所有满足查询条件的记录。

4.Hibernate的几种查询方式

1.     使用HQL语句

Query q = session.createQuery("select e from com.sun.demo.Emp e");

2.     使用Load方法(主键查询)

Emp e = (Emp)session.load(Emp.class, 1141);

3.     使用get方法(主键查询)

Emp e = (Emp)session.get(Emp.class, 1141);

4.     参数化查询(使用?通配符,或者命令通配符)

1
2
3
4
5
6
7
8
Query q = session.createQuery( "update Userinfo set ename='AAA' WHERE ename=?" );
        q.setParameter( 0 "SMITH" );
 
Query q = session.createQuery( "update Userinfo set ename='AAA' WHERE ename like ?" );
        q.setParameter( 0 "%M%" );
 
Query q = session.createQuery( "update Userinfo set ename='AAA' WHERE ename like :lkename" );
        q.setParameter( "lkename" "%L%" );

  

5.     命名查询

1
2
3
4
5
< query  name="myquery">
 
  <![CDATA[ from com.sun.hibernate.Employer where job = ?]]>
 
</ query >

  

1
2
Query q = session.getNamedQuery( "myquery" );
q.setParameter( 0 "MANAGER" );

6.     属性查询

Query q = session.createQuery("select max(sal) from Employer e where sal is not null");

Query q = session.createQuery("select distinct job from Employer e");

7.     实例化查询

步骤如下:

1.编写你的HQL语句

2.创建普通的Java类 -------------------与POJO类不同,它与数据库没有任何关系

3.在该java类中你需要创建和查询结果对应的字段

4.在该java类中,你需要创建合适的构造函数

5.完善你的HQL语句,使用实例化查询的方式进行包装

6.通过list.get(i)获取的结果就不再是一个数组,而是一个包装后的对象

例子:

1
2
3
4
5
6
7
Query q = session.createQuery( "SELECT new com.sun.demo.UserDate(ename,SYSDATE) FROM Userinfo" );
List list = q.list();
for ( int  i= 0 ;i<list.size();i++){
        UserDate u = (UserDate)list.get(i);
        System.out.println(u.getEname());
 
}

  

8.     多态查询

对于pojo来说,java中的这种关系被扩展到了数据库表中

hibernate在查询一个表的同时,会检查该表所对应的POJO类有没有子类,如果有,一起查询出来

9.     分页查询

//查询第三到五条

              q.setFirstResult(3);//从第三条开始

              q.setMaxResults(3);//提取三条

10.  uniqueResult方法查询(查询结果只能是一个字段)

Query q = session.createQuery("select count(*) from Employer");

Long count = (Long)q.uniqueResult();

11.  Criteria查询(通过面向对象化的设计,将数据查询条件封装为一个对象)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Criteria c = session.createCriteria(Employer. class );
 
        c.addOrder(Order.asc( "sal" ));       //按薪水升序查询
 
        c.setFirstResult( 3 );
 
        c.setMaxResults( 3 );
 
        List list = c.list();
 
        for ( int  i= 0 ;i<list.size();i++){
 
            Employer emp = (Employer)list.get(i);
 
            System.out.println(emp.getEname() +  " : "  + emp.getSal());
 
        }

  


目录
相关文章
|
10天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
24 3
|
19天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
12 1
|
3月前
|
Java 数据库连接 缓存
Hibernate性能调优:五大秘籍,让应用效能飙升,告别慢如蜗牛的加载,体验丝滑般流畅!
【8月更文挑战第31天】本文深入探讨了提升Hibernate应用性能的五大技巧,包括选择合适的缓存策略、优化查询语句、合理使用Eager与Lazy加载、批量操作与事务管理以及利用索引和数据库优化。通过正确配置多级缓存、分页查询、延迟加载、批量处理及合理创建索引,能够显著提高应用响应速度与吞吐量,改善用户体验。这些技巧需根据具体应用场景灵活调整,以实现最佳性能优化效果。
167 0
|
3月前
|
Java 数据库连接 数据库
强强联手!JSF 与 Hibernate 打造高效数据访问层,让你的应用如虎添翼,性能飙升!
【8月更文挑战第31天】本文通过具体示例详细介绍了如何在 JavaServer Faces (JSF) 应用程序中集成 Hibernate,实现数据访问层的最佳实践。首先,创建一个 JSF 项目并在 Eclipse 中配置支持 JSF 的服务器版本。接着,添加 JSF 和 Hibernate 依赖,并配置数据库连接池和 Hibernate 配置文件。然后,定义实体类 `User` 和 DAO 类 `UserDAO` 处理数据库操作。
60 0
|
5月前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
【6月更文挑战第25天】在Java持久层,Hibernate与JPA提供ORM及数据库操作简化。JPA是EE规范,定义ORM接口;Hibernate是其实现,功能丰富。在一个在线书店项目中,使用@Entity标注实体类如Book,通过JpaRepository接口(如BookRepository)进行数据访问。服务层调用仓库接口方法,如搜索书籍。当需自定义查询时,可使用JPQL或SQL。Spring的@Transactional注解处理事务管理,展示出高效开发流程。
46 0
|
5月前
|
Java 数据库连接 API
数据库与Java的无缝对接:Hibernate与JPA的集成与应用
【6月更文挑战第25天】Java企业级应用中,Hibernate和JPA是ORM主流框架。JPA是标准API,定义对象-关系映射规范,强调标准化和可移植性。Hibernate是JPA的具体实现,扩展了更多功能,如强大的查询语言和缓存机制。两者集成允许开发者利用Hibernate性能,通过JPA注解保持代码规范。示例展示了如何使用JPA注解定义实体和Hibernate执行查询,实现数据库操作。这种方式提升了开发效率和应用质量。
67 0
|
5月前
|
缓存 Java 数据库连接
Java开发者必备:Hibernate与JPA在企业级应用中的最佳实践
【6月更文挑战第25天】Java企业开发常用Hibernate和JPA,两者通过ORM简化数据库操作,提升开发效率。它们支持复杂查询,具有良好的可扩展性。最佳实践中,应注意映射配置的合理性,优化查询性能,利用缓存提升性能,以及妥善管理事务。示例代码展示了使用JPA进行分页查询的方法。
46 0
|
5月前
|
SQL Java 数据库连接
Java持久化革命:Hibernate与JPA的实战应用
【6月更文挑战第25天】Java世界中,JPA作为ORM规范简化了数据库交互,而Hibernate是其实现者。通过引入依赖、定义注解实体类、配置 Hibernate,开发者能便捷地进行数据操作。Hibernate的使用减少了手动SQL的需求,提升了开发和维护效率,展示了其在持久化技术中的革命性影响和价值。
34 0
|
开发框架 缓存 安全
Hibernate Validator的应用实践
Hibernate Validation目前最新的稳定版本是:5.1.3。 下载地址 官网地址 官方英文使用手册 官方中文使用手册地址 (中文版目前最新的是4.3版本) 具体用法可以参考官方文档。
238 0
|
SQL 存储 数据可视化
Java Web之Hibernate的高级应用(数据库实体关联之间的映射规则、实体继承关系映射、Hibernate查询语言)
Java Web之Hibernate的高级应用(数据库实体关联之间的映射规则、实体继承关系映射、Hibernate查询语言)
187 0
Java Web之Hibernate的高级应用(数据库实体关联之间的映射规则、实体继承关系映射、Hibernate查询语言)