01_Hibernate持久化
一.简介
思考:为什么使用Hibernate?
Hibernate对JDBC访问数据库的代码进行了封装、
Hibernate是一个基于JDBC的主流持久化框架、
Hibernate的性能比较好,它是一个轻量级框架、
什么是持久化?
是将内存中的数据保存到磁盘等存储设备。
瞬时状态:保存在内存的程序数据,程序退出后数据就消失了,称为瞬时状态。
持久状态:保存在磁盘上的数据,程序退出后仍然存在,称为数据的持久状态。
持久化:将程序数据在瞬时状态和持久状态之间转换的机制。
什么是ORM?
ORM(Object Relation Mapping)完成对象数据到关系型数据映射的机制称为对象-关系映射,简称ORM。
ORM的实现思想:将关系数据库中表中的记录映射为对象,以对象的形式展现,程序员可以把数据库的操作转换成对象的操作。因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。ORM一般采用XML的格式保存对象与关系数据表的映射。
二.编写入门程序
1.导入相关的jar包、
2.创建数据库表,封装类、
3.创建核心主xml文件、
4.创建映射xml文件、
5.编写功能测试、
1、下载hibernate3.x的开发包 (3.6.10)
http://sourceforge.net/projects/hibernate/files/hibernate3/
Hibernate并没有提供日志的实现所有可以下载slf4j 和 log4j 开发包,整合Hibernate的日志系统到log4j
Jar包介绍:
2、创建表与Javabean
这里数据库使用Mysql
User:
public class User {
private int uid;
private String uname;
private Date ubithday;
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Date getUbithday() {
return ubithday;
}
public void setUbithday(Date ubithday) {
this.ubithday = ubithday;
}
@Override
public String toString() {
return "User{" + "uid=" + uid + ", uname='" + uname + '\'' + ", ubithday=" + ubithday + '}';
}
}
3、创建ORM(对象关系映射文件)
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.icss.entity.User" table="aaa">
<id name="uid" column="UID" type="java.lang.Integer" length="11">
<!--主键生成策略-->
<generator class="increment">
</generator>
</id>
<!--usercode属性-->
<property name="uname" column="UNAME" type="java.lang.String" length="255">
</property>
<!--username属性-->
<property name="ubithday" column="UBITHDAY" type="java.util.Date">
</property>
<!-- <property name="age" formula="(select months_between(sysdate,birthday))">
</property>-->
</class>
</hibernate-mapping>
type属性:
4、创建主配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--配置数据库驱动-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property>
<!--配置数据库连接url-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/crm?characterEncoding=utf-8</property>
<!--数据库用户名-->
<property name="hibernate.connection.username">root</property>
<!--数据库密码-->
<property name="hibernate.connection.password">123456</property>
<!--配置数据库连接池-->
<property name="hibernate.connection.pool_size">1</property>
<!--配置数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--运行时输出sql语句-->
<property name="hibernate.show_sql">true</property>
<!--格式化sql语句·-->
<property name="hibernate.format_sql">true</property>
<!--指定session 与当前线程绑定-->
<property name="hibernate.current_session_context_class">thread</property>
<!--动态创建或更新表 /create、drop、update、-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--列出所有映射文件 -->
<mapping resource="com/hb/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5、功能测试
public class Mytest {
@Test
public void test(){
// 实例化配置对象,加载配置文件 hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
// 创建会话连接工厂
SessionFactory sf = configuration.buildSessionFactory();
// 创建会话
Session session = sf.openSession();
// 开启事务
Transaction ts = session.beginTransaction();
// 操作
ts.commit();
session.close();
sf.close();
}
}
Hibernate常用操作
插入数据、根据主键查询数据、修改数据、删除数据、查询所有数据、
插入数据 通过Session对象 save方法
- save(Object object)
修改数据 通过Session的update方法
- update(Object object)
删除数据 通过Session的delete方法
- delete(Object object)
根据主键查询 通过Session的get或load
- get(Class clazz, Serializable id)
Object load(Class theClass, Serializable id
get和load的区别:
1.发送SQL的时机:
load这个方法采用了一个技术.lazy延迟加载(懒加载).真正使用这个对象的数据的时候.(对象的数据不包括主键).
get这个方法是立即检索.当执行session.get()方法的时候,马上发送SQL语句查询.
2.返回的对象:
load方法返回的是代理对象.
get方法返回的是真实的对象.
3.查询一个不存在的数据:
load方法抛异常:ObjectNotFoundException.
get方法抛异常:NullPointException.
Hibernate执行过程
三.配置说明
Configuration类
Configuration 类负责读取主配置文件的信息。包括如下内容:
- 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。
-
- *.hbm.xml 文件)
创建 Configuration
读取配置文件:Xml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
SessionFactory接口
SessionFactory接口:Configuration对象根据当前的配置信息生成 SessionFactory 对象,因此SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存。
获取SessionFactory的方式:
Configuration cfg = new Configuration().configure();
SessionFactory sf = cfg.buildSessionFactory();
SessionFactory作用:是生成Session的工厂
Session session = sf.openSession();
注意事项:一般情况下一个应用中只初始化一个 SessionFactory 对象。
Session接口
Session接口:是应用程序与数据库之间交互操作的核心对象,是 Hibernate 运作的中心,所有持久化对象(javabean)必须在 session 的管理下才可以进行持久化(更新数据库)操作。
获取Session对象的方式:
Session session = sessionFactory.openSession();
Session的主要方法简介:
取得持久化对象的方法: get()、load()
持久化对象保存,更新和删除:
save()、update()、saveOrUpdate()、delete()
开启事务:beginTransaction()
Transaction接口
Transaction接口 :是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)!代表一次数据库访问的最小操作,具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
获取Transaction对象的方式:
Transaction tx =session.beginTransaction();
常用方法:
- commit()提交相关联的session实例
使用Hibernate的7个步骤: hibernate的运行流程:
Hibernate的对象有三种状态:
瞬时态:
瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。
表示该实体对象在内存中是自由存在的,也就是说与数据库中的数据没有任何的关联,该实体从未与任何持久化上下文联系过,没有持久化标识(相当于主键)。
瞬态实体的特征有:
与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录 与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。
持久态:
处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。
当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。
持久对象具有如下特点:
1. 和session实例关联;
2. 在数据库中有与之关联的记录
托管态:
当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。
脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。
脱管对象具有如下特点:
1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
2. 脱管对象一定是由持久态对象转换而来
3. 脱管实体不再于Session关联
4. 脱管实体对象与数据库中的数据没有直接联系,主要表现在对其进行的修改不再影响到数据库中的数据
5. 脱管实体对象在数据库中有相应的数据记录(如果该记录没有被删除)
Hibernate 把对象分为 4 种状态:
持久化状态,
临时状态,
游离状态,
删除状态.
Session 的特定方法能使对象从一个状态转换到另一个状态。