您好,欢迎访问三七文档
当前位置:首页 > 生活休闲 > 科普知识 > hibernate对持久化对象的操作
LOGO第8章Hibernate对持久化对象操作刘高原主要内容Session常用方法12HQL查询5持久对象的生命周期3Session的常用方法Session的save()方法Session的save()方法用来对持久化对象进行保存,对应到数据库中就是向数据库表中插入一条记录。例如,在第一个Hibernate的程序中有以下代码片段://插入一条记录方法publicvoidsaveUser(){Transactiont1=session.beginTransaction();Useruser=newUser();user.setUsername(Jack);user.setPassword(123456);session.save(user);t1.commit();}如果在Hibernate的核心配置文件中加入语句:propertyname=hibernate.show_sqltrue/property运行程序时,就会在控制台显示出对应执行的SQL语句,该段代码对应显示的SQL语句为:insertintouserTable(username,password)values(?,?)Session的get()和load()方法Session的get()和load()方法都是用来加载持久化类对象的,例如:Useruser=(User)session.get(User.class,1);//或Useruser=(User)session.load(User.class,1);用来获取id为1的User的对象,但两者是有区别的。当数据库表中不存在id为1的值时,使用get()方法返回null,而用load()方法则会抛出异常。load()查询会先到缓存中去查,如果没有则返回一个代理对象(不马上到数据库中查找),等到后面使用这个代理对象的时候,才到数据库中查找相应的信息。若还是没有找到就抛出异常。get()查询则是先到缓存中去查,如果没有就直接到数据库中查询,还没有的话就返回null。load()查询支持延迟加载,所谓延迟加载就是用到后才到数据库中查询,从上面一条的查询方式中也可以看出,load()支持延迟加载,而get()查询不支持。延迟加载是由映射文件中class标签的lazy属性控制的,默认值为true,即延迟加载,如果设置该属性为false,即立即加载。Session的delete()方法Session的delete()方法用来对持久化对象进行删除操作,对应数据库中就是删除数据库表的一条记录。在进行删除之前,必须先得到要删除的持久化对象。例如://删除一条记录publicvoiddeleteUser(){Transactiont3=session.beginTransaction();Useruser=(User)session.get(User.class,1);session.delete(user);t3.commit();}事务提交后,执行SQL语句:deletefromuserTablewhereid=?完成对数据库表记录的删除操作。Session的update()方法Session的update()方法用于对持久化对象进行修改操作,对应数据库中就是修改数据库表的一条记录。在进行修改之前,必须先得到要修改的持久化对象。例如://修改一条记录publicvoidupdateUser(){Transactiont2=session.beginTransaction();Useruser=(User)session.get(User.class,1);user.setUsername(Jacy);session.update(user);t2.commit();}事务提交后,执行SQL语句:updateuserTablesetusername=?,password=?whereSession的saveOrUpdate()方法Session的saveOrUpdate()方法用于根据对象的不同情况来分别进行处理。如果指定对象是临时建立的一个对象(new出来的对象),即数据库中没有相应记录,执行saveOrUpdate()方法就相当于执行save()方法;如果指定对象是游离对象,即数据库中取出对象在数据库中存在,执行saveOrUpdate()方法就相当于执行update()方法。例如:publicvoidsaveOrUpdate(){Transactiont3=session.beginTransaction();Useruser;user=(User)session.get(User.class,2);if(user==null){user=newUser();//如果没有就创建一个新的,将被保存user.setUsername(yabber);user.setPassword(123456);}else{user.setPassword(654321);//如果有就修改密码}session.saveOrUpdate(user);t3.commit();}HQL查询HQL是HibernateQueryLanguage的缩写。HQL的语法很像SQL的语法,但HQL是一种面向对象的查询语言。SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。HQL的查询依赖于Query类,每个Query实例对应一个查询对象。例如下面的语句:Queryquery=session.createQuery(fromUser);基本查询基本查询是HQL中最简单的一种查询方式。下面以用户信息为例说明其几种查询情况。(1)查询所有用户信息,其代码如下:…Transactionts=session.beginTransaction();Queryquery=session.createQuery(fromUser);Listlist=query.list();ts.commit();…执行上面的代码片段,得到一个List的对象,可遍历该对象得出每个用户的信息。(2)查询某个用户信息,其代码如下:...Transactionts=session.beginTransaction();//查询出所有用户,并按id排序Queryquery=session.createQuery(fromUserorderbyiddesc);query.setMaxResults(1);//设置最大检索数目为1,表示查询1条记录Useruser=(User)query.uniqueResult();//装载单个对象ts.commit();...执行上面的代码片段,得到单个对象“user”。(3)查询满足条件的用户信息,其代码如下:...Transactionts=session.beginTransaction();//查询用户名为yabber的用户信息Queryquery=session.createQuery(fromUserwhereusername=yabber);Listlist=query.list();ts.commit();...基本查询条件查询按指定参数查询。...Transactionts=session.beginTransaction();//根据用户名查询用户信息Queryquery=session.createQuery(fromUserwhereusername=?);query.setParameter(0,yabber);Listlist=query.list();ts.commit();...执行上面的代码片段,得到所有符合条件的List集合。使用范围运算查询。...Transactionts=session.beginTransaction();//查询这样的用户信息,用户名为jack或jacy且id在1~10之间Queryquery=session.createQuery(fromUserwhere(idbetween1and10)andusernamein('jack','jacy'));Listlist=query.list();ts.commit();...使用比较运算符查询。...Transactionts=session.beginTransaction();//查询id大于5且用户名不为空的用户信息Queryquery=session.createQuery(fromUserwhereid5andusernameisnotnull);Listlist=query.list();ts.commit();...执行上面的代码片段,得到符合条件的用户的List集合。条件查询使用字符串匹配运算查询。...Transactionts=session.beginTransaction();//查询用户名中包含“a”字符且密码前面三个字符为“123”的所有用户信息Queryquery=session.createQuery(fromUserwhereusernamelike'%a%'andpasswordlike'123%');Listlist=query.list();ts.commit();...执行上面的代码片段,得到符合条件的用户的List集合。条件查询SQL查询除了上面的几种查询,Hibernate还支持原生态的SQL查询,SQL查询是通过SQLQuery接口来表示的。SQLQuery接口是Query接口的子接口,所以它可以调用Query接口的方法,例如:setFirstResult():设置返回结果集的起始点。setMaxResult():设置查询获取的最大记录。list():返回查询到的结果集。除此之外,SQL查询还提供了自已的两个方法:addEntity():将查询到的记录与指定的实体关联。addScalar():指定返回的记录及类型。例如,选择要查询前面用例中的“Person”表中的所有记录,然后关联成程序中的“Person”类,代码应为:...Transactionts=session.beginTransaction();SQLQuerysqlquery=session.createSQLQuery(select*fromPersonaspwhereid1);sqlquery.addEntity(p,Person.class);Listlist=sqlquery.list();ts.commit();session.close();Iteratorit=list.iterator();while(it.hasNext()){Personperson=(Person)it.next();System.out.print(person.getId()+);System.out.println(person.getName());}...SQL查询上面代码是应用程序中的主要代码部分,功能是查询“id1”的Person对象,运行应用程序,控制台输出查询结果及SQL语句,如图10.1所示。图10.1运行后控制台输出SQL查询持久对象的生命周期1.transient(瞬时态)瞬时态,即实体对象在内存中的存在与数据库中的记录无关。例如下面的代码:Studentstu=newStudent();//这时就为Student分配了一个内存空间stu.setSnumber(081101);stu.setSname(李方方);stu.setSage(21);这里的“stu”对象,与数据库中的记录没有任何关联,这时的“stu”对象成为“瞬时态”。•2.persisent(持久态)•持久态是指对象处于由Hibernate框架所管理的状态。在这种状态下,实体对象的引用被纳入Hibernate实体容器中加以管理。处于持久状态的对象,其变更将由Hibernate固化到数据库中。例如下面的代码。•处于瞬时状态的对象,可以通过Session的save()方法转换成persist
本文标题:hibernate对持久化对象的操作
链接地址:https://www.777doc.com/doc-3977160 .html