




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
hibernate是什么?1、一个框架framework2、一个ORM object relatetion mapping 对象关系映射 o:object 业务层 r:relation 关系数据库 m:mapping 对象关系映射文件3、处于项目持久层 OJB、ibatis也是4、实际就是对JDBC进行了轻量级封装总结:是对JDBC进行轻量级封装的ORM框架,处于项目的持久层。hibernate的APIhibernate.cfg.xml 核心配置文件对象关系映射文件分层清晰,减小耦合把关系数据库变成对象(对象化)hibernate的基础还是java反射机制struts是web层,因此不能用在J2SE里,但hibernate两者皆可。为什么要用hibernate? C3P0连接池开发流程1、创建项目(hibernate1)2、画出一个简单的项目示意图-界面(test.java)domainservice数据持久层oracle(雇员表)-3、引入hibernate开发包(官网)4、开发hibernate有三种方式 1、由Domain object-mapping-db 2、有DB开始,用mapping工具生成Domain对象(使用的多) 3、由映射文件开始每条记录对象一个对象实例(通过数据持久层/对象关系映射文件来关联映射)5、开发domain对象和对象关系映射文件(搭桥文件) 映射文件:指定表和对象的映射关系 domian对象.hbm.xml(命名规范、与domian对象同一个文件夹或包下) 映射文件需要dtd文件指定emp_seq 什么事POJO?domian对象简单java对象,具有组件属性有无参构造函数(hibernate框架反射)6、手动配置hibernate.cfg.xml文件,用于配置连接的数据库的类型、驱动、用户名、密码、url等数据库相关参数 同时管理对象关系映射文件操作数据库(最重要的四个接口和类)eg:请列举出hibernate常见的接口和类configuration【类】 JDBC:【 Connection DriverManager PrepareStatement ResultSet】sessionfactory【接口】session【接口】transaction【接口】映射文件oracle.jdbc.driver.OracleDriverscotttigerjdbc:oracle:thin::1521org.hibernate.dialect.OrcleDialecttrue7、修改 hibernate对象三种状态 损失 持久 游离主键生成策略有7种【总结】hibernate开发流程:1、建表2、引入hibernate开发包3、配置hibernate.cfg.xml4、编写Domain对象5、编写对象映射文件xxx.hbm.xml6、编写测试类、并测试依赖的库文件Commons Collection 集合类库dom4j xml解析javassist 开元分析创建java字节码类库JTA JAVA中事物处理APIslf4j-simple 简单日志处理slf4j-api 日志处理APIPOJO类,有什么要求?1、POJO类是和一张表对应2、一般在com.xxx.domain下3、pojo类需要一个主键属性,用于标示一个pojo对象4、除主键属性外,应当还有其他属性、属性访问权限是私有5、同时提供get/set方法6、它应该有一个无参的构造方法(用于hibernate反射)7、POJO其实就是一个javabean(区别于EJB叫法)8、也叫Data对象apache obj/toplink/ibatis/ejb cmp=第二讲 Hibernate核心类和接口Configuration类1)、负责管理hibernate的配置信息2)、读取hibernate.cfg.xml3)、加载hibernate.cfg.xml配置文件中的驱动、url用户名、密码连接池等4)、管理*.hbm.xml对象关系映射文件 SessionFactory接口(必须先有Configuration)1)、缓存sql语句和某些实例(一级缓存)2)、在应用程序创建时创建,是一个重量级的类(吃内存),一般用单例模式保证一个应用程序中只需要一个sessionFactory3)、通过sessionFactory接口可以获取session会话实例两个方法1:openSession()2: getCurrentSession()openSession是获取一个独立的新的会话(全新的)getCurrentSession获取当前线程中绑定的会话,换言之在同一个进程中获取的会话相同,这样更利于事物的控制。注意:如果希望使用getCurrentSession需要在hibernate.cfg.xml中加以配置3、如果选择?1)、需要在同一线程,则用getCurrentSession2)、如果在同一线程中使用不同session则用openSession两者区别:1、getCurrentSession创建的session会绑定到当前线程中,而采用 openSession创建的session不会。2、采用getCurrentSession的会自动关闭,而opensession的不会(都手动关闭及时)3、使用getCurrentSession需要在hibernate.cfg.xml中加入配置4、使用getCurrentSession查询时也需要提交事物!全局事物和局部事物(本地事物)比如:跨行转账 跨数据库的事物,即全局事物如何查看session有没有关闭windows cmd netstat -a 1521/3306/433 linux netstat -a 或 top4)、sessionFactory在web应用程序中,常驻内存,所以不能有多个Session 一个connection1、session一个实例代表与数据库的一次操作2、session实例是通过sessionFactory获取的,用完需要关闭3、session是线程不同步的(不安全),因此需要保证在同一线程中使用,可以用getCurrentSession4、session可以看做是持久化的管理器,它是与持久化操作相关的接口session会话的几个重要d方法1、保存 save2、删除 delete3、查询 get/load4、更新 updateget和load的区别1、get直接返回实体类,如果查不到则返回null,load会返回一个实体类的代理类对象(当期这个对象可以自动转化为实体类对象),但当代理对象被调用时,如果没有数据不存在,就会抛出org.hibernate.ObjectNotFoundException异常2、load先到缓存(session缓存(一级缓存)/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找)等后面使用这个代理对象操作时,才到DB中查询,这就是我们常说的load在默认情况下支持延迟加载(lazy)3、get先到缓存(session缓存(一级缓存)/二级缓存)中取查,如果没有就到DB中取查。总之如果确定有这个对象就用load不确定就用get(这样效率高)4、lazy=false 禁用延迟加载=hibernate缓存(减少对数据库的操作)一级缓存(session缓存):在内存二级缓存:在内存和磁盘(可配置)=openSession和getCurrentSession联系【深入讨论】在SessionFactory启动的时候,hibernate会根据配置创建相应的CurentSessionContext在getCurrentSession被调用的时候,实际被执行的方法是CurentSessionContext.curentSession()在curentSession执行时,如果当前session为空,currentSession会调用SessionFactory的openSession【eg】升级获取session的工具类,让其直接返回全新的session或者一个和线程绑定的session怎样理解线程局部模式ThreadLocal【本地线程不跨应用程序】=Transaction(事物)接口hibernate中再增删改必须事物提交!基本模板try、catch=Query接口因为get/load 根据ID号检索=因此产生Query接口set方法防止注入攻击Query接口可以使用Hql,Qbc,Qbe和原生SQL1、通过Query接口可以完成更复杂的查询任务eg:用户名查询数据=Criteria接口也可以用于面向对象的查询=【手动配置】db-手写domain对象-对象关系映射文件现在希望用工具完成Domain对象和关系数据文件的工作hibernate逆向工程,根据表生产domain对象和关系数据文件=第二部分 HQL和Criteria1、删除 session delete(对象)- 批量删除2、添加session.save session.presit3、修改session.update(对象)4、查询load/get 根据ID来找面向对象查询语句,HQL中对象区分大小写(除了JAVA类和属性部分不区分大小写)HQL查询的是对象而不是表,并支持多态语法结构类似SQL强烈建议每一张表建立一个主键唯一标示一条记录private Set Student = new HashSet();/ 通过集合表明一个学生可以选择多门课程拿到ID号取出集合就知道选了多少课程private Set studetCourse = new HashSet(); /一个课程可以被多个学生选,通过集合实现=hibernate关系映射:多对一一对一一对多多对多=关系通过外键联系 =1、检索所有的学生信息(Student 类 不是表名)List list = session.createQuery(from Student).list();/查询/取出1、for 增强for(Student s:list)system.ou.println();/迭代器取Iterator iterator = list.iterator();while(iterator.hasNext()Student s = iterator.next();system.out.println();+2、检索部分信息/ 原则,在jdbc中,要查询什么字段就查询什么字段,而不要把所有的都查出来/ 但是在hibernate中可以不遵循这个规则,建议查询所有属性(减少二次封装,便用二次利用)hql= select name,age from Student /此时查出的是对象数组,不是Student对象此时:List 会报错List list = session.craeteQuery(hql).list();for (int i=0;ilist.size();i+)Object objs = (Object ) list.get(i);system.out.println(objs0.toString();-Object objs= it.next();/ 再强转 迭代器取+List list = session.createQuery(from Student).list();/查询for (Student s:list) if(s.getStudentCourse().size()=0)elseSet set= s.getStudentcourse();for (Studentcourse sc : set)+3、使用函数、模糊查询、group by、 order by1)、uniqueResult 查到即返回 按ID查 (如果有100条,第二条就找到即返回,不会找第三条,所以高校)但是如果有多条就会抛异常(确定只有一条才能使用)2)、过滤重复值和 between.and. 一般distinct关键字List list = session.craeteQuery(hql).list();select distinct sex,age from XXX /过滤重复的记录3)、between.and.select * from XXX where age between 20 and 234)、in 和 not in5)、查询各个系的学生的平均年龄select avg(sage),sdept from Student group by sdpet /按系显示平均年龄for (Object ojb : list) / for 增强循环6)、having的使用 查询人数大于3的系名称select count(*),sdept from Student group by sdept having count(*)3;7)、查询女生少于200人的系select count(*),sdept from Student where sex=F group by sdept having count(*)如果我们返回的是一列数据 此时list就是一个个对象object,而不是objectselect age,sdept from Student where sdept=“计算机系” group by sdept/这时的取法就是直接取对象for (Object obj:list) 2)、查询总学分是多少?select sum(grade) from Studcourse3)、查询选修了课程11的最高分和最低分select 11,max(grade),min(grade) from Studcourse where course.cid=11 /list是对象数组从course中取找cid 由于外键已映射成一个类4)、显示各科考试不及格的学生名字,科目和分数学生名称-Student科目-course分数-studentcourseselect student.sname,ame,grade from Studcourse where grade=60 /当中的错综复杂关系由hibernate内部封装写出SQL(也是三表查询,这也是hibernate比ibatis的优势所在,主要体现在复杂SQL方面)5)、计算各科目不及格的学生的数量及科目select count(*),student.sdept from Studcourse where grade60 group by student.sdept-分页显示对象根据用户输入的pageNow 和 pageSize显示对象Query q = session.createQuery(hql);q.setFirstResult(从第几条取/从0开始计算)q.setMaxResult(取出几条/全部取出)List list = q.list();/list 就是显示结果q=session.createQuery(得到count*查询语句);int pageRow = (Integet) q.list().get(0).intValue();/按照学生年龄从小到大取出第一个到第三个学生List list = session.createQuery (from student order by age).setFirstResult(0).setMaxreslult(3).list();/for 增强取出for (student s:list)【注意】hibernate分页也是三层过滤,与oracle一样是三层过滤 sql Server是两层/分页函数【第17讲】private static void showResultByPage(int pageSize)/设置分页的变量int pageNow=1;int pageCount=1 /计算int rowCount=1; /这个要查询session session = null;Transaction ts = null;trysession = HiberUtil.getCurrentSession();tx=session.beginTransaction();/查询出rowcountInteger rowcount = session.createQuery(”select count(*) from student“).uniqueResult();pagecoutn = (rowcount-1)/pageSize+1 /pagecount算法for(inti=1;ipagecount;i+)session.createQuery(from student).setFirtResult(i-1)*pageSize).setMaxResult(pageSize).list();mit();catchfrinaly-参数绑定(解决SQL注入漏洞)可以用setParameter()方法来确定变量的值1、可读性很好2、性能较高(性能优化)3、防止SQL注入漏洞select * from student where cid=2006 and sdept=生物系rr /查不到 select * from student where cid=2006 and sdept=生物系rr or 1=1 /SQL注入全部查出参数绑定有两种形式1、List list = session.createQuery(from Stuent where sdept=:sdept(名字可随意,一般与前面相同) and sage:sage).setString(sdept,计算机系).setString(名称,设值).list();for增强循环for(Student s:list)总结:如果参数是冒号形式给出的,则我们的参数绑定应当这样 List list = session.createQuery(from Stuent where sdept=:sdept(名字可随意,一般与前面相同) and sage:sage).setString(sdept,计算机系).setString(名称,设值).list();如果是问号方式给出的,则我们这样 List list = session.createQuery(from Stuent where sdept=?(名字可随意,一般与前面相同) and sage?).setString(0,计算机系).setString(1,设值).list();1)、也可分开写: Query query = session.createQuery(from Stuent where sdept=?(名字可随意,一般与前面相同) and sage?) query.setString(0,jisuanjixi); query.setString(1,hangzo); /可以使用for循环动态注入List list = query.list();/提供一个统一的查询方法public static List executeQuery(string hql. string parameter) trysession s = getCurrentSession();Query query = s.createQuuery(hql);/判断是否有参数要注入if(parameter!=null & parameter.length0)for (int i=0;i?;string parameters = 计算机系,”3“;List list = hibernateUtils.executeQuery(hql,prameters);for 增强循环/查部分属性涉及二次封装和对象转换String hql = select snaem,sage from student where sdept=? and sage?;List list = hibernateUtils.executeQuery(hql,prameters);for(Object s:list)/ 提供一个统一的查询方法(带分页)hql 形式 from 类 where 条件=?public static List executeQueryByPage(String hql,String parameters,int pageSize,int pageNow)/* *前面一样 */query.setFirstResult(pageNow-1)*pageSize);query.setMaxesult(pageSize);list = query.list();/使用工具分页string hql=select sname,asdress from student order by sage;List list = Hibernate.executeQueryByPage(hql,parameter,2,3);for (Object s : list)System.out.println(s0.tistring);=一、在映射文件中得到hql语句、1、 可以在映射文件中得到hql,这样可以更加灵活,在某些情况下,可以考虑使用,比如在studdent.hbm.xml中(类似ibatis)eg:22如何使用:List list = session.getNamedQuery(myquerytest).list();system.out.println(list.size();Iteator is = list.iteator();while(it.hasNext()Object obj = (Object) it.next();system.out.println(n= + obj0);2、使用子查询 eg:显示所有选择了21号课程的学生信息String hql = select student.sanme,student.sdept from studentcourse where course.cid=21string parameters = 21;List list = Hibernate.executeQuery(hql,parameters);for (Object s: list) 或者:string hql = from studentcourse where course.cid=21;List list = Hibernate.executeQuery(hsql,null);for (Student sc :list) /lazy=false 解决session在查询后(HibernateUtils类)关闭问题-hibernate中的对象存在三种关系(其实也是表的关系)1、one-to-one 身份证人2、one-to-more 部门员工3、more-to-one 员工部门4、more-to-more 老师学生 (编程中尽量避免)在实际开发中,如果出现了more-to-more关系,我们应该将其转化成两个one-to-more或more-to-one,有利用程序控制,同时不会出现有冗余。比如学生选课表studentcourse id stuid courseid grade 多表查询:显示林青霞所选课程名和成绩Criteria是比hql更面向对象的查询方式eg:查询年龄大于十岁的学生session = hibernate。getCurrentSession();Transaction tx = s.beginTransaction();Criteria cri = createCriatia(Student.class);cri.add(Restractions.gt(sage, new Long(10);List list = cri.list();for 循环增强取数/mit();模糊查询:跟sql一样=hibernate开发三种方式1、domain-mapping-db官方2、db-mapping和domain3、由映射文件开始编写domain + 映射文件 -DB如果需要自动创建DB 需要手动配置相关参数hibernate.cfg.xmlcreate有四个选项 create、update、create_drop、validate1)、create 当应用程序加载hibernate.cfg.xml(new configure().config())这个文件时就会根据这个映射文件创建出数据库,而且是每次都会创建(如果原来表有数据,会被删掉)2)、update如果数据库中没有该表则创建,如果有表则看表结构有无变化,有变化则更新更新时数据尽量保留,有冲突会报错3)、create_drops在显式关系session时,讲drop掉数据库的schemas(生命周期很短,数据加完后就删掉)4)、validate相当于每次添加数据时,都会验证数据结构是否一致建议:在开发测试中,我们配置那个选项都可以;但是如果项目发布后就不要再配置了。(顶多配置一个update)-Domain Object对象的细节问题 CURD详解1、默认的无参构造方法,用于hibernate反射该对象(必须的)2、有个无意义的标识符id(主键),稳定唯一标示3、每个属性有get/set方法4、在domain对象的属性,只有在配置到属性文件后才会被hibernate映射和管理如果在domain中没有,而属性文件有,将会报错(即不能多配,少配可以不管你)5、属性的访问权限是private对象关系映射文件的说明对象关系文件中,有些属性可以不配置,比如表名(会议类名小写做表名)比如会根据数据选择合适的type类型=hibernate三种对象状态1、瞬时态(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象2、持久态(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事物没有提交。持久对象状态发生改变,在事物提交时会影响到数据库(hibernate能检测到)。3、脱管/游离(detached):数据库中有数据与之对应,但当前没有session与之关联;脱管对象状态发生改变,hibernate不能检测到变化。瞬时-持久-脱管save 事物提交后evict 从缓存中删除数据 delete是从数据库中删除如何判断一个状态处于怎么样的状态?1、看该对象是否处于session管理2、看在数据库中有没有对应的记录=hibernate关系映射(级联删除)一、多对一(雇员对部门)1、表外键 会被映射为另一个对象 / private Deptartment dept【引出】懒加载问题,解决:、1、Hibernate.Initilize(代理对象)2、在department映射文件中加入 lazy=“false”3、opensessioninview解决(借助过滤器)懒加载:当我们检索一个对象时,在默认情况下返回的只是该对象的普通属性当用户去使用对象属性的时候才会向数据库发出再一次的查询。这种现象称懒加载。二、一对多(部门对雇员)eg:通过部门号来获取三、一对一1、基于主键的one-to-onepersonidcard1(主键) 宋江 1(主键/外键) 2002-11-11hibernate42、基于外键的one-to-onepersonidcard1(主键) 宋江 100101(主键) 2002-11-11 1(外键)外键可以重复、外键可以有多个(加以unique来限定)四、多对多many-to-many学生课程在操作和性能上面都不太理想,所以多对多实际使用较少,实际使用中最好的是转换成两个一对多(或多对一)的对象模型,hibernate会创建关联表。=一、hibernate中的级联操作1、级联操作 cascade 当进行某个操作的时候,比如增删改时,那么另外一个操作就由hibernate自动帮助你完成比如departmentstudent 当删除一个dept时,那么就自动删除该部门所有学生比如BBS发帖,删除主帖子时,回帖也自动删除。(回帖是外键指向的)1)、首先在配置文件中配置cascade=“delete”2)、java 删除2、save-update如果父对象被save-update了,从对象也会save-update 至于是sa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业领域绿色能源技术应用
- 工业设计在产品创新中的作用与价值研究
- 工作中的情绪管理与压力缓解
- 工业设计与产品创新的策略研究
- 工作效率提升工具及方法研究
- 工作环境优化对员工满意度的影响
- 工程塑料在汽车领域的应用
- 工厂厂区绿化规划
- 工程机械动载荷下的结构强度分析
- 工程机械的维护与修理技术培训
- 清远市突发事件总体应急预案
- 通风与防排烟系统的施工方案
- 沪教版英语小学四年级上学期试卷与参考答案(2024-2025学年)
- 人工智能训练师理论知识考核要素细目表二级
- 2024年人教版一年级数学(下册)期末试卷及答案(各版本)
- 《卒中患者吞咽障碍护理规范》
- DL∕T 698.45-2017 电能信息采集与管理系统 第4-5部分:通信协议-面向对象的数据交换协议
- GB/T 44189-2024政务服务便民热线运行指南
- 浙江省杭州市学军中学2025届数学高一下期末统考试题含解析
- 2025年中考数学专题09 逆等线最值专题(原卷版)
- 中医医疗技术手册2013普及版
评论
0/150
提交评论