🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
上篇,我们以向数据库添加操作来演示[hibernate](http://blog.csdn.net/lovesummerforever/article/details/19171571)[持久化对象的三种状态](http://blog.csdn.net/lovesummerforever/article/details/19171571)。本节继续hibernate对数据库的其他操作,删除、查询、修改。 Hibernate对数据删除操作 删除User表中个一条数据,是需要更具User表的主键id值来删除的。首先根据id值向数据库中查询出来对应的对象。可以采用两种方式一是session的get方法,一个是session的load方法。 Session的Get方法:调用这个方法会返回一个Object对象。然后我们对其强制转换。Useruser = (User)session.get(User.class,” 402881e5441c035e01441c0360510003”); 当我们传递id值在数据中查找没有相应的结果时,get方法会返回一个null值。   区别:get方法加载的时候会立刻发出sql语句去查询,而load方法在执行的时候没有立刻的发出sql去查询,生成一个代理User,没有生成真正的User。当我们真正的去用这个user的时候才会加载真正的User。Load()支持延迟加载,而Get()不支持延迟加载。Get加载的对象不存在时返回的是null对象,而Load()加载对象不存在时会抛出ObjectNotFoundException异常。   Session的Load方法:同样是调用这个方法返回一个Object对象,再进行强制转换。 然后我们通过get或load加载上来对应user表id的对象,再调用session的delete方法删除该对象同时删除表中的一条记录,代码如下所示。 第一种删除方式。 ~~~  **public**void**testDel1()           {               Sessionsession =**null**;                              **try**               {                  session= HibernateUtils.*getSession*();                  //开启事务.                  session.beginTransaction();                  //采用load查询不存在的数据,hibernate会抛出object not found exception                  Useruser = (User)session.load(User.**class**,"402881e5441c035e01441c0360510003");                                    //删除表中的记录.                  //删除,建议用此种方式删除,先加载再删除.                  session.delete(user);                                    //提交事务.把内存的改变提交到数据库上.                  session.getTransaction().commit();                                 }**catch**(Exception e){                  e.printStackTrace();                  session.getTransaction().rollback();               }**finally**{                  HibernateUtils.*closeSession*(session);               }           } ~~~ 第二种删除方式,手动构造detached对象再删除。代码如下所示。 ~~~  //测试方法以test开头.测试del方法.返回存在的加载的.           **public**void**testDel2()           {               Sessionsession =**null**;                              **try**               {                  session= HibernateUtils.*getSession*();                  //开启事务.                  session.beginTransaction();                                    //手动构造的Detached对象.                  Useruser =**new**User();                  user.setId("402881e4441b3d1c01441b3f5dfe0001");                  session.delete(user);                                                      //提交事务.把内存的改变提交到数据库上.                  session.getTransaction().commit();                                 }**catch**(Exception e){                  e.printStackTrace();                  session.getTransaction().rollback();               }**finally**{                  HibernateUtils.*closeSession*(session);               }           } ~~~ Hibernate对数据查询操作 一般查询,代码如下所示。 //查询方法. ~~~  **public**void**testQuery1()  {     Sessionsession =**null**;     **try**     {        session= HibernateUtils.*getSession*();                session.beginTransaction();        //参数是一个字符串,是HQL的查询语句.注意此时的的UserU为大写,为对象的,而不是表的.        Queryquery = session.createQuery("from User");                //使用List方法.        ListuserList = query.list();        //迭代器去迭代.        **for**(Iteratoriter=userList.iterator();iter.hasNext();)        {           Useruser =(User)iter.next();           System.*out*.println("id="+user.getId() + "name="+user.getName());        }                session.getTransaction().commit();     }**catch**(Exception e){        e.printStackTrace();        session.getTransaction().rollback();     }**finally**{        HibernateUtils.*closeSession*(session);     }  } ~~~ 分页查询,代码如下所示。 //分页查询,从什么地方查,查几个; ~~~  **public**void**testQuery2()  {     Sessionsession =**null**;     **try**     {        session=HibernateUtils.*getSession*();                session.beginTransaction();        //参数是一个字符串,是HQL的查询语句.注意此时的的UserU为大写,为对象的,而不是表的.        Queryquery = session.createQuery("from User");        //从第一个开始查起.可以设置从第几个查起.        query.setFirstResult(0);        //最大条数为两个        query.setMaxResults(2);                //使用List方法.        ListuserList = query.list();        //迭代器去迭代.        **for**(Iteratoriter=userList.iterator();iter.hasNext();)        {           Useruser =(User)iter.next();           System.*out*.println("id="+user.getId() + "name="+user.getName());        }        session.getTransaction().commit();     }**catch**(Exception e){        e.printStackTrace();        session.getTransaction().rollback();     }**finally**{        HibernateUtils.*closeSession*(session);     }  } ~~~ Hibernate对数据更新操作 手动构造detached对象,调用session的update()方法,代码如下所示。 ~~~           //测试方法以test开头.测试update方法.返回存在的加载的.           **public**void**testUpdate1()           {               Sessionsession =**null**;                              **try**               {                  session= HibernateUtils.*getSession*();                  //开启事务.                  session.beginTransaction();                  //采用load查询不存在的数据,hibernate会抛出object not found exception                                    //手动构造的Detached对象.                  Useruser =**new**User();                  user.setId("402881e5441bfb0601441bfb075b0002");                  user.setName("周六");                                    session.update(user);                                                      //提交事务.把内存的改变提交到数据库上.                  session.getTransaction().commit();                                 }**catch**(Exception e){                  e.printStackTrace();                  session.getTransaction().rollback();               }**finally**{                  HibernateUtils.*closeSession*(session);               }           } ~~~ 加载对象,调用session的update()方法,让对象处于持久化状态的时候进行更新操作,代码如下所示。 ~~~  //测试方法以test开头.测试update方法.返回存在的加载的.           **public**void**testUpdate2()           {               Sessionsession =**null**;               **try**               {                  session= HibernateUtils.*getSession*();                  //开启事务.                  session.beginTransaction();                  //采用load查询不存在的数据,hibernate会抛出object not found exception                                    //先把要更新的查出来.                  //建议采用此种方式,先加载再更新的方式.                  Useruser = (User)session.load(User.**class**,"402881e5441bfb0601441bfb075b0002");                  //查出来的话就直接放入了.处于持久化状态.                  user.setName("周日");                  //显示的调用,因为为持久化状态也可以不显示调用.                  session.update(user);                  //提交事务.把内存的改变提交到数据库上.                  session.getTransaction().commit();               }**catch**(Exceptione){                  e.printStackTrace();                  session.getTransaction().rollback();               }**finally**{                  HibernateUtils.*closeSession*(session);               }           } ~~~