参考书籍:《J2EE开源编程精要15讲》
Hibernate配置文件
1) hibernate.cfg.xml
1 <?xml version='1.0' encoding='UTF-8'?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <!-- Generated by MyEclipse Hibernate Tools. --> 6 <hibernate-configuration> 7 8 <session-factory> 9 <property name="dialect"> 10 org.hibernate.dialect.MySQLDialect 11 </property> 12 <property name="connection.url"> 13 jdbc:mysql://localhost:3306/test 14 </property> 15 <property name="connection.username">root</property> 16 <property name="connection.password">root</property> 17 <property name="connection.driver_class"> 18 com.mysql.jdbc.Driver 19 </property> 20 <property name="myeclipse.connection.profile">cq</property> 21 <mapping resource="hibernateTest/Person.hbm.xml" /> 22 23 </session-factory> 24 25 </hibernate-configuration>
hibernate.cfg.xml文件包括一个根元素<hibernate-configuration>,该元素有一个子元素<session-factory>,<session-factory>元素有两个子元素:<property>和<mapping>。
- <property>元素用来指定数据库链接参数。有一个name属性,用来指定数据库连接参数的名字
- <mapping>元素用来指定所要用到的映射文件。有一个resource属性,用来指定所要用到的映射文件的名字及路径
2) hibernate.properties
详见:http://blog.csdn.net/dingherry/article/details/6798886
持久化对象(Persistent Object)
在Hibernate应用中,一个数据表对应一个持久化对象(PO)。PO实际上就是一个遵循一定规则的普通的JavaBean
1 package hibernateTest; 2 3 /** 4 * Person entity. @author MyEclipse Persistence Tools 5 */ 6 7 public class Person implements java.io.Serializable { 8 9 // Fields 10 11 private Integer id; 12 private String name; 13 private String sex; 14 private String address; 15 16 // Constructors 17 18 /** default constructor */ 19 public Person() { 20 } 21 22 /** full constructor */ 23 public Person(String name, String sex, String address) { 24 this.name = name; 25 this.sex = sex; 26 this.address = address; 27 } 28 29 // Property accessors 30 31 public Integer getId() { 32 return this.id; 33 } 34 35 public void setId(Integer id) { 36 this.id = id; 37 } 38 39 public String getName() { 40 return this.name; 41 } 42 43 public void setName(String name) { 44 this.name = name; 45 } 46 47 public String getSex() { 48 return this.sex; 49 } 50 51 public void setSex(String sex) { 52 this.sex = sex; 53 } 54 55 public String getAddress() { 56 return this.address; 57 } 58 59 public void setAddress(String address) { 60 this.address = address; 61 } 62 63 }
该PO对应数据表person。四个字段:ID( int类型 )、Name( varchar类型 )、Sex( char类型 )、Address ( varchar类型 )。每个字段对应一对getter和setter方法
映射文件 xxx.hbm.xml
Hibernate映射文件把一个PO与一个数据表映射起来,每个表对应一个映射文件。
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 4 <!-- 5 Mapping file autogenerated by MyEclipse Persistence Tools 6 --> 7 <hibernate-mapping> 8 <class name="hibernateTest.Person" table="person" catalog="test"> 9 <id name="id" type="java.lang.Integer"> 10 <column name="ID" /> 11 <generator class="identity" /> 12 </id> 13 <property name="name" type="java.lang.String"> 14 <column name="Name" length="20" not-null="true" /> 15 </property> 16 <property name="sex" type="java.lang.String"> 17 <column name="Sex" length="1" not-null="true" /> 18 </property> 19 <property name="address" type="java.lang.String"> 20 <column name="Address" length="200" not-null="true" /> 21 </property> 22 </class> 23 </hibernate-mapping>
该文件将类Person和表person映射起来
- <class>元素:定义一个持久化类,属性name表示指定持久化类的Java全限定名,table属性表示指定对应的数据表名,catalog属性表示数据库名
- <id>元素:是<class>的一个子元素。定义了该属性到数据表主键字段的映射,name属性指定PO的标识属性的名字,type属性表示标识类型,column属性指定数据表的主键字段名字
- <generator>元素:<id>的一个子元素。指定id标识的生成类的名字,class属性指定一个Java类的名字,为该持久化类的实例生成唯一的标识。(详见:http://blog.csdn.net/ye1992/article/details/19632001)
- property元素:是<class>元素的一个子元素,为类声名一个持久化的属性。name属性指定属性的名字,小写开头;column属性指定对应数据表字段名;length属性指定属性的长度;type属性指定属性的Hibernate类型的名字( Hibernate基础属性 或 Java类 )
Configuration类
负责管理Hibernate配置信息。执行Configuration conf=new Configuration().configure()语句时,Hibernate自动在CLASSPATH中搜寻Hibernate配置文件;在Java Web应用中,则在WEB-INF/classes目录下搜寻配置文件。还可以指定配置文件的位置,如:
File file=new File("C:\Users\Administrator\Desktop\dfd\Hibernate_Proj\src\hibernate.cfg.xml"); Configuration cfg=new Configuration().configure(file);
SessionFactory接口
负责Session实例的创建,可通过Configuration创建SessionFactory
Configuration cfg=new Configuration().configure(); SessionFactory sf=cfg.buildSessionFactory();
SessionFactory线程安全,可以被多线程调用以取得Session
Session接口
是应用程序与数据库之间的一个会话,是Hibernate运作中心,相当于JDBC中的Connection。通过SessionFactory创建
Session session=SessionFactory.openSession();
通过Session对象装载、保存、创建或查询持久化对象。
1) 取得持久化对象
get()方法:
public Object get(Class entityClass,Serializable id)
entityClass表明类的类型,id是对象的主键值,如果id是int类型,应通过new Integer(id)方法变成Integer对象。如:取得主键id为"1111"的user对象
user=(User)session.get(User.class,new Integer(1111));
get方法首先通过id在Session缓存中查找对象,存在即直接返回;在二级缓存中查找,找到就返回;从数据库中加载
load()方法:
user=(User)session.load(User.class,new Integer(1111));
与get()的区别:立即加载对象且对象存在无区别,不存在get()返回null,load()弹出异常;延迟加载,get()以立即加载方式发送SQL,得到已初始化的对象,load()不发送SQL,返回代理对象,直到该对象被访问才被初始化
2) 持久化对象保存、更新和删除方法
save()方法
将一个PO属性取出放入PreparedStatement语句中,并向数据库中插入记录。调用时,并不立即执行SQL语句,而等到清理完缓存才执行,若在清理缓存前修改了属性,则Hibernate将会发送update语句来持久化操作。调用save()方法将临时对象保存到数据库中,对象的临时状态将变成持久化状态,对象将一直位于Session的缓存中,对它的任何操作在事务提交时都会同步保存到数据库中
update()方法
用来更新脱管对象,并不立即发送SQL语句,对对象的更新操作将积累起来,事务提交发送一条SQL语句完成全部更新操作
saveOrUpdate()方法
不能对脱管对象使用save(),也不能对临时对象使用udpate(),saveOrUpdate()自行判断对象类型并调用相应的方法
delete()方法
删除一个对象(包括持久对象和脱管对象),并不立即发送SQL语句
Query接口
可从Session对象生成,如
Query query=session.createQuery("from User u where u.username like ?")
主要方法:
- setXXX()方法:设置HQL中问号或变量的值。(setBinary、setBoolean、setFloat等等)
- list()方法:返回查询结果,并把结果转变成List对象
- excuteUpdate()方法:执行更新或删除语句
setString(int position,String value):设置HQL中的“?”的值,position代表“?”在HQL中的位置,value设置"?"的值。如:
Query query=session.createQuery("form User u where u.age>? and u.username like ?"; query.setInteger(0,22); query.setString(1,"%Tom%“);
setString(String paraName,String value):设置HQL中":"后跟变量的值,paraName代表HQL中":"后跟变量,value为该变量的值。如:
Query query=session.createQuery("from User u where u.age>:minAge and u.username like:userName"); query.setInteger("minAge",22); query.setString("userName","%Tom%");
list()方法使用示例:
Query query=session.createQuery("from User u where u.age>? "); query.setInteger(0,22); List list=query.list(); for(int i=0;i<list.size();i++){ user=(User)list.get(i); System.out.println(user.getUserName()); }
excuteUpdate()方法使用示例:
Query q=session.createQuery("delete from User");
q.executeUpdate();
一条语句就完成了批量删除操作,但删除后的数据还在缓存中
Transaction接口
可调用JTA或JDBC执行事务管理,运行与Session接口相关
Transaction tx=session.beginTransaction();
- commit():提交相关联的Session示例
- rollback():撤销事务操作
- wasCommitted():检察事务是否提交
应用示例 简单增删改:http://pan.baidu.com/s/1sjqL7Bn