笔记-hibernateJava相关课程系列之十四_第1页
笔记-hibernateJava相关课程系列之十四_第2页
笔记-hibernateJava相关课程系列之十四_第3页
笔记-hibernateJava相关课程系列之十四_第4页
笔记-hibernateJava相关课程系列之十四_第5页
免费预览已结束,剩余35页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目一、Hibernate的概 Hibernate框架的作 Hibernate数据库的优 Hibernate的设计思 二、Hibernate的基本使 Hibernate的主要结 Hibernate主要的 Hibernate使用步 HQL语句(简要介绍 三、数据映射类 type映射类型的两种写 四、Hibernate主键生成方 五、Hibernate基本特 常犯的错 Session的get和load方法的区 六、关联映 关联操作(查询joinfetch/级联 七、Hibernate查询方 HQL查 HQL和SQL的相同 HQL和SQL的不同 HQL典型案 Criteria查 NativeSQL原生SQL查 八、Hibernate高级特 二级缓 查询缓 九、Hibernate锁机 悲观 乐观 十、其他注意事 Hibernate中分页查询使用joinfatch的缺 一、Hibernate的概述Hibernate框架的作用可以使用它替代以前的JDBC数据。Hibernate数据库的优SQLHibernate不和数据库关联,是一种通用的数据库框架(30多种数据库APIHibernateAPISQLHibernateSQL语句。JDBC数据库的缺Hibernate的设计思想Hibernate是基于ORM(ObjectRelationMap)思想设计的,称为对象关系映射。负Java对象和数据库表数据之间的映射。HibernateORMORM工具,如:MyBatis(以前叫iBatisMyBatis。ORMJava(ORMJDBC二、Hibernate的基本使用Hibernate的主要结构HibernateEntity实体类(n个,一个表一个hbm.xml映射文件(n个Hibernate主要的Configurationhibernate.cfg.xmlSessionFactory。2)SessionFactory:了hbm.xml中描述的信息,内置了一些预编译的SQL,可以创SessionSessionJava程序与数据库的一次连接会话ConnectionJSPsession不是一回事,就是名字一样而已Transaction:负责HibernateHibernate事务关闭了自动提交功能,需要显式的追加事务管理(Transaction对象中的commit();提交事务!APIHibernateHibernate使用步骤<?xmlversion='1.0'encoding='UTF-<!DOCTYPEhibernate-configuration"-//Hibernate/HibernateConfigurationDTD3.0//EN"<propertyname="dialect"><!--指定方言,决定HibernateSQL--></property><!--hibernate3.jarorg.hibernate.dialect<propertyname="connection.url"><property<property<?xmlversion='1.0'encoding='UTF-<!DOCTYPEhibernate-configuration"-//Hibernate/HibernateConfigurationDTD3.0//EN"<propertyname="dialect"><!--指定方言,决定HibernateSQL--></property><!--hibernate3.jarorg.hibernate.dialect<propertyname="connection.url"><property<property<property<propertyname="connection.driver_class">hibernateSQL<propertySQL<property<!--指定映射描述文件 注意事项:应该放在源文件的src 下,默认为hibernate.cfg.xml。文件内容是Hibernate工作时必须用到的基础信息。privateIntegerid;privateIntegerbaseDuration;privateIntegerid;privateIntegerbaseDuration;基本时长privateFloatunitCost;//单位费用privateStringdescr;//资费信息说明privateDatestartTime;//启用日期……getter/setterprivateStringfeeNameprivateFloatbaseCostprivateStringstatus;0:开通;1:暂停;privateDatecreateTime;//创建日期privateStringcostTypeObject性和对应的getter/setter方法,而没有任何业务逻辑方法的类。这种类最多再加入equals()、hashCode()、toString()Object的方法。不承担任何实现业务逻step5hbm.xml映射(文件)POJO类和表之间的映射关系(xxxx字段,一个类对应一个映射文件。例如:Cost.hbm.xml内容如下:<?xmlversion="1.0"encoding="utf-<!DOCTYPEhibernate-map PUBLIC"-//Hibernate/HibernateMap DTD3.0//EN" <!--定义COST_CHANG表和Cost类型之间的映射信 ><!-- ">--><!--name:包名.类名,指定是哪个类;table:数据库中哪个表;catalog:对Oracle而言,不写也行(若用工具则会自动生成。例如,select*fromcost_chang则会在hibernate.cfg配置文件中定义的库(或用户)下去找表。若写了则为select*fromsystem.cost_chang 报错,主键映射<idname="id"<columnname="ID"/><!--或 ><!--<propertyname="nametype="java.lang.String"><!--<propertyname="baseDuration"type="java.lang.Integer"><!--<propertyname="baseCosttype="java.lang.Float"><!--<columnname="BASE_COST""<!--也可写成<propertynametypecolumnproperty>,主键列同理! hbm.xml中已写出的属性与字段的映射要一一对应,若表中没有某个字段,却HibernateUtilSessionpublicclassHibernateUtilpublicclassHibernateUtilprivatestaticSessionFactoryConfigurationconf=newConfiguration();//加载主配置hibernate.cfg.xmlsf=conf.buildSessionFactory();//获取SessionFactory publicstaticSessiongetSession(){//获取SessionSessionsession return publicCostfindById(intpublicCostfindById(intid);publicvoiddelete(intid);publicList<Cost>publicvoidsave(Costpublicvoidupdate(CostpublicclassCostDAOImplimplementsCostDAO{privateSessionsession;publicCostDAOImplsession getfindByIdid(主键)条件值即可,其他条件查询做不了*/publicCostfindById(intid)//SessionCostcost=(Cost)session.get(Cost.class,id); return insert操作。即先:selectCOST_SEQ_CHANG.nextvalfromdual;然后:insertinto……*/publicvoidsave(Costcost){//SessionTransactiontx=session.beginTransaction();//打开事务 /**delete方法Hibernate以“对象”为单位进行数据库操作,所以这id查再删*/publicvoiddelete(intid)//SessionTransactiontx=session.beginTransaction(); Costcost=newCost(); /**update方法publicvoidupdate(Costcost)//Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); /**特殊查询,SQL语句:Stringsql="select*from";fromHibernate中特有的查询语句,根据映射的类去查询。*/publicpublicList<Cost>findAll()//Sessionsession=HibernateUtil.getSession();Stringhql="fromCost";//HQL语句Query return publicvoidtestFindById(){//getCostDAOcostDao=newCostDAOImpl(); Costcost=costDao.findById(1);System.out.println(cost.getBaseCost());System.out.println(cost.getUnitCost()); publicvoidtestSave(){//idHibernateCostcost=new cost.setName("2013计时cost.setUnitCost(0.8f);cost.setDescr("2013-08-09计时,0.8元/小时。"); CostDAOcostDao=newCostDAOImpl(); publicvoidtestUpdate(){//01CostDAOcostDAO=newCostDAOImpl();/**注意事项:更新部分字段,不能 没设置的字段将被改为空!即不能:Costcost=newCost(); cost.setStartTime(newDate(System.currentTimeMillis())); Costcost=costDAO.findById(90);//只能id找到带有所有值的对象cost.setStartTime(newDate(System.currentTimeMillis())); publicvoidCostDAOcostDAO=newCostDAOImpl(); publicvoidCostDAOcostDAO=newCostDAOImpl();List<Cost>list=costDAO.findAll();for(Cost HQL语句(简要介绍三、数据映射类型映射类型的作用type映射类型的两种写法Java类型,例如:java.lang.String、java.lang.IntegerString tim(timesam(;true/falsetrue/false<-true_false->char(1)(T/Ftrue/falsetrue/false<propertyname="name"type="string"><columnname="NAME"<propertyname="name"type="string"><columnname="NAME"java.util.Datedate映射,则只把年月日存进数据库;java.sql.Date只有年月日。java.sql.Timestamp有年月日时分秒毫秒。若在页面显示按特定格式显示则用Struts2<s:datename="属性名format="yyyy-MM-dd四、Hibernate主键生成方式五种生成方式nativeHibernate会根据方言类型不同,选择不同的主键生成方式。如果是insert语句插入。OracleMySQL都可用。但不适合并发量很大的情况!;hilo五、Hibernate基本特性对象持久性APIAPI处于持久状态的对象具有的特点同步Session对象负责管理和同步。Session的一级缓存中存放(Session缓存中的对象都是持久对象态,当对象的不存在时,对象才被回收。没被回收时,对象中的数据还在!三种状态下的对象的转换批量操作:注意及时清除缓存Transactiontx=session.beginTransaction();for(inti=0;i<100000;i++){ FooTransactiontx=session.beginTransaction();for(inti=0;i<100000;i++){ Foofoo=newFoo(); 案例:三种状态下的对象使用, /**提交事务,若后面不写flushcommit,则也能执行更新操作。因为commit在flushflush可不写*//**触发同步动作,同步和提交是两回事。数据有变化才同步(更新,没变化不会更新*/ session.close();//关闭session释放资源 publicvoidFoofoo=newFoo(); foo.setHireDate(newDate(System.currentTimeMillis()));Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); publicvoidFoofoo=(Foo)session.get(Foo.class,2);//foo具有持久性 //session.flush();//数据有变化才同步update,没变化不会update 一级缓存机制(默认开启Session创建而开辟(SessionFactory创建Session.close()而释放。一级缓存的好处管理一级缓存的方法publicvoidtest1(){ Sessionsession=HibernateUtil.getSession();Foofoo1=(Foo)session.get(Foo.class,1);//第一次查询System.out.println(foo1.getName());//SQL查询语句Foofoo2=(Foo)session.get(Foo.class,1);//后续查询System.out.println(foo2.getSalary());//SQL查询语句 publicvoidtest2(){ Sessionsession=HibernateUtil.getSession();Foofoo1=(Foo)session.get(Foo.class,1);//第一次查询System.out.println(foo1.getName());//能出现SQL查询语句 //或session.clear(foo1);Foofoo2=(Foo)session.get(Foo.class,1);//后续查询System.out.println(foo2.getSalary());//SQL查询语句 publicvoid SessionFoofoo1=(Foo)session.get(Foo.class1);//不同的对象,所以查询两次Foofoo2=(Foo)session.get(Foo.class,2); publicvoid SessionFoofoo1=(Foo)session.get(Foo.class,1); Foofoo2=(Foo)session.get(Foo.class,1);//又一次查询 延迟加载机制Hibernate在使用时,有些APIgetter方法获取属性值时,才去数据库查询加载。具有延迟加载机制的操作常犯的错误报错:LazyInitializationException:couldnotinitializeproxy-noSession,原因:代码session在加载数据前关闭了。只要看到这个类名:LazyInitializationExceptionsession过早关闭,后面的描述可能不同。报错:NonUniqueObjectException:adifferentobjectwiththesameidentifiervaluewasalreadyassociatedwiththesessionid却相同。例如:Sessionsession=HibernateUtil.getSession(); Accountaccount1=(Account)session.get(Account.class,1010);//将account1放入缓存Accountaccount2=newAccount(); //update操作会将accont21010对象,id1010的对象 延迟加载的原理在使用延迟加载操作后,HibernateHibernateCGLIB技术(cglib.jar)新生成的一个类型(动态的在内存中生成getter方法重写。新生成例如:例如:publicclassFoo$$EnhancerByCGLIB$$87e5f322extendsFoo{publicStringgetName(){ *.java*.class-->-->延迟加载:javassist.jar/cglib.jar(生成新类型)-->-->Sessiongetload方法的区别不同点:①get是立刻加载;load,③getnull;loadObjectNotFoundException延迟加载的好处 案例:测试延迟加载publicvoidSession//load是延迟加载,foo,//session.close();//放这里报错,session关的过早couldnotinitializeproxynoSystem.out.println(foo.getName());//System.out.println(foo.getName());//第一次调用属性的getter方法时触发查询 publicvoidtest2(){ Sessionsession=HibernateUtil.getSession();Foofoo=(Foo)session.load(Foo.class1);//此时还没去数据库查询类,由 案例:重构NetCTOSS资费管理模块step2HibernateCOST_CHANGprivateIntegerid;//资费privateIntegerid;//资费ID privateStringname;//资费名称NAMEprivateIntegerbaseDuration;//包 时长BASE_DURATIONprivateFloatbaseCost;//月固定费BASE_COSTprivateFloatunitCost;//单位费用UNIT_COSTprivateStringstatus;/01:暂停;STATUSprivateStringdescr;//资费信息说明DESCRprivateDatestartTime;//启用日期STARTTIMEprivateDatecreaTime;//创建时间CREATIME <idname="id"<columnname="ID"<generator<param<propertyname="name"<columnname="NAME"<propertyname="baseCosttype="java.lang.Float"><!--<columnname="BASE_COST" junitCopyTracestep32.3step6HibernateUtilstep4CostDAODAOpublicvoiddelete(intid)throwsDAOException{Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Costcost=new publicList<Cost>findAll()throwsDAOException{Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Stringhql="from QueryListlist=query.list(); returnlist; publicList<Cost>findAll(intpage,introwsPerPage)throwsDAOException{Transactiontx=session.beginTransaction(); Stringhql="fromCost";Queryquery=session.createQuery(hql);query.setFirstResult(start);//设置抓取记录的起点,0开始() returnlist; publicCostfindById(Integerid)throwsDAOException{Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Cost Stringname=cost.getName(); returncost; publicCostfindByName(Stringname)throwsDAOException{//select*fromCOST_CHANGwhereNAME=?Stringhql="fromCostwherename=?";Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Queryquery=session.createQuery(hql);query.setString(0,name);//注意Hibernate0 returncost; publicintgetTotalPages(introwsPerPage)throwsDAOException{//selectcount(*)fromStringhql="selectcount(*)fromCost";//类名Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Queryquery=session.createQuery(hql); Objectobj=query.uniqueResult();inttotalRows=Integer.parseInt(obj.toString()); return}else}else return }publicvoidsave(Costcost)throwsDAOException{Sessionsession=HibernateUtil.getSession();}publicvoidupdate(Costcost)throwsDAOException{SessionCostcost1=(Cost)session.get(Cost.class,cost.getId()); privatestaticprivatestaticCostDAOcostDAO=newJavaWeb程序中如何用延迟加载操作(OpenSessionInView)*.action-->Action-->DAO(延迟API)-->JSP(利用或EL获取数据,会触发延迟加载数据)-->HTML页面给浏览器。DAOSessionSessionJSP(把Session的关闭延View组件运行完之后这种模式被称为OpenSessionInView。3)OpenSessionInView和ThreadLocal:OpenSessionInViewSessionSession,SessionThreadLocal(keyMap<property<propertypublicclassHibernateUtil{privatestaticSessionFactoryprivatepublicclassHibernateUtil{privatestaticSessionFactoryprivatestaticThreadLocal<SessionsessionLocalnewThreadLocal<Session>();static{//static块中,否则耗费资源Configurationconf=newConfiguration();conf.configure("/hibernate.cfg.xml");//加载主配置hibernate.cfg.xmlsf=conf.buildSessionFactory();//获取SessionFactory /**sessionThreadLocalsession与当前线程绑定*/publicstaticSessiongetSession(){ Sessionsession=sessionLocal.get();session 器}/**sessionpublicstaticvoidcloseSession(){ Sessionsession=sessionLocal.get(); session.close();//关闭session和释放ThreadLocal空间 /**publicstaticvoidmain(String[]Sessionsession1=HibernateUtil.getSession();Sessionsession2= {//public{//publicStringintercept(ActionInvocationarg0)throwsException{Sessionsession=HibernateUtil.getSession(); try{arg0.invoke();//执行action、result return}catch(Exceptione){ tx.rollback();//回滚事务System.out.println("回滚事务"); throwe;//受 Interceptor类影响必须抛异常}finally{HibernateUtil.closeSession();// <interceptorname="opensessioninview" <interceptorname="opensessioninview" <!--定义全 (struts-cost.xml中有效)JavaSession全部删除。Filterpublicpublicvoid}SpringAOP六、关联映射AccountaccountAccount)session.get(Account.classAccountaccountAccount)session.get(Account.class1);//取到用户信息Stringhql="fromServiceswheres.accountId=1";Queryquerysession.createQuery(hql);//取到用户对应的服务List<Item>list=query.list();一对多关系one-to-hibernate.cfg.xmlhbm.xml映射文件。ServiceprivateServiceprivateSet<Service>services=newstep3OneAccount.hbm.xml映射文件中,加入Set节点的映射<set<setname="属性名关联条件,columnACCOUNT<!--指定采用一对多关系,class指定关联的类型<one-to-manyclass="要关联的另一方(N方<!--<!--servicesservice<!--是list集合用<list set集合用<set <set<keycolumn="ACCOUNT_ID"></keyACCOUNT_IDService<one-to-manystep45.174)step1HibernateUtilpublicvoidSessionpublicvoidSession,/**ServiceStringhql="fromServicewhereACCOUND_ID=1011";hql了*/Set<Service>services=account.getServices();//SQL查询for(Services:services){ 多对一关系many-to-hibernate.cfg.xmlhbm.xml映射文件。step2ServiceAccountNAccountAccount注意事项:ServiceaccountIdget/set方法也删,Service的映射文件对应的描述也删!否则报错:org.hibernate.MapException:Repeatedcolumninmapforentity:org.tarena.entity.Servicecolumn:ACCOUNT_IDstep3NService.hbm.xml映射文件中描述account属性<many-to-onename="属性名"class="要关联的另一方类型Account"<many-to-onename="属性名"class="要关联的另一方类型Account" <!--指明外键字段,不写主键--><!--<!--描述account,采用多对一关系加载<many-to-onename="account"class="org.tarena.entity.Account" <!--指明外键字段,不写主键-->step45.174)step1HibernateUtilpublicvoidSessionpublicvoidSessionSystem.out.println(service.getOsUsername());//SQL查询 System.out.println(service.getAccount().getId());//第二次SQL查询 多对多关联映射many-to-答:Hibernate会自动的通过已经映射的表,进行关系表操作。6.4节。RoleprivateSet<Role>roles=newRoleprivateSet<Role>roles=newstep2Admin.hbm.xml中定义属性的映射描述<set<setname="关联属性名table="中间的关系表<!--描述<!--描述rolesRole<setname="roles"<keypublicvoidtestFind(){//SessionAdminadmin=(Admin)session.get(Admin.class,1001); >for(Rolerole:roles){ System.out.println(role.getId()+""+role.getName()); Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Adminadmin=newAdmin(); admin.setName("常1"); Rolerole1=(Role)session.load(Role.class20);//ID20, publicvoidtestDelete(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();, adminprivateSet<Admin>admins=new<!--admin<!--admin<setname="admins"<keycolumn="ROLE_ID"></key><!--与admin.hbm.xml 关联操作(查询joinfetch/级联cascade)SQL加载关系表数据。如果需要将关联数据与主对象一起加载(SQL查询合成一SQL查询,可以采用下面的方法:①在hbm.xml(下例是在Account.hbm.xml中使用lazy="false"不推荐用因为影响的映射范围太广,推荐使用HQL<setname="services"lazy="false"表中字段<one-to-many/**我们期望:当执行(Account)session.get(Account.class,1001);语句,取出Account/**我们期望:当执行(Account)session.get(Account.class,1001);语句,取出Account后,在属性services已经填充了所有的服务项service publicvoidtest1(){ Sessionsession=HibernateUtil.getSession();Accountaccount=(Account)session.get(Account.class,1011);Set<Serviceservices=account.getServices();//lazy="true"默认值,则报错for(Services:services){System.out.println(s.getId()+""+s.getOsUsername()+""+s.getUnixHost()); /**TestOneToManypublicpublicvoidSessionStringhql="fromAccountajoinfetcha.serviceswherea.id=?";//SQL查询Queryquery=session.createQuery(hql);query.setInteger(0,1011); Accountaccount=(Account)query.uniqueResult();System.out.println(account.getRealName());System.out.println(account.getIdcardNo());Set<Service>services=account.getServices();for(Service /**TestManyToOne}publicvoid SessionStringhql="fromServicesjoinfetchs.accountwheres.id=?";//SQLQueryquery=session.createQuery(hql);Serviceservice=(Service)query.uniqueResult(); cascade属加和更新④All:级联添加、删除、更新……等。案例:级联增加:<setname="services"<setname="services"<key<one-to-manyAccountaccount=newAccount();//一个Account,简单操作:只把非空列设置上 Serviceservice1=newService();//两个Service,简单操作:只把非空列设置上Serviceservice2=newService();//同理/**serivce1service2account.servicesservice,同时Hibernate会检测,新增数据若是services中的原有的,则不往数据库添加*/ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); inverseIDSERVICE_CHANGACCOUNT_IDupdate语句,因为当前添加了一个Account和两个Service,所以One方要两个Service,即两个update语句。如果数据量很大,则要N个Service,则有N个updata语句,此时updateAccount.hbm.xml例如:<setname="servicesinverse="true例如:<setname="servicesinverse="truemany一方(One方放弃,Many方。能起到一定的优化作用。publicvoid 完整性约束*/Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Accountaccount=(Account)session.load(Account.class,500);//应该先查找 Hibernate级联删除的缺点:deleteid(主键)一条一条删的,不是按关系字段Hibernate的级联删除,简单方便些。deletefromAccountwhere deletedeletefromAccountwhere deletefromServicewhere级联删除,不写inverse="true",且数据库中SERVICE_CHANG表中的ACCOUNT_IDNOTNULLupdate,会设置ACCOUNT_ID=null,那么将与数据库!报错!所以,应当加上继承关系映射"" CREATETABLEBOOK( WORD_NUMBERVARCHAR2(20),TOTAL_PAGEVARCHAR2(20) BRANDVARCHAR2(20),TYPEVARCHAR2(1),COLORVARCHAR2(50), 有ID、名字、价格、产品。例如:publicclassBookextendsProduct、publicclassCar例如:publicclassBookextendsProduct、publicclassCarextendsProduct{ <idname="id"type="integer"<generatorclass="sequence"><!--指定序列<param<property<propertyname="name"type="string" ><!--BookProduct<!--:继承哪个父类。<joined-subclassname="org.tarena.entity.Book"table="BOOK"<keycolumn="ID"></key>BOOK表中哪个字段与PRODUCT<!--这里不自动增长,HibernateProduct中的主键值拿过来<propertyname="author"type="string" BookProduct<joined-subclassname="org.tarena.entity.Car"table="CAR"这里不自动增长,HibernateProduct中的主键值拿过来<propertyname="brand"type="string"publicvoidtestAddBook(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); Bookbook=newBook();book.setName("常的书");//设置product属性 book.setAuthor("常");//设置book属性 publicvoid SessionBookbook=(Book)session.load(Book.class,1); publicvoidtestDeleteBook(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); publicvoidtestAddCar(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Carcar=newCar();//product信 car.setType("J");//J轿车K卡publicvoid}SessionStringhql="fromBook";//fromcar为所有汽车,fromproductQueryquery=session.createQuery(hql); List<Book>books=query.list();for(Bookbook:books){System.out.println(book.getId()+""+book.getName());} 七、Hibernate查询方法HQL查询HibernateQueryLanguageHQLHQL语句是面向对象的一种查询语言。HQLHibernate映射之后的实体类型和属性HQLSQL的相同点in、notin、between...and、isnull、isnotnull、like、or都支持分组统计函数count、max、min、avg、sumHQLSQL的不同点HQL区分大小写(除了关键字外HQLselect*写法。4)HQLjoin...onon子句。5)HQL不能使用数据库端的函数。注意事项:HQLselectcount(*)HQL典型案例step1Account实体、Account.hbm.xml、hibernate.cfg.xmlstep2TestHQLHQL。查询操作可不写事务控制语句。 //SQL:select*from Stringhql="fromSession Queryfor(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} //SQL:select*fromACCOUNT_CHANGwhereREAL_NAMElike//andXXorStringhql="fromAccountwhererealNamelike//Stringhql="fromAccountwhererealNameliken";//Sessionsession=HibernateUtil.getSession(); Queryquery=session.createQuery(hql);query.setString(0,"zhang%");//方式一:设置查询参数,从0开始表示第一个?//zhang_表示以zhang开头的两个字名字for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest3(){//查询部分字段Stringhql="selectid,realName,idcardNofromSession Query属性的个数、顺序一致!注意事项:Object数组!*/List<Object[]>list=query.list();[] //SQL:selectID,REAL_NAME,IDCARD_NOfromACCOUNT_CHANGpublicvoidtest4(){//查询部分字段方式二的使用。或者写个新的实体类也可以。*/Session QueryList<Account>for(Accounta:list){//注意:显示其他属性将会是初始值System.out.println(a.getIda.getRealNamea.getIdcardNo());} publicAccount(IntegerpublicAccount(Integerid,StringrealName,String }step4Account.hbm.xml中添加HQL语句,step5<!--和class是平级的!一个 写一个HQL语句--<queryname="findAll"><!--起个名字-publicpublicvoidtest5(){//HQLhbm.xmlSession//session.getNamedQuery()hbm.xml中找HQLQueryquery=session.getNamedQuery("findAll");for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest6(){//Stringhql="fromAccount"; Sessionsession=HibernateUtil.getSession();Queryquery=session.createQuery(hql);,0List<Accountlist=query.list();//如果查询出多条结果for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} /**SQL:selectfromSERVICE_CHANGsjoinACCOUNT_CHANGaon(a.ID=s.ACCOUNT_ID)*/publicvoidtest7(){//对象关联查询//hql"selects.id,s.osUsername,s.unixHost,a.realName,a.idcardNo**//hqlfromServicesjoins.accountaon//hqlfromAccountajoina.servicess有其他属性,不能“.”出来*/hql+="selects.id,s.osUsername,s.unixHost,s.account.realName,s.account.idcardNo";hql+="fromServices";//onService中有accountSessionsession=HibernateUtil.getSession(); Queryquery=session.createQuery(hql);List<Object[]>list=query.list();for(Object[]objs:list){System.out.println(objs[0]+""+objs[1]+""+objs[2]+"+objs[3]+" (FIRST_NAMEVARCHAR2(20),LAST_NAMEVARCHAR2(20),AGENUMBER);ALTERTABLE ADDCONSTRAINT 表//privateStringfirstName; private//privateStringfirstName; privateStringlastName; Keyid;//主属性privateInteger ……get/set/**必须实现Serializable否则load、getSerializablepublic Keyimplements<class<class<!--联合主键"<composite-idname="id" <!--主键自动生成这里就不适合了,要通过程序操作<key-propertyname="firstName"type="string"<key-propertyname="lastName"type="string"<propertyname="age"type="integer"privateString privateString ……get/set方 Criteria查询 Listpublicvoidtest1(){//没有任何子句 Sessionsession=HibernateUtil.getSession();Criteriac=session.createCriteria(Account.class); List<Account>list=c.list();for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest2(){//模糊查询 Sessionsession=HibernateUtil.getSession();Criteriac=session.createCriteria(Account.class);c.add(Restrictions.like("realName","zhang%")); List<Account>list=c.list();for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest3(){//Sessionsession=HibernateUtil.getSession();Criteriac=session.createCriteria(Account.class);//c.add(Restrictions.like("realNamezhang%")); Restrictions.eq("idcardNo"," List<Account>list=c.list();for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo()); NativeSQLSQL查询SQLQuerySQLQuery[]>SQL。publicvoidtest1(){//Stringsql="selectpublicvoidtest1(){//Stringsql="select*fromACCOUNT_CHANG";Sessionsession=HibernateUtil.getSession();SQLQueryquery=session.createSQLQuery(sql); List<Object[]>for(Object[]objs:list){System.out.println(objs[0]+""+objs[1]+""+objs[2]);} publicvoidtest2(){//test1Stringsql="select*fromACCOUNT_CHANG";Sessionsession=HibernateUtil.getSession();SQLQueryquery=session.createSQLQuery(sql);的,部分字段不行) List<Account>list=query.list();for(Accounta:list){ System.out.println(a.getId()+""+a.getRealName()); 八、Hibernate高级特性二级缓存SessionFactorySessionFactoryFactory创建的Session都可以二级缓存。ehcache-1.2.3.jar。二级缓存开启方法及测试step1ehcache-1.2.3.jarsrc下添加ehcache.xml<diskStorepath="java.io.tmpdir"/><!--<diskStorepath="java.io.tmpdir"/><!-- maxElementsInMemory="2000"<!-- <!--缓存对象的有效期,true为永久存在--> <!--空闲时间某个对象空闲超过20秒则清出二级缓存--> <!--某个对象生存了120秒,则自动清出二级缓存--> <!--<!--开启二级缓存<propertyJDBC<propertyname="vider_class">中<!--<!--:指明用哪组参数缓存<cacheusage="read-only"<idname="id"type="integer"publicvoidtest1(){//查询一次,一级缓存的作用Sessionsession=HibernateUtil.getSession();} test1开启二级缓存后,只查询一次二级缓存管理方法二级缓存的使用环境查询缓存查询缓存开启方法及测试<!--<property<!--<propertystep3:创建TestQueryCache类,用于测试查询缓存,并在执行query.list()方法前,设置publicvoidtest1(){//当传入的参数相同时,只执行一次查询。不同时执行两次查询show("zhang%");System.out.println(""); privatevoidshow(StringStringhql="fromAccountwhererealNamelike/**看SQL不看HQL,SQL相同则从查询缓存中取,不一样则数据库查询*/Sessionsession=HibernateUtil.getSession();Queryquery=session.createQuery(hql);query.setString(0,name);此次SQL,将结果集返回。未执行过,去数据库查询,并将SQL和结果存入缓存*/ >for(Account}}查询缓存

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论