一、搭建hibernate步骤
第1步:先建一个Java工程导入使用Hibernate最小必要包。可以到网站下载Hibernate最新的包,如果访问数据库,则需要导入数据库驱动包。最小必要包:
第2步:在src创建配置文件hibernate.cfg.xml,放置在src目录中。
第
3
步:编写一个会话工厂类。通过会话工厂类产生一个
会话
Session
对象。
Session对象是Hibernate的核心。任何对数据库操作都在会话中进行的。
第
4
步:编写
POJO
类(在vo中的javabean)以及映射文件。javabean(
***.java), 映射文件(***.hbm.xml)
pojo类和映射文件
第
5
步:编写测试文件
Hibernate
核心接口
1
、核心接口
(1) Configuration接口
Configuration 接口负责管理Hibernate 的配置信息。
为了能够连
上数据库必须配置一些属性,这些属性包括:
数据库URL
数据库用户
数据库用户密码
数据库JDBC驱动类
数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现。
/*创建一个配置对象,读取配置文件*/
Configuration config =
new Configuration();
config.configure("/hibernate.cfg.xml");
(2) SessionFactory接口
应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。这里用到了一个设计模式即工厂模式,用户程序从工厂类SessionFactory中取得Session的实例。SessionFactory不是轻量级的。它占的资源比较多,所以它应该能在整个应用中共享。一个项目通常只需要一个SessionFactory就够了,但是当项目要操作多个数据库时,必须为每个数据库指定一个SessionFactory。
会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存时才会如此)Session类。
/*通过配置对象产生一个会话工厂*/
SessionFactory factory=config.buildSessionFactory();
(3) Session接口
该接口是Hibernate使用最多的接口。Session不是线程安全的,它代表与数据库之间的一次操作。Session是持久层操作的基础,相当于JDBC中的Connection。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。Session通过SessionFactory打开,在所有的工作完成后,需要关闭。但如果在程序中,不断地创建以及销毁Session对象,则会给系统带来不良影响。所以有时需要考虑session的管理合理的创建合理的销毁。
/*通过工厂产生一个会话*/
Session session=factory.openSession();
(4) Query
类
Query类可以很方便地对数据库及持久对象进行查询,它可以有两种表达方式:
查询语句使用
HQL(HQL是Hibernate Query Lanaguage简称是Hibernate配备了一种非常强大的查询语言,类似于SQL)
或者本地数据库的
SQL
语句编写。
/*通过会话产生一个查询对象*/
Query query = session.createQuery("from Dept");
/*通过查询对象查询数据库,返回集合*/
List list = query.list();
for (
int i = 0; i < list.size(); i++) {
Dept dept = (Dept) list.get(i);
System.
out.println(dept.getDname());
}
(5) Transaction
接口
如果你向数据库中增加数据或修改数据时,需要使用事务处理,这时你需要Transaction接口。
Transaction
接口是对实际事
务实现的一个抽象,该接口可以实现JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务等跨容器的事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移值。
(6)
一个完整示例
,
显示了
Hibernate
编程基本思路。
/*创建一个配置对象,读取配置文件*/
String configfile="/hibernate.cfg.xml";
Configuration config=new Configuration();
config.configure(configfile);
/*通过配置对象产生一个会话工厂类*/
SessionFactory sessionfactory=config.buildSessionFactory();
/*通过会话工厂类产生一个会话实例*/
Session session=sessionfactory.openSession();
/*通过会话产生一个查询对象Query*/
Query query=session.createQuery("from bean.Customer");
/*进行查询返回一个集合List*/
List<Customer> cuslist=query.list();
for(Customer cus:cuslist){
System.out.println(cus.getCustomerId()+
" "+cus.getName()+" "+cus.getPhone());
}
Hibernate
常见操作
如果利用Hibernate修改数据库时,需要使用事务处理,一个事务提交时才真正将修改过的记录更新到数据库中。
1
、增加记录
Session session=HibernateSessionFactory.getSession();
/*定义事务开始*/
Transaction tran=session.beginTransaction();
Dept dept=new Dept(new Long(1001),"math","shanghai");
session.save(dept);
/*提交事务,真正保存到数据库中*/
tran.commit();
2
、
删除记录
public static void main(String[] args) {
Session session=HibernateSessionFactory.getSession();
/*首先查找待删除记录 通过ID*/
Dept dept=(Dept)session.get(Dept.class,new Long(10));
Transaction tran=session.beginTransaction();
session.delete(dept);
tran.commit();
}
3
、修改记录
public class Demo {
public static void main(String[] args) {
Session session=
HibernateSessionFactory.getSession();
Transaction tran=session.beginTransaction();
/*首先查找待修改记录 通过ID*/
Dept dept=
(Dept)session.get(Dept.class,new Long(10));
dept.setDname("math");
session.saveOrUpdate(dept);
tran.commit();
}
}
Hibernate主键ID生成方式
数据库中表有主键、主键的唯一性决定了数据库表中记录唯一。
缓存在
Session
中的数据即实例都有一个唯一的
ID,ID
映射了数据
库中主键。那么ID如何产生呢?
1
、
assigned:主键由外部程序负责生成,无需Hibernate参与。即当增加一个实体时,由程序设定它的ID值(手工分配值)
<class name="bean.Customer" table="customers" catalog="support">
<id name="customerId" type="java.lang.String">
<column name="customerID" length="8" />
<generator class="
assigned
"></generator>
</id>
.......
</class>
2
、
identity: 在DB2、SQL Server、MySQL等数据库产品中表中主键列可以设定是
自动增长列,则
增加一条记录时主键的值可以
不赋值。
用数据库提供的主键生成机制。
(1) 表结构:
create table test1 ( tid int not null primary key
auto_increment,
name char(40));
(2) 映射文件
<class name="bean.Test1" table="test1" catalog="support">
<id name="tid" type="java.lang.Integer">
<column name="tid" />
<generator class="
identity
"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="40" />
</property>
</class>
3
、
increment:
主键按数值顺序递增。此方式的实现机制为在当前应用实例中
维持一个变量,以保存着当前的最大值,之后每次
需要生成主键的时候将此值加
1
作为主键。这种方式可能产生的问题是:
如果当前有多个实例访问同一个数据库,那么由于各个实
例各自维护主键状态,不同实例可能生成同样的主键,从而造成
主键重复异常。因此,
如果同一数据库有多个实例访问,此方式
必须避免使用。
<class name="bean.Test2" table="test2" catalog="support">
<id name="tid" type="java.lang.Integer">
<column name="tid" />
<generator class="
increment
"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="40" />
</property>
</class>
4
、
sequence:
采用数据库提供的
sequence
机制生成主键。
如Oralce 中的Sequence,在Oracle中创建序列:
create sequence hibernate_sequence;
当需要保存实例时,Hibernate自动查询Oracle中序列"hibernate_sequence"的下一个值
;该值作为主键值。可以改变默认的序列名称。
<id name="sid" type="java.lang.Integer">
<column name="sid" />
<generator class="
sequence
"></generator>
</id>
5
、
native
:由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
6
、
uuid.hex
:
由
Hibernate
为
ID
列赋值,
依据当前客户端机器
的
IP
、
JVM
启动时间、当前时间、一个计数器生成串,以该串为
ID
值。
<class name="bean.Test3" table="test3" catalog="support">
<id name="tid" type="java.lang.String">
<column name="tid" length="50" />
<generator class="
uuid.hex
"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="40" />
</property>
</class>