l hibernate是一个开源ORM框架。
l ORM全称Object Relation Mapping,即对象关系映射。它是一种用来完成对象模型到关系模型的映射技术。
• 就是把应用程序中的对象数据持久化到关系数据库的表的一种技术。
l 使用ORM( ObjectRelation Mapping )框架来解决。主流的ORM框架有JBoss公司的Hibernate、Oracle公司的TopLink、Apache组织的OJB、Sun公司的JDO。
l 简单的说:ORM能利用面向对象的思想开放基于关系型数据库的应用程序,它的主要工作是将对象数据保存到关系数据库的表中,以及将关系数据库表中数据读入到对象中。
安装配置
l 下载地址http://www.hibernate.org,使用3.3版本。
l 解压获取必需类库文件
l 将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:
l 配置文件hibernate.cfg.xml和hibernate.properties,XML和properties两种,这两个文件的作用一样,提供一个即可,推荐XML格式,下载目录/etc下是示例配置文件。
可以在配置文件指定:
数据库的URL、用户名、密码、JDBC驱动类、方言等。
启动时Hibernate会在CLASSPATH里找这个配置文件。
l 映射文件(hbm.xml,对象模型和关系模型的映射)。在/eg目录下有完整的hibernate示例。
快速开始小例子
l 步骤:
1.新建Java项目,并加入相应的jar包,及jdbc驱动。
2.创建持久化类
3. 准备数据库表
4.创建配置文件hibernate.cfg.xml
5.创建映射文件xxx.hbm.xml
6.创建测试文件
Hibernate.connection.url 表示要链接的数据库地址
Hibernate.connection.driver_class 表示要链接的数据库的驱动类
Hibernate.connection.username 要连接的数据库的用户名
Hibernate.connection.password 要连接的数据库的密码
Hibernate.dialect 表示要使用的数据库的类型
org.hibernate.dialect.MySQL5Dialect MySQL数据库
org.hibernate.dialect.Oracle9Dialect oracle数据库
org.hibernate.dialect.SQLServerDialect SQLServer数据库
hibernate.hbm2ddl.auto
validate:加载hibernate时验证创建表结构
update:加载hibernate时自动更新数据库结构,如果表存在不用创建,如果不存在就创建。
create:每一次加载hibernate时都创建表结构
create-drop:加载hibernate时创建,退出时删除
第一个hibernate
hibernate.cfg.xml
- <!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="connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="connection.url">jdbc:mysql:///newdb</property>
- <property name="connection.username">root</property>
- <property name="connection.password">root</property>
- <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
- <property name="show_sql">true</property>
- <property name="hbm2ddl.auto">update</property>
- <mapping resource="com/hbsi/domain/User.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
<!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="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///newdb</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/hbsi/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
User.hbm.xml
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="com.hbsi.domain">
- <class name="User" >
- <id name="id">
- <generator class="increment" />
- </id>
- <property name="name" />
- <property name="birthday" />
- </class>
- </hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hbsi.domain">
<class name="User" >
<id name="id">
<generator class="increment" />
</id>
<property name="name" />
<property name="birthday" />
</class>
</hibernate-mapping>
User.java
- package com.hbsi.domain;
- import java.util.Date;
- public class User {
- private int id;
- private String name;
- private Date birthday;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- }
package com.hbsi.domain;
import java.util.Date;
public class User {
private int id;
private String name;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
Demo1.java
- package com.hbsi.demo;
- import java.util.Date;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- import com.hbsi.domain.User;
- public class Demo1 {
- public static void main(String[] args){
- User user=new User();
- user.setName("zhangkan");
- user.setBirthday(new Date());
- Configuration cfg=new Configuration();
- cfg.configure();
- SessionFactory sessionFactory=cfg.buildSessionFactory();
- Session session=sessionFactory.openSession();
- session.beginTransaction();
- session.save(user);
- session.getTransaction().commit();
- session.close();
- }
- }
package com.hbsi.demo;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hbsi.domain.User;
public class Demo1 {
public static void main(String[] args){
User user=new User();
user.setName("zhangkan");
user.setBirthday(new Date());
Configuration cfg=new Configuration();
cfg.configure();
SessionFactory sessionFactory=cfg.buildSessionFactory();
Session session=sessionFactory.openSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
session.close();
}
}
运行结果如下
控制台输出:
数据库结果:
Hibernate原理与应用(二)
基本概念和CURD
开发流程
1、由Domain object -> mapping->db。(官方推荐)
2、由DB开始,用工具生成mapping和Domain object。(使用较多)
3、由映射文件开始。
Domain Object限制
1、默认的构造方法(必须的)。
2、有无意义的标示符id(主键)(可选)
3、非final的,对懒加载有影响(可选)
- DomainJava Object(User)
- public class User {
- private int id;
- private String name;
- private Date birthDay;
- //gettersetter…
- }
DomainJava Object(User)
public class User {
private int id;
private String name;
private Date birthDay;
//gettersetter…
}
1、xx.hbm.xml
- <?xml version="1.0"?>
- <hibernate-mapping package=“cn.itcast.domain">
- <class name="User"table="user">
- <idnameidname="id">
- <generatorclassgeneratorclass="native"/>
- </id>
- <propertynamepropertyname="name"/>
- <propertynamepropertyname="birthday”/>
- </class>
- </hibernate-mapping>
<?xml version="1.0"?>
<hibernate-mapping package=“cn.itcast.domain">
<class name="User"table="user">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<propertyname="birthday”/>
</class>
</hibernate-mapping>
l 对象关系映射文件:把面向对象中的实体类对象映射到数据库中的实体(表的记录),把实体类之间的关联关系也映射到数据库中多个表之间的相互关系中。这样,在hibernate中对这些实体对象的操作就直接转换为对数据库表的记录的操作。
1.Configuration类
是Hibernate的入口,它负责配置并启动Hibernate。Hibernate通过Configuration的实例加载配置文件信息,然后读取指定对象关系映射文件的内容并创建SessionFactory实例。
2.SessionFactory接口
负责初始化Hibernate。一个SessionFactory实例对应一个数据库。应用程序从SessionFactory中获得Session实例。
3.Session接口
Session被称为持久化管理器,负责管理与持久化相关的操作:存储、更新、删除和加载对象。
4.Transaction接口
是Hibernate框架的事务接口。它对底层的事务接口做了封装。包括:JDBC API和JTA。
Session的缓存(一级缓存)
Session的CRUD方法以及调用查询接口的list(),iterate()方法时,如果session缓存中不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中,如果session缓存中已经存在这个对象,就不需在去数据库加载,而直接使用缓存中的对象。
l flush: 进行清理缓存(此时缓存中的数据并不丢失)的操作,让缓存和数据库同步执行一些列sql语句,但不提交事务,;
l commit:先调用flush() 方法,然后提交事务. 则意味着提交事务意味着对数据库操作永久保存下来。
session的缓存一般交由hibernate框架自动管理。
Session的几个主要方法
1、save保存数据
2、delete,删除对象
3、update,更新对象,如果数据库中没有记录,会出现异常。
4、get,根据ID查,会立刻访问数据库。
5、Load,根据ID查,(返回的是代理,不会立即访问数据库)。
6、saveOrUpdate (根据ID和version的值来确定是save或update
对象状态
l 瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。
l 持久(persistent):数据库中可能有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。
l 脱管(detached):数据库中可能有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。
对象状态的总结
操纵持久化对象-save()
Session 的 save() 方法使一个临时对象转变为持久化对象
Session 的 save() 方法完成以下操作:
l 把 News 对象加入到 Session 缓存中, 使它进入持久化状态
l 选用映射文件指定的标识符生成器, 为持久化对象分配唯一的 OID. 在使用代理主键的情况下, setId() 方法为 News 对象设置 OID 使无效的.
l 计划执行一条 insert 语句,把Customer对象当前的属性值组装到insert语句中
l Hibernate 通过持久化对象的 OID 来维持它和数据库相关记录的对应关系. 当 News 对象处于持久化状态时, 不允许程序随意修改它的 ID
操纵持久化对象-update()
Session 的 update() 方法使一个游离对象转变为持久化对象, 并且计划执行一条 update 语句.
操纵持久化对象-saveOrupdate()
saveOrUpdate:
该方法同时包含save和update方法,如果参数是临时对象就用save方法,如果是游离对象就用update方法,如果是持久化对象就直接返回。