ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:84.41KB ,
资源ID:5957340      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5957340.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Hibernate常规用法见解.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Hibernate常规用法见解.docx

1、Hibernate常规用法见解 Hibernate常用API详解根据个人使用Hibernate的经验,介绍一下Hibernate的多种不同的查询和CUD操作,这些东西在日常开发中非常常用,希望对大家有所帮助。以下示例均以两张表为例:member和userinfo,member帐号信息表外键关联userinfo用户基本信息表,主键自动生成即可然后映射出的POJO如下:public class Userinfoimplements Serializable/ primary keyprivatejava.lang.Integerid;/ fieldsprivatejava.lang.Stringn

2、ame;privatejava.lang.Stringcode;privatejava.lang.Stringbirthday;privatejava.lang.Stringaddress;privatejava.util.DatecreateTime;privatejava.lang.IntegerdeleteFlag;/ collectionsprivatejava.util.Setmembers;/省略getter setterpublic class Member implements Serializable/ primary keyprivatejava.lang.Integeri

3、d;/ fieldsprivatejava.lang.StringloginCode;privatejava.lang.Stringpassword;privatejava.lang.IntegerdeleteFlag;/ many to oneprivatecom.bless.model.UserinfofkUserinfo;/省略getter setter1、Hibernate提供多种方法查询数据库数据下面以一个最简单的查询为例:SELECT * FROM TABLE为例1-1简单HQL语句查询Hibernate提供了HQL查询,HQL是Hibernate推荐语句,它屏蔽了不同数据库SQL

4、不兼容的问题,使用HQL写的查询语句在主流数据库上都能执行。执行HQL需要创建Query对象:getSession().createQuery(hql语句);简单HQL格式:FROM POJO对应SQL语句:SELECT * FROM POJO对应的表名千万注意:HQL语句中的表名和字段名不是数据库的表名和字段名,而是对应ORM映射POJO的类名和属性名!Java代码1. Queryquery=baseDao.getQuery(FROMMember);2. ListlstM=query.list();3. for(Membermember:lstM)4. System.out.println(

5、id:+member.getId()+fk_id:+member.getFkUserinfo().getId();5. 结果:一句SQL将所有结果查询出来如果修改一下for循环的代码,查询FK的name:Java代码1. for(Membermember:lstM)2. System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getName();3. 结果:一句SQL查询Member表,每一次for循环又发一句SQL查询Userinfo表总结:被查询表中如果有外键关联,在执行查询时能将外键关联字段的值查询出来,但如

6、果想查询关联表的其它字段会另外发SQL,这个特别要注意!1-2简单SQL语句查询Hibernate同样支持写SQL,对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口Java代码1. SQLQuerysql=baseDao.getSQLQuery(SELECT*FROMmember);2. /查询出的结果放到指定POJO中3. sql.addEntity(Member.class);4. ListlstM=sql.list();5. for(Membermember:lstM)6. System.out.printl

7、n(id:+member.getId()+fk_id:+member.getFkUserinfo().getId();7. 结果:一句SQL将所有结果查询出来如果修改一下for循环的代码,查询FK的name,结果与前面使用HQL查询一样:一句SQL查询Member表,随后每一次for循环又发一句SQL查询Userinfo表1-3Hibernate条件查询(Criteria)HQL极为强大,但是有些人希望能够动态的使用一种面向对象API创建查询,而非在他们的Java代码中嵌入字符串。对于那部分人来说,Hibernate提供了直观的Criteria查询API。获取Hibernate的Criteri

8、a对象方法:getSession().createCriteria(Class对象);Java代码1. Criteriacrit=baseDao.getCriteria(Member.class);2. ListlstM=crit.list();3. for(Membermember:lstM)4. System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId();5. 其实上面这种方式就是发了一句SQL:SELECT * FROM member结果:一句SQL将所有结果查询出来如果修改一下for循环的代码,

9、查询FK的name,结果与前面情况一样2、在简单的select from table基础上,加上分页和排序以此为例:查询第11条20条数据,按照ID降序排列2-1使用HQLJava代码1. Queryquery=baseDao.getQuery(FROMMembermORDERBYm.idDESC);2. query.setFirstResult(10);3. query.setMaxResults(10);4. ListlstM=query.list();5. for(Membermember:lstM)6. System.out.println(id:+member.getId()+fk_

10、id:+member.getFkUserinfo().getId();7. 2-2使用SQLJava代码1. SQLQuerysql=baseDao.getSQLQuery(SELECT*FROMmembermORDERBYm.idDESC);2. sql.setFirstResult(10);3. sql.setMaxResults(10);4. /查询出的结果放到指定POJO中5. sql.addEntity(Member.class);6. ListlstM=sql.list();7. for(Membermember:lstM)8. System.out.println(id:+mem

11、ber.getId()+fk_id:+member.getFkUserinfo().getId();9. 2-3使用CriteriaJava代码1. Criteriacrit=baseDao.getCriteria(Member.class);2. crit.setFirstResult(10);3. crit.setMaxResults(10);4. crit.addOrder(Order.desc(id);5. ListlstM=crit.list();6. for(Membermember:lstM)7. System.out.println(id:+member.getId()+fk_

12、id:+member.getFkUserinfo().getId();8. 3、数据库查询核心是条件,绝大多数SQL都会带有WHERE子句,下面介绍简单的WHERE查询以此为例:SELECT * FROM member m WHERE m.login_code like kaka% AND m.password in (12345,123451,123452) AND m.delete_flag=0;这里面有like、in和=三种查询特别注意:绝对不推荐直接在SQL语句后面拼接参数值:“* WHERE id=”+id+” AND name like ”+name+”%”;这种方式可能会造成很严

13、重的后果:每一个不同的id值都会在内存中创建一个SQL请求对象,如果id多并且多次执行该句SQL很可能出现宕机状况!推荐使用下面这些赋值方式,下面的方式都只会在内存中创建一个SQL请求对象。3-1-1使用HQL“WHERE字段=?”的形式给条件赋值这种打?号传值的方式在JDBC是非常常见的了,使用HQL语句也可以通过这种方式赋值:Java代码1. Queryquery=baseDao.getQuery(FROMMembermWHEREm.loginCodeLIKE?ANDm.passwordin(?,?,?)ANDm.deleteFlag=?);2. query.setParameter(0,

14、kaka%);3. query.setParameter(1,12345);4. query.setParameter(2,123451);5. query.setParameter(3,123452);6. query.setParameter(4,0);7. ListlstM=query.list();8. for(Membermember:lstM)9. System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId();10. 通过query.setParameter(int,Obejct)方法即可给每

15、个?赋值,注意第一个参数是从下标0开始!3-1-2使用HQL“WHERE字段=:key”的形式给条件赋值这种赋值方式是HQL特有的,什么意思呢,直接看例子分析:Java代码1. Queryquery=baseDao.getQuery(FROMMembermWHEREm.loginCodeLIKE:codeANDm.passwordin(:pwd)ANDm.deleteFlag=:flag);2. query.setParameter(code,kaka%);3. query.setParameterList(pwd,newString12345,123451,123452);4. query.

16、setParameter(flag,0);5. ListlstM=query.list();6. for(Membermember:lstM)7. System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId();8. 上面例子关键代码是Query调用setParameter(String,Object)和setParameterList两个方法,前者是赋单一值,后者是赋多个值(特别适合in查询赋值)。这两种赋值方法都需要传两参数:第一个参数是key值,对应HQL语句中的“:xxx”;第二个参数是value值

17、,就对应key的实际值。这种传值比3-1-1更准确方便:一来不用担心下标错位的问题,二来如果存在”xx,xx,xx”这种格式的参数可以使用setParameterList方法,屡试不爽!3-2-1使用SQL“WHERE字段=?”的形式给参数赋值Java代码1. SQLQuerysql=baseDao.getSQLQuery(SELECT*FROMMembermWHEREm.login_codeLIKE?ANDm.passwordin(?,?,?)ANDm.delete_flag=?);2. sql.setParameter(0,kaka%);3. sql.setParameter(1,1234

18、5);4. sql.setParameter(2,123451);5. sql.setParameter(3,123452);6. sql.setParameter(4,0);7. sql.addEntity(Member.class);8. ListlstM=sql.list();9. for(Membermember:lstM)10. System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId();11. 上面这段代码与3-1-2的代码极其相似,但是有以下几点区别:使用SQLQuery的形式查询;SQL

19、语句m.login_code和m.delete_flag与前面的HQL里面不对应,前面说了HQL里面对应的是POJO(也就是Member类)的属性,而SQL语句是直接对应数据库的字段名!3-2-2使用SQL“WHERE字段=:key”的形式给条件赋值注意这种key/value赋值的形式是通过SQLQuery对象创建的SQL才能用,下面这段代码是能查询出结果的Java代码1. SQLQuerysql=baseDao.getSQLQuery(SELECT*FROMMembermWHEREm.login_codeLIKE:codeANDm.passwordin(:pwd)ANDm.delete_fl

20、ag=:flag);2. sql.setParameter(code,kaka%);3. sql.setParameterList(pwd,newString12345,123451,123452);4. sql.setParameter(flag,0);5. sql.addEntity(Member.class);6. ListlstM=sql.list();7. for(Membermember:lstM)8. System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId();9. 3-3使用Criter

21、ia来实现查询其实Criteria出现的主要原因就是为了处理复杂的条件查询,开发人员在使用SQL编写复杂查询条件时很容易出错,Hibernate就提供了Criteria这样一个方便的API,开发人员用Java来写查询条件,最后由Hibernate转换成SQL去执行。Java代码1. Criteriacrit=baseDao.getCriteria(Member.class);2. crit.add(Restrictions.like(loginCode,kaka%);3. crit.add(Restrictions.in(password,newString12345,123451,12345

22、2);4. crit.add(Restrictions.eq(deleteFlag,0);5. ListlstM=crit.list();6. for(Membermember:lstM)7. System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId();8. Criteria对象通过add方法添加查询条件,Restrictions提供了各种各样的查询条件API:like、in、eq、between、or等等。这里要注意一点:像Restrictions.like(key,value)这些方法的key就是P

23、OJO中的属性,而不是数据库中的字段!4、有时候我们调用SQL时不希望查询出表的所有字段(特别是大数据量项目更要考虑),使用纯JDBC写这样的SQL就能实现,但是如果用JDBC,得到值后还要通过ResultSet.getXXX来获取对应数据,这种方式非常麻烦。Hibernate提供了很多解决方案,使我们摆脱频繁的getXX操作。以此为例:我希望查询Member表的id和fk_userinfo这两个字段4-1HQL获取指定字段推荐采用面向对象的形式来实现什么意思呢,假设Member类有一个构造函数Member(int id,int fkId),我们通过new Member(xx,xx)赋值这样就

24、把值放入Member中了,使用HQL也是这样的:第一步编写Member构造函数Java代码1. publicBaseMember(Integerid,IntegerfkId)2. this.id=id;3. UserinfofkUserinfo=newUserinfo(fkId);4. this.fkUserinfo=fkUserinfo;5. 第二步编写HQL,注意看SELECT后面的写法,这种写法看起来非常像Java的new Member是吧,只要这样写,通过Query.list()返回的结果就直接存放在List中了Java代码1. Queryquery=baseDao.getQuery(

25、SELECTNEWcom.bless.model.Member(m.id,m.fkUserinfo.id)FROMMemberm);2. ListlstM=query.list();3. for(Membermember:lstM)4. System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId();5. 两点说明:理论上在编写上面那句HQL时可以这样写的:SELECT NEW Member(m.id,m.fkUserinfo.id) FROM Member m(就是把Member的包名去掉),因为Memb

26、er类是在Hibernate映射文件Member.hbm.xml中指定了路径的。但是Member在HQL里面是关键字,如果不加包名执行查询的话会报如下错误:java.lang.ClassCastException: org.hibernate.hql.ast.tree.SqlNode cannot be cast to org.hibernate.hql.ast.tree.PathNode。那么如果POJO对象不是*.hbm.xml中映射的类,则注意一定要加上POJO的全路径!上面HQL语句有这样一段代码“m.fkUserinfo.id”,这是一种面向对象的写法,表示m对象(Member)下的

27、fkUserinfo属性(Userinfo)下的id,之所以这样写是因为Member表里的fk_userinfo外键关联Userinfo表的id,在编写hbm.xml时通常是将字段fk_userinfo设置成Userinfo对象方便关联自动查询,这也就是为什么在1-1例子中调用.getName()时会自动发送SQL的原因。4-2使用SQL查询字段在1-2中我使用setEntity将SELECt *查询出的数据直接映射到Member集合中,但是如果只查询Member表的部分字段就不能这样写了,先看下面这段可正确运行的代码:Java代码1. SQLQuerysql=baseDao.getSQLQuery(SELECTm.id,m.login_code,m.fk_userinfoFROMMemberm);2. sql.addScalar(login_code,Hibernate.STRING);3. sql.addScalar(id,Hibernate.INTEGER);4. ListlstM=sql.list();5. for(Objectobjects:lstM)6. Syst

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1