HibernateUtil类:
package sun.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static HibernateUtil instance = new HibernateUtil();
private SessionFactory sf;
private HibernateUtil() {
Configuration cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
public static HibernateUtil getInstance() {
return instance;
}
public Session getSession() {
return sf.openSession();
}
}
测试类:
package sun.test;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.jdbc.Work;
import org.junit.Test;
import sun.domain.Employee;
import sun.util.HibernateUtil;
public class TestHibernateSession {
private HibernateUtil util;
@Test
public void testSessionCache() {
Session session = HibernateUtil.getInstance().getSession();
Employee e = (Employee) session.get(Employee.class, 1L);
Employee e1 = (Employee) session.get(Employee.class, 1L);
/*
* 仅仅发送了一条sql : select employee0_.EMP_ID as EMP1_0_0_, employee0_.NAME
* as NAME0_0_, employee0_.EMAIL as EMAIL0_0_, employee0_.AGE as
* AGE0_0_, employee0_.BIRTH_DATE as BIRTH5_0_0_ from EMP employee0_
* where employee0_.EMP_ID=?
*
* 返回结果:true
*
* 结论:session上存在一级缓存,第二次查询的数据直接从一级缓存中查询,而不会再次发送sql语句.
*/
System.out.println(e == e1);
session.close();
}
@Test
public void testSessionClear() {
Session session = HibernateUtil.getInstance().getSession();
Employee e = (Employee) session.get(Employee.class, 1L);
// clear会直接清除一级缓存中的数据,所以第二次获取数据会重新发送sql
session.clear();
Employee e1 = (Employee) session.get(Employee.class, 1L);
System.out.println(e == e1);
session.close();
}
@Test
public void testSessionEvict() {
Session session = HibernateUtil.getInstance().getSession();
Employee e = (Employee) session.get(Employee.class, 1L);
/*
* evict将某个特定的对象从一级缓存中删除。
*
* 注意:delete方式直接删除数据库中的数据,而evict和clear只处理一级缓存中的数据.
*/
session.evict(e);
Employee e1 = (Employee) session.get(Employee.class, 1L);
System.out.println(e == e1);
session.close();
}
@Test
public void testSessionDoWork() {
Session session = HibernateUtil.getInstance().getSession();
/*
* doWork方法是我们能够拿到session上的connection,从而完成一些事情.
*
* 注意:session.connection方法功能一样,但是connection方法存在安全问题,
* 例如拿到connection后直接session已经关闭,而后便继续使用
* connection对象,就会出错。doWork方法很好的避免了这种问题。
*/
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
/*
* 必要再这里关闭连接和提交事务,而应该交给session处理
*/
}
});
session.close();
}
@Test
public void testSessionFlush() {
Session session = HibernateUtil.getInstance().getSession();
Transaction tx = session.beginTransaction();
Employee e = (Employee) session.get(Employee.class, 1L);
/*
* 发送两条sql:
*
* 1、select employee0_.EMP_ID as EMP1_0_0_, employee0_.NAME as NAME0_0_,
* employee0_.EMAIL as EMAIL0_0_, employee0_.AGE as AGE0_0_,
* employee0_.BIRTH_DATE as BIRTH5_0_0_ from EMP employee0_ where
* employee0_.EMP_ID=?
*
* 2、update EMP set NAME=?, EMAIL=?, AGE=?, BIRTH_DATE=? where EMP_ID=?
*
* 说明;如果没有调用session.flush()方法,提交事务时,即调用tx.commit()方法时,hibernate会发送一条update语句
* ,自动更新session一级缓存中的脏数据( 即已经被修改过的数据),
* 如果直接调用session.flush()方法,则在此时会发送一条update语句
* ,会直接刷新一级缓存中的脏数据到数据库,而不是提交事务时才发送update.
*/
e.setName("嘿嘿1");
System.out.println("----------before flush-----------");
session.flush();
System.out.println("----------before commit-----------");
tx.commit();
session.close();
}
@Test
public void testSessionGetIdentifier() {
Session session = HibernateUtil.getInstance().getSession();
Employee e = (Employee) session.get(Employee.class, 1L);
/*
* 获取对象的主键,从对象映射文件中获取,在自己实现二级缓存的时候有用
*/
Serializable s = session.getIdentifier(e);
System.out.println(s);
session.close();
}
@Test
public void testSessionMerge() {
Session session = HibernateUtil.getInstance().getSession();
Transaction tx = session.beginTransaction();
// Employee e = (Employee) session.get(Employee.class, 1L);
// e.setName("呵呵");
Employee e = new Employee();
e.setName("王五");
e.setAge(25);
e.setEmail("wangwu@baidu.com");
try {
e.setBirthDate(new SimpleDateFormat("yyyy-MM-dd")
.parse("1986-01-01"));
} catch (ParseException e1) {
e1.printStackTrace();
}
/*
* merge 合并,即保存或更新对象.数据库存在则更新,否则新增.
*
* 该方法功能同saveOrUpdate
*/
session.merge(e);
tx.commit();
session.close();
}
@Test
public void testSessionPersist() {
Session session = HibernateUtil.getInstance().getSession();
Transaction tx = session.beginTransaction();
Employee e = new Employee();
e.setName("赵六");
e.setAge(25);
e.setEmail("zhaoliu@gmail.com");
/*
* 功能同save,区别:如果没有开启事务,save方法任然会发送一条sql,但是没有事务最终被回滚;而persist方法如果没有开启事务,
* 不会发送sql,提高了性能(JPA的方法).
*/
session.persist(e);
tx.commit();
session.close();
}
}
增删改查:
package sun.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Before;
import org.junit.Test;
import sun.domain.Employee;
import sun.util.HibernateUtil;
public class TestHibernate extends TestHibernateSession {
private HibernateUtil util;
@Before
public void test() {
util = HibernateUtil.getInstance();
}
@Test
public void testSave() {
Session s = util.getSession();
Transaction tx = s.beginTransaction();
Employee e = new Employee();
e.setName("张三");
e.setEmail("zhangsan@126.com");
try {
e.setBirthDate(new SimpleDateFormat("yyyy-MM-dd")
.parse("2010-10-10"));
} catch (ParseException e1) {
e1.printStackTrace();
}
e.setAge(20);
// 保存
s.save(e);
tx.commit();
s.close();
}
@Test
public void testUpdate() {
Session s = util.getSession();
Transaction tx = s.beginTransaction();
Employee e = (Employee) s.get(Employee.class, 1L);
e.setName("李四");
// 更新
s.update(e);
tx.commit();
s.close();
}
@Test
public void testGet() {
Session s = util.getSession();
// 获取
Employee e = (Employee) s.get(Employee.class, 1L);
System.out.println(e);
}
@Test
public void testList() {
Session s = util.getSession();
// 查询多条数据
Query q = s.createQuery("SELECT e FROM Employee e");
@SuppressWarnings("unchecked")
List<Employee> es = q.list();
System.out.println(es);
}
}
分享到:
相关推荐
6. 集合类映射:在Java中集合是常用的,Hibernate支持集合类的映射,这部分将解释如何映射List、Set、Map等集合类型。 7. 组件映射:当一个类的属性是由其他几个类的属性组合而成时,可以使用组件映射。这部分内容...
在Hibernate中,每个Java类都可以映射为数据库中的一个表,通过注解或者XML文件进行配置。注解如@Entity、@Table、@Id等用于声明实体类和字段的数据库属性。XML文件通常命名为 "*.hbm.xml",包含类到表的映射信息。 ...
在Dao层实现通用方法时,我们可以抽象出一个基类,包含一些常用的方法,如`queryByParams`,这个方法接受一个Map参数,键对应于HQL或Criteria查询中的参数名,值则是参数的实际值。这样,不同的查询只需要传入不同的...
在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别专注于IoC(Inversion of Control,控制反转)和ORM(Object-Relational Mapping,对象关系映射)。在企业级Java应用开发中,事务处理是核心功能之一,...
通过阅读"Hibernate 3.5.2 中文API"文档,开发者可以详细了解上述各个方面的具体使用方法,包括详细的API说明、示例代码以及常见问题解答。"下载说明.htm"和"使用说明.txt"可能提供了下载和安装指南,而"使用帮助...
1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6...
- **Session接口**: 在Hibernate中,Session是执行所有数据库操作的核心接口,包括查询、保存、更新实体对象等。 - **SessionFactory**: 负责创建Session实例,是线程安全的。通常情况下,一个应用程序只需要一个...
SSH框架,全称为Spring、Struts和Hibernate,是Java Web开发中常见的三大开源框架的组合。这个框架集合提供了模型-视图-控制器(MVC)的设计模式,使得开发者能够更高效地构建动态网站和企业级应用程序。在这个组合...
这篇资料主要探讨了小码哥对Hibernate框架中查询方法的封装,虽然仅提供了4页的介绍,但足以涵盖一些基础和实用的概念。Hibernate是一个流行的Java持久化框架,它简化了数据库操作,使开发者可以更专注于业务逻辑而...
1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6...
HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...
- **Session 的角色**:解释了 Session 在 Hibernate 中的作用及其生命周期管理。 - **常用方法使用**:提供了获取 Session 实例、执行 CRUD 操作的具体方法和示例代码。 #### 十、搜索与查询 - **查询方式**:...
**Hibernate 5是一个强大的对象关系映射(ORM)框架,用于简化Java开发中的数据库操作。在本集合中,我们关注的是与Hibernate 5配合使用的jar包,特别针对MySQL数据库的连接。以下是一些关键知识点的详细说明:** 1...
在关系型数据库中,这种查询非常常见,尤其是在需要从不同表中获取关联数据的情况下。 在Hibernate中,可以使用以下几种方式来实现多表联合查询: - **HQL (Hibernate Query Language)** - **Criteria API** - **...
1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. ...
说明如何使用 Hibernate 的上下文会话功能来管理 Session 的生命周期。 #### 五、配置 **3.1 程序式配置** 介绍如何通过 Java 代码来配置 Hibernate,这种方式适用于需要动态配置的情况。 - **3.2 获取 ...
本文将详细介绍如何在Tomcat环境下配置Hibernate,并通过示例代码来具体说明配置过程中的关键点。 #### 二、配置流程概述 1. **环境搭建**:首先确保已经安装了Tomcat服务器和相应的数据库(如SQL Server)。 2. *...
在下载并解压后的"使用说明.txt"文件中,可能会包含如何将这些jar文件添加到项目的类路径、配置Hibernate的属性文件(如hibernate.cfg.xml)、创建实体类、编写映射文件(.hbm.xml)、使用Session工厂和Session进行...
CHM(Compiled HTML Help)文件是一种常见的Windows帮助文档格式,它包含了Hibernate3.2的所有公开API接口和类的详细说明。开发者可以在这里找到关于SessionFactory、Session、Query等核心接口的用法,以及Criteria...
实体类的注解是现代Hibernate开发中的常见方式,例如@Entity、@Table、@Id等,这些注解用于标记类和属性,指示它们在数据库中的对应关系。 对于数据的增删改查,Hibernate提供了方便的方法,如Session的save()和...