hibernate-api详解

hibernate-api详解

一、Configuration配置对象

Configuration用来读取hibernate.cfg.xml和User.hbm.xml两个配置文件

 

hibernate 核心配置文件种类

       hibernate.cfg.xml 通常使用xml配置文件,可以配置内容更丰富。

       hibernate.properties 用于配置key/value 形式的内容,key不能重复的。配置有很多的局限性。一般不用。

              参考文件:hibernate-distribution-3.6.10.Final\project\etc\ hibernate.properties

                     提供了核心配置文件常用的配置项,及选择参数。

 

hibernate.cfg.xml详解:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<!-- property 元素用于配置Hibernate中的属性
			键:值 
		  -->
		  <!-- hibernate.connection.driver_class : 连接数据库的驱动  -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		  <!-- hibernate.connection.username : 连接数据库的用户名 -->
		<property name="hibernate.connection.username">root</property>
		  <!-- hibernate.connection.password : 连接数据库的密码 -->
		<property name="hibernate.connection.password">1234</property>
		  <!-- hibernate.connection.url : 连接数据库的地址,路径 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/EE19Day01</property>
		
		<!-- show_sql: 操作数据库时,会 向控制台打印sql语句 -->
		<property name="show_sql">true</property>
		<!-- format_sql: 打印sql语句前,会将sql语句先格式化  -->
		<property name="format_sql">true</property>
		<!-- hbm2ddl.auto: 生成表结构的策略配置
			 update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构. 
			 		如果存在表结构,并且表结构与实体一致,那么不做修改
			 		如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.
			 create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
			 create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
			 validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.
		  -->
		<property name="hbm2ddl.auto">update</property>
		
		<!-- 数据库方言配置 
		 org.hibernate.dialect.MySQLDialect (选择最短的)
		 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		
		
		<!-- hibernate.connection.autocommit: 事务自动提交  -->
		<property name="hibernate.connection.autocommit">true</property>
		<!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
		<property name="hibernate.current_session_context_class">thread</property>
		<!-- 引入ORM 映射文件 
			填写src之后的路径(相对路径,相对src之后)
		 -->
		<mapping resource="com/hcx/a_hello/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

 

 

 


User.hbm.xml详解:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- ORM元数据  表对象关系映射文件 
    	package : 配置该配置文件中类所在的包.  -->
 <hibernate-mapping package="com.hcx.a_hello" >
 	<!-- class: 配置实体与表的关系
 		name : 填写实体的完整类名
 		table: 与实体对应表的名称
 		dynamic-insert:动态插入 默认值是false
 						true=>如果字段值为null,不参与insert语句
 		 dynamic-update:动态更新  默认值"false"
 		 				true=> 没改动过的属性,将不会生成到update语句中
 	 -->
 	 <!-- ORM映射  实体与表 属性与列 -->
 	<class name="User" table="t_user"  > <!-- 把哪个class表映射到哪张表 -->
 		<!-- id: 配置实体与表中 id对应
 			name: user对象中biaosh主键的属性名称
 			column: 主键在表中的列名
 			length: 列的数据长度
 			unsaved-value(不常用): 指定主键为什么值时,当做null来处理.
			access(强烈推荐不要用):field 那么在操作属性时,会直接操作对应的字段而不是get/set方法
 		 -->
		<id name="id" column="id" length="255"   >
			<!-- generator:主键生成策略
				 	1.increment  数据库自己生成主键. 先从数据库中查询最大的ID值,将ID值加1作为新的主键
					2.identity  依赖于数据的主键自增功能
					3.sequence	序列,依赖于数据中的序列功能(Oracle).
					4.hilo(纯了解,永远用不到) : Hibernate自己实现序列的算法,自己生成主键. (hilo算法 )
					5.native 自动根据数据库判断,三选一. identity|sequence|hilo
					6.uuid  生成32位的不重复随机字符串当做主键
					7.assigned 自己指定主键值. 表的主键是自然主键时使用.
				 
			 -->
			<generator class="uuid"></generator>
		</id> 	
		<!-- property : 实体中属性与表中列的对应
			 name : 实体中属性名称
			 column : 表中列的名称
			 length : 数据长度
			 precision: 小数点后的精度
			 scale:	有效位数
			 insert(一般不用): 该属性是否加入insert语句.
			 update(一般不用): 该属性是否加入update语句.
			 not-null : 指定属性的约束是否使用 非空
			 unique : 指定属性的约束是否使用 唯一
		 -->
		 <!-- 
		 	type: 表达该属性的类型
		 	可以用三种方式指定属性
		 	java类型		 		 数据库类型指定			Hibernate类型指定
		 	java.lang.String	varchar				string
		  -->
		<property name="name" column="name" update="true" type="string" ></property>
		<property name="password" column="password"></property>
		 <property name="sal" column="sal" precision="2" scale="3" ></property>
 	</class>
 </hibernate-mapping>

 

 

 

 

1.提供构造  

 

new Configuration()  :hibernate将自动加载hibernate.properties文件

       hibernate.properties文件必须存放在类路径(src)下

2.提供方法 

configure() :将加载src下的hibernate.cfg.xml

 

public Configuration configure() throws HibernateException{
		configure("/hibernate.cfg.xml");
		return this;
	}

 

 

 

 

 

3.扩展api

       configure(String) :加载指定目录下的 xml文件

4.手动加载配置文件

 

		// 手动加载指定的配置文件
		config.addResource("com/hcx/a_hello/User.hbm.xml");
		
		// 手动加载指定类,对应的映射文件 User--> User.hbm.xml
		config.addClass(User.class);
// 手动加载指定的配置文件
		config.addResource("com/hcx/a_hello/User.hbm.xml");
		
		// 手动加载指定类,对应的映射文件 User--> User.hbm.xml
		config.addClass(User.class);

 

常见异常:

 

开发中:将hbm.xml映射 配置 hibernate.cfg.xml

学习中:可以使用 addClass  或 addResource


case:

package com.hcx.b_api;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

import com.hcx.a_hello.User;
//详解Configuration对象
public class Configuration_test {
	@Test
	//Configuration 用于加载配置文件
	public void fun1(){
		//1.1 调用configure() 方法=> 加载src下名为hibernate.cfg.xml
		Configuration  conf = new Configuration().configure();
		//1.2 如果配置文件不符合默认加载规则.我们可以调用
			//new Configuration().configure(file); 通过file加载
			//new Configuration().configure(path);	通过路径加载
		//1.3 可以通过Configuration对象加载 映射文件(不推荐)
			//推荐hibernate.cfg.xml 使用 mapping 属性引入配置文件
		//规范: 1>orm映射文件名称与实体的简单类名一致
		//	   2>orm映射文件 需要与实体的类在同一包下
		conf.addClass(User.class);
	}
	
	
}

 

 

 

二、SessionFactory工厂

SessionFactory 相当于java web连接池,用于管理所有session

获得方式:config.buildSessionFactory();

sessionFactory hibernate缓存配置信息(数据库配置信息、映射文件,预定义HQL语句 等)

SessionFactory线程安全,可以是成员变量,多个线程同时访问时,不会出现线程并发访问问题。

提供api:

		//打开一个新的会话 session
		factory.openSession();
		//获得当前线程中绑定的会话session
		factory.getCurrentSession();
//打开一个新的会话 session
		factory.openSession();
		//获得当前线程中绑定的会话session
		factory.getCurrentSession();

hibernate支持,将创建的session绑定到本地线程中,底层使用ThreadLocal,在程序之间共享session。

1.必须在hibernate.cfg.xml 配置

 

<!-- 2 与本地线程绑定 -->
		<property name="hibernate.current_session_context_class">thread</property>
 

 

2.如果提交或回滚事务,底层将自动关闭session

case:
package com.hcx.b_api;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

import com.hcx.a_hello.User;
//详解SessionFactory对象
public class sessionfactory_test {
	@Test
	//SessionFactory 创建session的工厂
	public void fun1(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		//3.1 openSession => 获得一个全新的Session对象
		sf.openSession();
		//3.2 getCurrentSession => 获得与当前线程绑定的session对象
		// 调用getCurrentSession 需要加上一个配置: (在hibernate.cfg.xml中)
//		<property name="hibernate.current_session_context_class">thread</property>
		sf.getCurrentSession();
		
	}
}

三、Session会话

Session 相当于 JDBC的 Connection-- 会话

通过session操作PO对象 --增删改查

session单线程,线程不安全,不能编写成成员变量。

session api

       save保存

       update更新

       delete删除

       get通过id查询,如果没有 null

       load通过id查询,如果没有抛异常

       createQuery("hql")  获得Query对象

       createCriteria(Class)获得Criteria对象

case:
package com.hcx.b_api;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

import com.hcx.a_hello.User;
//详解Session对象
public class session_test {
	@Test
	//Session对象 用于操作数据库
	//增
	public void fun1(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//hibernate把对数据库的操作变成面向对象的操作
		//创建一个想要增加的对象,交给session
		User u = new User();
		u.setName("jerry");
		u.setPassword("1234");
		
		//调用Session的save方法保存对象到数据库中
		session.save(u);
		
		//关闭资源
		session.close();
		sf.close();
		
	}
	
	@Test
	//Session对象 用于操作数据库
	//改 
	//获得修改之前的对象,对其进行修改
	public void fun2(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//先查询出你要修改的对象
		User user = (User) session.get(User.class,1);
		//参数1:要取的对象的类
		//参数2:要修改的那条记录的id
		
		//在查询结果上,进行修改
		user.setName("汤姆");

		//把修改之后的user对象传进去
		session.update(user);
		
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
		
	}
	@Test
	//Session对象 用于操作数据库
	//删
	public void fun3(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
		//先查询出你要修改的对象
				User user = (User) session.get(User.class,2);
				/*User user = new User();
				user.setId(1);*/
		//根据ID删除
		session.delete(user);
		
		//---------------------------------------------------------
		
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
		
	}
	@Test
	//Session对象 用于操作数据库
	//查询get
	public void fun4(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
		//先查询出你要修改的对象
				User user = (User) session.get(User.class,3);
				
		//---------------------------------------------------------
		
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
		
		System.out.println(user);
	}
	@Test
	//Session对象 用于操作数据库
	//查询 load
	public void fun5(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
		//先查询出你要修改的对象
				User user = (User) session.load(User.class,3);
				
		//---------------------------------------------------------
		
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
		
		System.out.println(user);
	}
	//get: get方法被调用时立刻  发送sql语句查询
	//load : 调用时并没有查询数据库,当我们需要使用该对象的时候,才查询数据
	//------------------------------------------------------------------------------------------------------------
	@Test
	//Session对象 用于操作数据库
	//查询所有User
	public void fun6(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
		
		//HQL语言 => Hibernate Query Language
		//createQuery 传入hql语句查询
		//select * from t_user;
		Query query = session.createQuery("from com.hcx.a_hello.User");
		//list 将语句执行,并返回结果
		List<User> list =  query.list();
		
		System.out.println(list);
		//---------------------------------------------------------
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
	}
	@Test
	//Session对象 用于操作数据库
	//查询所有User
	public void fun7(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
		//Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
		Criteria criteria = session.createCriteria(User.class);
		
		//select * from t_user;
		List<User> list =	criteria.list();
		
		System.out.println(list);
		//---------------------------------------------------------
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
	}
	
	@Test
	//Session对象 用于操作数据库
	//查询所有User
	public void fun8(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
			//原生的Sql查询
		SQLQuery query = session.createSQLQuery("select * from t_user");
		// addEntity 将查询结果封装到指定对象中
		query.addEntity(User.class);
		
		List<User> list =	query.list();
		
		System.out.println(list);
		
		/*List<Object[]> list = query.list();
		
		for(Object[] objs : list){
			System.out.println(Arrays.toString(objs));
		}*/
		
		//---------------------------------------------------------
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
	}
//---------------------------------------------------------------------------
	/*
	 * session.save();
	 * session.update();
	 * session.delete();
	 * session.get();
	 * session.load(); 对比get
	 * session.createQuery()
	 * session.createCritieria();
	 * session.createSqlQuery();
	 * 
	 */
//-------------------------------------------------------------------
	//1 load方法.返回一个代理对象,获得其内容时,会查询数据库,是每次访问属性都会查询数据库吗?
	//答:不是每次都查.代理对象中有一个标识是否被初始化的boolean型变量. 记录是否被初始化过.
	//2 代理都是要基于接口的,用load方法返回的代理,就没有实现任何接口?
	//答: java中的动态代理是基于接口.  而 Hibernate 是使用javassist-3.12.0.GA.jar 产生代理对象的.
		// 该代理与被代理对象之间的关系是继承关系.与我们学的动态代理不是一种.所以不需要接口.
}

 

 

 

四、Transaction事务

 

开启事务beginTransaction()

获得事务getTransaction()

 

提交事务:commit()

回滚事务:rollback()

try{
   //开启
   //session操作
   //提交
} catch(e){
   //回滚
}

扩展:不需要手动的管理事务,之后所有的事务管理都交予spring。
 

 

package com.hcx.b_api;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

import com.hcx.a_hello.User;
//详解Transaction对象
public class Transaction_test {
	@Test
	//Transaction 封装了事务的操作
	//开启事务
	//提交事务
	//回滚事务
	public void fun1(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//-------------------------------
		//打开事务
		Transaction ts = session.beginTransaction();
		//获得已经打开的事务对象(很少用)
		session.getTransaction();
		
		
		//Transaction 控制如何关闭事务
		//提交
		ts.commit();
		//回滚
		ts.rollback();
		
		
		//-------------------------------
		session.close();
		sf.close();
	}
	//事务的细节
	@Test
	public void fun2(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得与当前线程绑定的session
		Session session = sf.getCurrentSession();
		//-------------------------------
		//事务关闭时,会自动把与当前线程关联的session关闭,并删除
		session.beginTransaction().commit();
		
		//在获得当前线程绑定的session时. 获得的是新的session
		Session session2 = sf.getCurrentSession();
		
		System.out.println(session==session2);//false
		
		//-------------------------------
		session.close();
		sf.close();
	}
}

 

 

 

五、Query对象

 

hibernate执行hql语句

hql语句:hibernate提供面向对象查询语句,使用对象(类)和属性进行查询。区分大小写。

获得session.createQuery("hql")

方法:

       list()  查询所有

       uniqueResult()获得一个结果。如果没有查询到返回null,如果查询多条抛异常。

 

       setFirstResult(int)分页,开始索引数startIndex

       setMaxResults(int)分页,每页显示个数pageSize

 

case:

 

package com.hcx.b_api;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

import com.hcx.a_hello.User;
//详解Query对象
public class Query_test {
	@Test
	//Query对象 封装HQL语句的对象
	//Query中封装查询细节api
	public void fun1(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
		
		Query query = session.createQuery("from com.hcx.a_hello.User ");
//		Query query = session.createQuery("from com.hcx.a_hello.User where name='tom'"); 
		//分页 limit index,count;
		
		//指定结果从第几个开始拿
		query.setFirstResult(0);
		//指定拿几个结果
		query.setMaxResults(2);
		
		//query.list() 将hql语句执行,并返回结果(多行)
		List<User> list =  query.list();
		System.out.println(list);
		//uniqueResult 将hql语句执行,并返回结果(一行)
		//User u = (User) query.uniqueResult();
		//System.out.println(u);
		//---------------------------------------------------------
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
	}
}

 

 

 

六、Criteria对象

l  QBC(query bycriteria),hibernate提供纯面向对象查询语言,提供直接使用PO对象进行操作。

l  获得方式:Criteria criteria = session.createCriteria(User.class);

l  条件

criteria.add(Restrictions.eq("username", "tom"));
//		Restrictions.gt(propertyName, value)		大于
//		Restrictions.ge(propertyName, value)	大于等于
//		Restrictions.lt(propertyName, value)	小于
//		Restrictions.le(propertyName, value)	小于等于
//	Restrictions.like(propertyName, value)	模糊查询,注意:模糊查询值需要使用 % _
 

case:
package com.hcx.b_api;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import com.hcx.a_hello.User;
//详解Cretiaria对象
public class Cretiaria_test {
	@Test
	//Cretiaria对象 与 Query对象功能很像
	//控制查询
	public void fun1(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
		//Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
		Criteria criteria = session.createCriteria(User.class);
		// 查找name属性值为tom的 记录
		criteria.add(Restrictions.eq("name", "tom"));
		
		//select * from t_user; 
		// list() 将查询执行,并返回结果(多行)
		//List<User> list =	criteria.list();
		//System.out.println(list);
		
		//返回一个查询结果
		User u = (User) criteria.uniqueResult();
		System.out.println(u);
		//---------------------------------------------------------
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
	}
	
	@Test
	//Cretiaria对象 与 Query对象功能很像
	//控制查询
	public void fun2(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
		//Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
		Criteria criteria = session.createCriteria(User.class);
		
		//查找名字中包含字母o的用户
		criteria.add(Restrictions.like("name", "%o%"));
		
		//返回一个查询结果
		List<User> list =	criteria.list();
		System.out.println(list);
		//---------------------------------------------------------
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
	}
	
	@Test
	//Cretiaria对象 与 Query对象功能很像
	//>  gt
	//< lt
	//= eq
	//>= ge
	//<= le
	//like 
	//between
	public void fun3(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//打开事务
		Transaction ts = session.beginTransaction();
		
		//--------------------------------------------------------
		//Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
		Criteria criteria = session.createCriteria(User.class);
		
		//查找id大于3的用户
		criteria.add(Restrictions.gt("id", 3));
		//返回一个查询结果
		List<User> list =	criteria.list();
		System.out.println(list);
		//---------------------------------------------------------
		//提交事务
		ts.commit();
		
		//关闭资源
		session.close();
		sf.close();
	}
	
	
}

八、工具类

public class H3Utils {
	
	// 会话工厂,整个程序只有一份。
	private static SessionFactory factory;

	static{
		//1 加载配置
		Configuration config = new Configuration().configure();
		
		//2 获得工厂
		factory = config.buildSessionFactory();
//3 关闭虚拟机时,释放SessionFactory
			Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("虚拟机关闭!释放资源");
				sf.close();
			}
		}));
	}
	
	
	/**
	 * 获得一个新的session
	 * @return
	 */
	public static Session openSession(){
		return factory.openSession();
	}
	
	/**
	 * 获得当前线程中绑定session
	 * * 注意:必须配置
	 * @return
	 */
	public static Session getCurrentSession(){
		return factory.getCurrentSession();
	}
	
	
}
 
 
case:
package com.hcx.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

//完成Hibernate工具类
//封装配置文件读取操作
//封装Sessionfactroy创建操作
//封装session获得操作
public class HibernateUtils {

	private static SessionFactory sf;
	
	static{
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		sf = conf.buildSessionFactory();
		//
		Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("虚拟机关闭!释放资源");
				sf.close();
			}
		}));
		
	}
	
	
	public static org.hibernate.Session  openSession(){
				
				//3 获得session
				Session session = sf.openSession();
				
				return session;
	}
	
	public static org.hibernate.Session  getCurrentSession(){
		//3 获得session
		Session session = sf.getCurrentSession();
		
		return session;
}
	
	public static void main(String[] args) {
		System.out.println(openSession());
	}
}

 
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 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. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 联合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings ) 6.2.1. 集合外键(Collection foreign keys) 6.2.2. 集合元素(Collection elements) 6.2.3. 索引集合类(Indexed collections) 6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations) 6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary associations) 6.3.5. 使用<idbag> 6.4. 集合例子(Collection example) 7. 关联关系映射 7.1. 介绍 7.2. 单向关联(Unidirectional associations) 7.2.1. 多对一(many to one) 7.2.2. 一对一(one to one) 7.2.3. 一对多(one to many) 7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向关联(Bidirectional associations) 7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 (Collections of dependent objects) 8.3. 组件作为Map的索引(Components as Map indices ) 8.4. 组件作为联合标识符(Components as composite identifiers) 8.5. 动态组件 (Dynamic components) 9. 继承映射(Inheritance Mappings) 9.1. 三种策略 9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 11.3.4. 定制自动版本化行为 11.4. 悲观锁定(Pessimistic Locking) 11.5. 连接释放模式(Connection Release Modes) 12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select子句 14.6. 聚集函数 14.7. 多态查询 14.8. where子句 14.9. 表达式 14.10. order by子句 14.11. group by子句 14.12. 子查询 14.13. HQL示例 14.14. 批量的UPDATE和DELETE 14.15. 小技巧 & 小窍门 15. 条件查询(Criteria Queries) 15.1. 创建一个Criteria 实例 15.2. 限制结果集内容 15.3. 结果集排序 15.4. 关联 15.5. 动态关联抓取 15.6. 查询示例 15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) 15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) 16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling inheritance) 16.1.7. 参数(Parameters) 16.2. 命名SQL查询 16.2.1. 使用return-property来明确地指定字段/别名 16.2.2. 使用存储过程来查询 16.3. 定制SQL用来create,update和delete 16.4. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching strategies) 19.1.1. 操作延迟加载的关联 19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using subselect fetching) 19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/写缓存(Strategy: read/write) 19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能(Understanding Collection performance) 19.5.1. 分类(Taxonomy) 19.5.2. Lists, maps 和sets用于更新效率最高 19.5.3. Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. Schema自动生成(Automatic schema generation) 20.1.1. 对schema定制化(Customizing the schema) 20.1.2. 运行该工具 20.1.3. 属性(Properties) 20.1.4. 使用Ant(Using Ant) 20.1.5. 对schema的增量更新(Incremental schema updates) 20.1.6. 用Ant来增量更新schema(Using Ant for incremental schema updates) 20.1.7. Schema 校验 20.1.8. 使用Ant进行schema校验 21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. 示例:复杂映射实例 23.1. Employer(雇主)/Employee(雇员) 23.2. Author(作家)/Work(作品) 23.3. Customer(客户)/Order(订单)/Product(产品) 23.4. 杂例 23.4.1. "Typed" one-to-one association 23.4.2. Composite key example 23.4.3. 共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices) 表格清单 1. Hibernate v3翻译团队 3.1. Hibernate JDBC属性 3.2. Hibernate数据源属性 3.3. Hibernate配置属性 3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. 缓存策略提供商(Cache Providers) 19.2. 各种缓存提供商对缓存并发策略的支持情况(Cache Concurrency Strategy Support) 20.1. Summary 20.2. SchemaExport命令行选项 20.3. SchemaExport 连接属性 20.4. SchemaUpdate命令行选项 20.5. SchemaValidator命令行参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值