您好,欢迎访问三七文档
当前位置:首页 > 生活休闲 > 科普知识 > 8hibernate对持久化对象的操作
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集合。条件查询创建一个Criteria实例•Queryql1=session.createQuery(fromAuthors);•ql1.setFirstResult(10);//从什么地方开始取值•ql1.setMaxResults(5);//最多取几条•Listls1=ql1.list();•System.out.println(ls1.size());分组统计查询•Queryql=session.createQuery(selecttype,sum(price)fromTitlesgroupbytype);•Listls=ql.list();•for(inti=0;ils.size();i++){•Objectob[]=(Object[])ls.get(i);•for(intj=0;j•if(ob[j]!=null){•System.out.println(ob[j].toString());•}•}大小写敏感性•除了Java类和属性名称外,查询都是大小写不敏感的。所以,SeLeCT和sELEct以及SELECT相同的,但是net.sf.hibernate.eg.FOO和net.sf.hibernate.eg.Foo是不同的,foo.barSet和foo.BARSET也是不同的。from子句•最简单的Hibernate查询是这样的形式:•fromeg.Cat•它简单的返回所有eg.Cat类的实例。•大部分情况下,你需要赋予它一个别名(alias),因为你在查询的其他地方也会引用这个Cat。•fromeg.Catascat•上面的语句为Cat赋予了一个别名cat。所以后面的查询可以用这个简单的别名了。from子句•as关键字是可以省略的,我们也可以写成这样:•fromeg.Catcat可以出现多个类,结果是它们的笛卡尔积,或者称为“交叉”连接。•fromFormula,ParameterfromFormulaasform,Parameterasparam•让查询中的别名服从首字母小写的规则,我们认为这是一个好习惯。这和Java对局部变量的命名规范是一致的。(比如,domesticCat).SQL查询除了上面的几种查询,Hibernate还支持原生态的SQL查询,SQL查询是通过SQLQuery接口来表示的。SQLQuery接口是Query接口的子接口,所以它可以调用Query接口的方法,例如:setFirstResult():设置返回结果集的起始点。setMaxResult():设置查询获取的最大记录。list():返回查询到的结果集。除此之外,SQL查询还提供了自已的两个方法:addEntity():将查询到的记录与指
本文标题:8hibernate对持久化对象的操作
链接地址:https://www.777doc.com/doc-3813431 .html