hibernate_2、(基本的操作)

tangkenyi 贡献于2013-12-12

作者 张润华  创建于2008-09-11 17:20:00   修改者user  修改于2013-11-26 16:00:00字数7903

文档摘要:Hibernate领域对象的使用限制提供一个有无意义的标识作为主键,该属性不参与逻辑业务。提供一个无参的构造方法不要把类设计成final类型的(无法实现懒加载)配置文件分析,在配置文件中如果我们不指定一些配置信息,Hibernate会使用默认的配置信息,来配置相应的数据库的信息。
关键词:

 Hibernate 领域对象的使用限制 提供一个有无意义的标识作为主键,该属性不参与逻辑业务。 提供一个无参的构造方法 不要把类设计成final类型的(无法实现懒加载) 配置文件分析,在配置文件中如果我们不指定一些配置信息,Hibernate会使用默认的配置信息,来配置相应的数据库的信息。 public class Test { public static void main(String[] args) { Configuration cfg = new Configuration(); cfg.configure(); SessionFactory sessionFactory = cfg.buildSessionFactory(); 加载配置文件的过程是一个比较费时的操作,我们希望的是尽量减少加载的次数,所以我们可以把这个类定义成一个工具类 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); MyUser user = new MyUser(); user.setAge(22); user.setBirthday(new Date()); user.setName("username"); session.saveOrUpdate(user); tx.commit(); session.close(); System.out.println("id : " + user.getId()); } } 修改代码: public class HibernateSessionFactory { private static SessionFactory sessionFactory ; private HibernateSessionFactory(){} static{ Configuration cfg = new Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); } public static SessionFactory getSessionFactory(){ return sessionFactory ; } public static Session getSession(){ return sessionFactory.openSession() ; } } public class Test { public static void main(String[] args) { Test t = new Test(); t.addUser(); } public void addUser() { Session session = null ; Transaction tx = null ; MyUser user; try { session = HibernateSessionFactory.getSession() ; tx = session.beginTransaction(); user = new MyUser(); user.setAge(22); user.setBirthday(new Date()); user.setName("username"); session.saveOrUpdate(user); tx.commit(); } catch (HibernateException e) { if(tx != null){ tx.rollback(); } throw e; } 上述的代码可能会抛出异常信息 可用catch 进行捕捉, Hibernate 本身会对这个异常进行处理,如果我们不进行处理hibernate也会对事物进行回滚 所以,我们可以把catch代码块去掉只保留 Try{ // 代码 }finally{ // 释放资源 } finally{ if(session != null ){ session.close(); } } } } Save Persist 保存数据,Persist 在事物外不会产生insert语句 Update 更新对象,如果数据库中没有记录,会出现异常 Get 根据ID查,会立即访问数据库 Load 根据ID查(返回的是代理对象,不会立即访问数据库,只有当第一次使用对象时才会真正的访问数据库) saveOrUpdate (根据ID和version的值来确定是save或update 在配置文件中id的配置中,有一项unsave-value 用来确定一个对象是持久态还是脱管态,但是我们一般不会去修改这个属性) Hibernate 中对象的几种状态 瞬时态(transient): 对象只在内存中存在,并且没有和session相关联(一个对象呗创建后就处于transient 态)。 持久态(persistent): 数据库中有相应的数据与之对应,当前与session相关联,并且相关联的session没有关闭,事物没有提交;持久对象状态发生改变,在事物提交时,会影响到数据库中的数据(hibernate能检测并将数据同步到数据库) 脱管态(detached(也被称作游离态)): 数据库中有数据与之对应,但当前没有session与之关联;托管对象的状态发生改变,hibernate不能检测到 ·其实工具类中可以提取更多的公共的方法 public class HibernateSessionFactory { private static SessionFactory sessionFactory ; private HibernateSessionFactory(){} static{ Configuration cfg = new Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); } public static SessionFactory getSessionFactory(){ return sessionFactory ; } public static Session getSession(){ return sessionFactory.openSession() ; } /** * * @param entity * a transient instance of a persistent class * @return the generated identifier * @throws HibernateException */ public static Serializable save(Object entity) { Session session = null; Transaction tx = null ; Serializable id ; try { session = HibernateSessionFactory.getSession() ; tx = session.beginTransaction(); id = session.save(entity); tx.commit(); }finally{ if(session != null ){ session.close(); } } return id ; } public static void update(Object entity) { Session session = null; Transaction tx = null ; try { session = HibernateSessionFactory.getSession() ; tx = session.beginTransaction(); session.update(entity); tx.commit(); }finally{ if(session != null ){ session.close(); } } } public static void delete(Object entity) { Session session = null; Transaction tx = null ; try { session = HibernateSessionFactory.getSession() ; tx = session.beginTransaction(); session.delete(entity); tx.commit(); }finally{ if(session != null ){ session.close(); } } } public static Object get(Class clazz , Serializable id) { Session session = null; Object entity ; try { session = HibernateSessionFactory.getSession() ; entity = session.get(clazz, id); }finally{ if(session != null ){ session.close(); } } return entity ; } } Query 接口的使用 在query 接口中我们可以使用hql语句进行查询,可以简化我们sql语句的编写 /* * query 接口的使用 */ public void query(String name ){ Session session = null; Object entity ; try { session = HibernateSessionFactory.getSession() ; String hql = "from MyUser as user where user.name = ?"; Query query = session.createQuery(hql); query.setString(0, name); List list = query.list(); //MyUser user = (MyUser) query.uniqueResult(); 如果我们明确的指导返回值只有一个,可以使用此方法 for (Object user : list) { System.out.println(((MyUser)user).getName()); } }finally{ if(session != null ){ session.close(); } } } 在query.setString(0, name); 使用下表的方式执行容易弄错位置,所以我们可以使用 :name 这种占位符 public void query(String name ){ Session session = null; Object entity ; try { session = HibernateSessionFactory.getSession() ; String hql = "from MyUser as user where user.name = :name"; Query query = session.createQuery(hql); query.setString("name", name); List list = query.list(); for (Object user : list) { System.out.println(((MyUser)user).getName()); } }finally{ if(session != null ){ session.close(); } } } 使用hql进行分页 public void query(String name ){ Session session = null; Object entity ; try { session = HibernateSessionFactory.getSession() ; String hql = "from MyUser as user where user.name = :name"; Query query = session.createQuery(hql); query.setFirstResult 指明从那一条数据开始取数据 (0); query.setMaxResults 最多提取多少条数据 (10); query.setString("name", name); List list = query.list(); for (Object user : list) { System.out.println(((MyUser)user).getName()); } }finally{ if(session != null ){ session.close(); } } } Criteria 接口的使用 public void criteria(String name){ Session session = null ; Criteria criteria ; try { session = HibernateSessionFactory.getSession(); criteria = session.createCriteria(MyUser.class); criteria.add(Restrictions.eq("name", name)) 添加一个限制条件 Eq 的意思是equals ; criteria.add(Restrictions.gt("age", 0)); gt 的意思是 grant than 比。。大 List list = criteria.list(); for (Object user : list) { System.out.println(((MyUser)user).getName()); } }finally{ if(session != null){ session.close(); } } } 使用Nativesql 时候返回的对象是一个数组的list(List(Object[])) private static void testSQL() { Session session = null ; Transaction tx = null ; try { session = HibernateSessionFactory.getSession(); tx = session.beginTransaction(); Department dept = new Department(); dept.setDname("研发部"); dept.setLocation("雪野"); Employee emp1 = new Employee(); emp1.setDept(dept); emp1.setEname("张三"); emp1.setJob("java 研发工程师"); emp1.setSal(123.123); Employee emp2 = new Employee(); emp2.setDept(dept); emp2.setEname("张三2"); emp2.setJob("java 研发工程师"); emp2.setSal(13.123); Set emps = new HashSet(); emps.add(emp1); emps.add(emp2); dept.setEmps(emps); session.save(dept); tx.commit(); }finally{ HibernateSessionFactory.closeSession(); } } private static void query1() { Session session = null ; Transaction tx = null ; try { // Hibernate 会通过 ResultSetMetadata 来分析数据类型 session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery("select ename , sal , dname from employee e, department d where e.dept_id = d.id"); List list = query.list(); for (int i = 0; i < list.size(); i++) { Object[] obj = (Object[]) list.get(i); for (int j = 0; j < obj.length; j++) { System.out.println("ename : "+obj[0] + "; sal : "+ obj[1] +" ; dname : " + obj[2]); } } }finally{ HibernateSessionFactory.closeSession(); } } private static void query2() { Session session = null ; Transaction tx = null ; try { session = HibernateSessionFactory.getSession(); // 显示的指定 返回的结果集中每一列 是什么样的数据类型 ,不再去分析ResultSetMetadata 加快执行速度 SQLQuery query = session.createSQLQuery("select ename , sal , dname from employee e, department d where e.dept_id = d.id"); query.addScalar("ename" , Hibernate.STRING); query.addScalar("sal" , Hibernate.DOUBLE); query.addScalar("dname", Hibernate.STRING); List list = query.list(); for (int i = 0; i < list.size(); i++) { Object[] obj = (Object[]) list.get(i); for (int j = 0; j < obj.length; j++) { System.out.println("ename : "+obj[0] + "; sal : "+ obj[1] +" ; dname : " + obj[2]); } } }finally{ HibernateSessionFactory.closeSession(); } } private static void query3() { Session session = null ; Transaction tx = null ; try { session = HibernateSessionFactory.getSession(); // 将结果集直接转化为指定的类对象 次方式只有查询全部列的时候可用 SQLQuery query = session .createSQLQuery( "select e.* , d.* from employee e, department d where e.dept_id = d.id"); query.addEntity("department" ,Department.class); query.addEntity("employee" ,Employee.class); List list = query.list(); for (int i = 0; i < list.size() && i < 3; i++) { Object[] obj = (Object[]) list.get(i); for (int j = 0; j < obj.length; j++) { Department d = (Department) obj[0]; System.out.print("部门:"+d.getDname()); Employee e = (Employee) obj[1] ; System.out.println("员工:"+e.getEname()); } } }finally{ HibernateSessionFactory.closeSession(); } }

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档