Hibernate实现了面向对象的方式进行数据库操作,是对JDBC进行轻量级封装的成果,方法是将POJO对象和数据库表建立关系。简单的来说,使用Hibernate之后,操作数据库就不需要像之前的JDBC那样进行复杂的操作了。
使用hibernate的好处是:
1、更加对象化,以对象化的思维操作数据库,我们只需要操作对象就可以了,开发更加对象化,符合Java面向对象的思想。
2、移植性高,因为Hibernate做了持久层的封装,不直接操作数据库,所有的代码都具有可复用性。
3、Hibernate是一个没有侵入性的框架,没有侵入性的框架我们称为轻量级框架。对比Struts的Action和ActionForm,都需要继承,离不开Struts。Hibernate不需要继承任何类,不需要实现任何接口。
Hibernate实体类中有三种状态:
瞬时状态:使用new刚刚创建,还没有被持久化,且不处于session的缓存中
持久状态:已经被持久化了,而且加入到了Session的缓存中
游离状态:已经被持久化了,但是不再处于Session的缓存中
那么如何使用Hibernate呢?
配置hibernate-cfg.xml文件,管理数据库驱动和连接地址:
org.hibernate.dialect.Oracle9Dialect
jdbc:oracle:thin:@603-4:1521:orcl
root
root
oracle.jdbc.driver.OracleDriver
mydriver
配置*.hbm.xml映射文件,也就是POJO和Table的映射:
此ID为类中的属性
--此处的ID是表中的字段
--ID的生成策略是sequence进行
--实体列
-- 表中的字段
读取并解析配置文件 -----读取并解析映射文件,创建SessionFactory------打开session-------开启一个事务-------操作数据库--------提交或者回滚事务-------关闭session。
下面用一个例子来展示如何操作数据库:
public class AddTest extends TestCase {
Configuration conf = null;
SessionFactory sessionFactory = null;
Session session = null;
Transaction tran = null;
protected void setUp() throws Exception {
//完成1234步骤
//第一步:读取并解析配置文件
conf = new Configuration().configure();
//第二步:读取并解析映射文件
sessionFactory = conf.buildSessionFactory();
//第三步:打开session
session = sessionFactory.openSession();
//第四步:开启一个事务
tran = session.beginTransaction();
}
protected void tearDown() throws Exception {
//完成7步骤
//第七步:关闭回话
session.close();
}
public void add(){
//真正完成数据库的操作
StuInfo pojo = new StuInfo("张三",1,new Date(),"山西省太原市","137227839","5445567858");
try {
session.save(pojo);
tran.commit();//提交
} catch (Exception e) {
tran.rollback();
e.printStackTrace();
// TODO: handle exception
}
}
}
使用Hibernate,少量的代码便实现了数据的插入 ,session.save(pojo);,是对SQL的封装,实现插入数据。
对于修改和删除来说,我们要先进行数据库查询操作:使用Hibernate实现数据库的查询操作,Session中提供了两种的加载数据的方式:
Object get(Class c,id):通过ID加载数据,返回实体类对象,使用get加载数据的时候,如果数据不存在则返回null
Object load(Class c ,id): 通过ID加载数据,返回实体类对象,如果数据不存在,则会抛出异常
如下:
public void update(){
//真正完成数据库的操作
StuInfo pojo = (StuInfo)session.get(StuInfo.class,new Long(1));
pojo.setSName("李四");
try {
session.update(pojo);
tran.commit();//提交
} catch (Exception e) {
tran.rollback();
e.printStackTrace();
// TODO: handle exception
}
}
public void delete(){
StuInfo pojo = (StuInfo)session.get(StuInfo.class,new Long(1));
try {
session.delete(pojo);//删除
tran.commit();//提交
} catch (Exception e) {
tran.rollback();
e.printStackTrace();
// TODO: handle exception
}
}