为工程准备了环境后,就可以通过Hibernate API操纵数据库。Hibernate内部也是采用JDBC来访问数据库的。下面两张图,来看一下JDBC API和Hibernate API两种方式是怎样来访问数据库的:
使用Hibernate操作数据库包括7个步骤:
(1)读取并解析配置文件
Configueation conf=new Configueation ().configure();
(2)读取并解析映射文件,创建SessionFactory对象。
SessionFactory sf=conf.buildSessionFactory();
(3)打开Session
Session session=sf.openSession();//或者使用 sf.getCurrentSession();
(4)开始一个事务(增删改操作必须,查询操作可选)
Transaction tx=session.beginTransaction();
(5)数据库操作
session.save(sure);//保存操作
(6)结束事务
tx.commint();//提交事务
tx.rollback();//回滚事务
(7)关闭 session
session.close();
使用Hibernate实现按主键查询
在进行修改和删除操作时,应先加载对象,然后再执行修改或删除操作。Hibernate提供了两种方法按照主键加载对象:get()和load()方法。
Object get(Class clazz,Serializable id).
Object load(Class theClass,Serializable id).
虽然两个方法都能够加载对象,但他们是有区别的,下面通过代码演示:
get()方法加载 示例:
//测试 public class test { SessionFactory sf=null; Session sess=null; Transaction tx=null; Configuration conf=null; dept dt=null; //查询 public void index(){ try { //读取配置文件 conf=new Configuration().configure(); //创建sessionfactory sf=conf.buildSessionFactory(); //打开seccion sess=sf.openSession(); //加载数据操作 dept dt=(dept)sess.get(dept.class,10); //输出数据 System.out.println(dt.getDeptno()); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally{ //关闭session sess.close(); } } }
其中,使用get()方法查询主键为10的信息,如果表中没有主键为10的数据,get()方法返回的是null。
load()方法加载 示例:
//测试 public class test { SessionFactory sf=null; Session sess=null; Transaction tx=null; Configuration conf=null; dept dt=null; //查询 public void index(){ try { //读取配置文件 conf=new Configuration().configure(); //创建sessionfactory sf=conf.buildSessionFactory(); //打开seccion sess=sf.openSession(); //加载数据操作 dept dt=(dept)sess.load(dept.class,10); //输出数据 System.out.println(dt.getDeptno()); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally{ //关闭session sess.close(); } } }
是的,没看错,代码一样,唯一不同的是此代码是使用load()方法按主键查询的,而当数据表中没有主键为10的数据时,系统运行到dt.getDeptno()时会抛出异常。
使用Hibernate实现数据库的增删改操作
增加操作代码示例:
//使用hibernate实现增加操作 public void add(){ dept dt=null; Configuration conf=null; SessionFactory sessionfactory=null; Session session=null; Transaction tx=null; try { //读取配置文件 conf=new Configuration().configure(); //创建SessionFactory sessionfactory=conf.buildSessionFactory(); //打开session session=sessionfactory.openSession(); //开始一个事务 tx=session.beginTransaction(); //持久化操作 dt=new dept(); dt.setDeptno(5); dt.setDname("wxn"); dt.setDpwd("123"); session.save(dt); //提交事务 tx.commit(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally{ session.close(); } }
这时候刷新数据库表,就可以看到插入的数据:
下面是如何使用Hibernate修改和删除数据。对于Hibernate这种OMR工具,操作都是针对对象的。要修改和删除数据,首先要获得数据,然后在进行修改和删除数据。
修改操作代码示例:
//使用hibernate实现修改操作 public void update(){ try { //读取配置文件 conf=new Configuration().configure(); //创建SessionFactory sessionfactory=conf.buildSessionFactory(); //打开session session=sessionfactory.openSession(); //开始一个事务 tx=session.beginTransaction(); //持久化操作,获得对象 //注意强制类型转换 dt=(dept)session.load(dept.class, 5); //更改数据 dt.setDname("lwx"); //提交事务 tx.commit(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally{ session.close(); }
在使用Hibenate修改数据时,首先要加载对象,然后修改对象的属性,最后提交事务。Hibernate会生成并执行最该的SQL语句。
与修改数据类似,删除时也要先加载数据。在使用Hibernate编写持久化代码时,业务不需要再有数据库表,字段等概念。从面向业务领域对象的角度,要删除的是某个业务对象。以面向对象的方式编写代码是Hibernate持久化操作接口设计的一个理念。
删除操作代码示例:
//使用hibernate实现删除操作 public void delete(){ try { conf=new Configuration().configure(); sessionfactory=conf.buildSessionFactory(); session=sessionfactory.openSession(); tx=session.beginTransaction(); dt=(dept)session.load(dept.class, 5); session.delete(dt); //提交事务 tx.commit(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally{ session.close(); } }
这时候数据库表中id为5的信息已被删除。
需要注意的是:增删改操作一定要在事务环境中完成。