五 hibernate3的增删查改操作实现
基本功能练习实验步骤:1.设计domain对象User。2.设计UserDao接口。3.加入hibernate.jar和其依赖的包。4.编写User.hbm.xml映射文件,可以基于hibernate/eg目录下的org/hibernate/auction/User.hbm.xml修改。5.编写hibernate.cfg.xml配置文件,可以基于hibernate/etc/hibernate.cfg.xml修改;必须提供的几个参数:connection.driver_class、connection.url、connection.username、connection.password、dialect、hbm2ddl.auto。6.编写HibernateUtils类,主要用来完成Hibnerate初始化和提供一个获得Session的方法;这步可选。7.实现UserDao接口。1 设计对象package cn.domain;import java.util.Date;/** * Domain是一个领域模型 * 什么是领域模型呢 比如说一个人员 就有姓名 性别 年龄 职位等信息 * 这些信息组合在一起就是领域模型 * 当前这是一个人员实体类的领域模型 * @author Administrator */public class Person {//id private int pid; //姓名 private String pname; //性别 private String psex; //年龄 private int page; //职业 private String pduty; //出生日 private Date birthday;public int getPid() {return pid;}public void setPid(int pid) {this.pid = pid;}public String getPname() {return pname;}public void setPname(String pname) {this.pname = pname;}public String getPsex() {return psex;}public void setPsex(String psex) {this.psex = psex;}public int getPage() {return page;}public void setPage(int page) {this.page = page;}public String getPduty() {return pduty;}public void setPduty(String pduty) {this.pduty = pduty;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}}2.设计接口。package cn.domain.dao;import java.util.List;import cn.domain.Person;public interface PersonDao { public void savePerson(Person person)throws Exception; public void deleteByidPerson(int id); public void deletePerson(Person person)throws Exception; public List findPerson(); public List findPersonName(String name); public List findPersonPsex(String psex); public Person findbyidPerson(int id); public boolean updatePerson(Person person)throws Exception;}3.加入hibernate.jar和其依赖的包。4.编写Person.hbm.xml映射文件,可以基于hibernate/eg目录下的org/hibernate/auction/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="cn.domain"><class name="Person"><id name="pid"><generator /></session-factory></hibernate-configuration>6.编写HibernateUtils类,主要用来完成Hibnerate初始化和提供一个获得Session的方法;这步可选。package cn.domain.uitl;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtil { private static SessionFactory sessionFactory; /** * 不可继承 */ private HibernateUtil(){ } /** * 单例 */ static{ Configuration cfg=new Configuration().configure(); /** * 获取SessionFactory对象 这个对象保存的就是配置文件中的 session-factory配置的信息 */ sessionFactory=cfg.buildSessionFactory(); System.out.print("打开连接成功!"); } public static SessionFactory getSessionFactory(){ return sessionFactory; } public static Session getSession(){ return sessionFactory.openSession(); }} 7.实现UserDao接口。package cn.domain.dao.imp;import java.util.List;import org.hibernate.Criteria;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.criterion.Restrictions;import cn.domain.Person;import cn.domain.dao.PersonDao;import cn.domain.uitl.HibernateUtil;public class PersonDaoimp implements PersonDao {@Overridepublic void deleteByidPerson(int id) {Session session = null;Transaction tx = null;try {session = HibernateUtil.getSession();tx=session.beginTransaction();String hql = "delete from Person as p where p.pid=:id";Query q = session.createQuery(hql);q.setInteger("id", id);q.executeUpdate();tx.commit();} catch (Exception e) {tx.rollback();e.printStackTrace();} finally { if(session!=null) { session.close(); }}}@Overridepublic void deletePerson(Person person) throws Exception {Session session = null;Transaction tx = null;try {session = HibernateUtil.getSession(); tx=session.beginTransaction();session.delete(person);} catch (Exception e) {tx.rollback();e.printStackTrace();} finally { if(session!=null) { session.close(); }} }@Overridepublic List findPerson() {List list=null;Session session = null;try {session = HibernateUtil.getSession();String hql = "from Person as p";Query q = session.createQuery(hql);list=q.list();} catch (Exception e) {// TODO: handle exception} finally { if(session!=null)session.close();}return list;}@Overridepublic List findPersonName(String name) {List list=null;Session session = null;try {session = HibernateUtil.getSession(); Criteria ct=session.createCriteria(Person.class); ct.add(Restrictions.eq("pname", name)); list=ct.list(); return list;} catch (Exception e) {// TODO: handle exception} finally { if(session!=null)session.close();}return list;}@Overridepublic List findPersonPsex(String psex) {List list=null;Session session = null;try {session = HibernateUtil.getSession();String hql = "from Person as p where p.psex=?";Query q = session.createQuery(hql);q.setString(0,psex);list=q.list();} catch (Exception e) {// TODO: handle exception} finally { if(session!=null)session.close();}return list;}@Overridepublic Person findbyidPerson(int id) {List list=null;Session session = null;Person person=new Person();try {session = HibernateUtil.getSession();person =(Person)session.get(Person.class, id);} catch (Exception e) {// TODO: handle exception} finally { if(session!=null)session.close();}return person;}@Overridepublic void savePerson(Person person) throws Exception {Session session = null;Transaction tx = null;try {session = HibernateUtil.getSession();tx=session.beginTransaction();session.save(person); tx.commit();} catch (Exception e) {tx.rollback();e.printStackTrace();} finally { if(session!=null) { session.close(); }} }@Overridepublic boolean updatePerson(Person person) throws Exception {boolean flg=false;Session session = null;Transaction tx = null;try {session = HibernateUtil.getSession();tx=session.beginTransaction();session.update(person); tx.commit(); flg=true;} catch (Exception e) {tx.rollback();e.printStackTrace();} finally { if(session!=null) { session.close(); }} return flg;}}测试 package cn.domain.test;import java.util.Date;import java.util.Iterator;import java.util.List;import cn.domain.Person;import cn.domain.dao.PersonDao;import cn.domain.dao.imp.PersonDaoimp;public class PersonTest {/** * @param args */public static void main(String[] args)throws Exception {PersonDao pd=new PersonDaoimp();//Person person=new Person();//person.setPname("力大力");//person.setPsex("女");//person.setPage(26);//person.setBirthday(new Date());//person.setPduty("高级开发人员"); //pd.savePerson(person); //pd.deleteByidPerson(1); List list=null;// list=pd.findPerson();// Iterator iter = list.iterator() ; // while(iter.hasNext()){// Person p=(Person)iter.next();// System.out.println(p.getPname());// } // list=pd.findPersonName("许春荣");// Iterator iter=list.iterator();// while(iter.hasNext()){// Person p=(Person)iter.next();// System.out.println(p.getPname()+"--------->"+p.getPduty());// } // pd.deleteByidPerson(9); Person person=new Person(); person.setPid(10);person.setPname("蔡国庆");person.setPsex("女");person.setPage(23);person.setBirthday(new Date());person.setPduty("高级开发人员");pd.updatePerson(person);}}总结:在接口的实现类中 不要去使用定义一个无参的构造方法,在这个构造方法中实现连接工厂的获取 SessionFactory Session, Transaction的事务开启 因为这样在实现的方法中的Session的对象的关闭就不好控制,它是基于一个对象,比如说在实现的方法中执行了关闭Session对象 这样做的目的是为了减少内存不必要的开销,优化性能,但是这样一来,如果连续进行跟数据库的访问,那么就会出现会话关闭,而无法访问的情况 所以必须在实现的方法中去获取连接Session对象和Transaction的事务操作对象 end ?