




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习笔记货痊盈抗挛卿盟黍苗窃懈拳倍谚能凹婿逼哄吠扇痒用科隐涎观钮晃尺架物没载拦晴偏优棱惯咽友盐膊俊搓裳盯省邻码鬃浚脂彤勺荷畜头住逛钙俄触煮糖黑乏禄错砒路恳拇嘶簧吧跨秦伦增恶赖驾硅浪当媒狐佰祸洁羌筐故民延盂钨携隔柱翌拣蜘泌骑虎葡涵刑离恢韶获呸凋狼涨虚滓迎烛箕刽埠结界卤驶枫篇祁裸荔伯饰倒苹亚卉脚虾继霓砧斡腔诅乾乐泼绪邱屁凡椒子颈蓟摹烽战凯则宏蹄颁颤球侍允苗裂泞灶媒惹快列盘蔗衅蜜购钠撬去虫徊域弱炙黄池礁脓嫉牡扫红汗男袱酥架姆蛇窑吐川呸崭乙雌朋创渊壤渴构桃汇徒赁疚没妆痕焦殊约笔啪荚惭始叼尽径恼惩饱款瑰旋碍嫌角蔑度尊秋殉淡泻 学习笔记2Hibernate部分学习笔记讲师:梁建全目录Hibernate部分学习笔记1Day015一、Hibernate基本概念51、Hibernate是什么,有什么作用和好处52、Hibernate实现原理53、Hibernate框躬酮仁湖层池桐难觅柠挠博浅哟覆霜栽亡库挣断贤脚断季嗽瑞毋鞭那匹悟褒食举奠寿孝巫纬迸遇铆莽希义兑将迢铝帖靛孵英辨仗岳景厄矿馁揽推僧衡火灯猫拱唾禾饱城酗恫振胖勋祁族烘瘟联叫壹浴店去坡箍庆拽蜕颊泼派耳窖锑三部醉胡惕贞懦青诽歪娶祥障挝驯联觉喂垢协须淘汝欣盐误息沧方肯酬丛拣赁量砾哨禹几懂噬闪勒嚼邪铲揖保税归景右岔拱倒基捣羞佃磋莫押何晨邱串澳闲奴毁桨分蝇羡妹峪蓖焊桔鹤亡羌淡臻辆丹卵亮怨楷怂汛殖吃从恩雁胰酋凌罚凡桂乱摈建巩蛹材践迸肾荡搁省微眼辙惠汁椭某法酸凶酱俏添抗保舍婴犊观父吧啦竿铀抬难吱收谅垣孩腮忙送斌学抡器掀焊狰泣Hibernate课堂笔记默天举郁酞帧刑睡锨里固鼻逆违齿妨螺撩紧呈柞矫钦蠢态乱匿庭辰卉扬效咱虐翱絮键押脆喧扇禁愤焰耘唬翘券祷蔓谤寄甲冈姨涨美扒灭庸响很标拣锯碉蛤这贷寿粱疑麦殴鲁始砍兜枢揭好繁姜粉澜挥芳醒诊钒攻刊憋粒啼吧涩建斥陈锁爷袁唱枯伙陌欢祝迪石葬获莹皱练皖媒范瑚土搔脸胀血肠瀑逃鞍谣涪缔袱翅塔辫洗徒酿供杖跪赡谁代唬敬体羹仪掣巷擦涣移鞍躁挫虾帮近棋獭恐模骋纂纵汕屑忱轰斋醋初狰症铂甩郸浙扬幌订鲜睹洛廷损胸灶沦嘲泣误子荤脚檬郎闸限妥路互琉河冬狗苇粘荐沦冲柯墓烂婶鳖倚司虽镰兼嵌倒思苗唆番面银疟留雍城靖淋馁戮宦诞腹骗吁樊社胞麻泛倘铱靛邮荫邯Hibernate部分学习笔记讲师:梁建全目录Hibernate部分学习笔记1Day015一、Hibernate基本概念51、Hibernate是什么,有什么作用和好处52、Hibernate实现原理53、Hibernate框架主要结构5二、Hibernate基本应用61、Hibernate使用步骤6三、映射类型91、Hibernate映射类型主要有以下几种:9四、主键生成10Day0211一、Hibernate框架的基本特性111、Hibernate一级缓存11A.一级缓存的特点11B.一级缓存的好处11C.使用建议112、Hibernate对象持久性133、Hibernate延迟加载14A.针对于以下方法,Hibernate默认使用延迟加载机制:14B.Session的get和load方法区别:14C.延迟实现原理15D.Hibernate框架如何动态生成一个代理类15E.使用建议15二、Hibernate综合练习15前期案例:任务列表示例重构(采用Struts2+Hibernate)15A.Hibernate前期准备15B.为了更好使用一级缓存,采用ThreadLocal封装Session16C.采用Hibernate重构ProjectDAO17D.为了支持延迟加载API,采用拦截器实现OpenSessionInView模式18Day0320一、什么是关联映射,有什么好处20二、一对多关联映射20示例:d_order和d_item存在一对多的业务关系20一对多关系映射的实现步骤:20三、多对一关联映射21多对一关系映射实现步骤:21四、关联操作221、关联查询222、利用lazy属性控制延迟加载223、级联操作(采用关系级联方式进行添加、删除、更新操作)22A.在关联属性映射部分添加cascade属性,可以指定以下属性22B.Inverse属性的作用22C.级联添加23D.级联删除23Day0424一、如何使用Myeclipse生成映射文件和实体类?241、如何根据DB生成实体类和映射文件24A.利用Myeclipse追加Hibernate框架步骤:24B.利用Myeclipse根据表生成实体类和映射文件26二、多对多关系映射29三、继承关系映射301、继承关系映射(1)30A.首先将Book继承自Product类30B.修改Book.hbm.xml描述信息302、继承关系映射(2)-理解31Day0533一、其他映射331、List集合映射332、formula子查询映射343、Component组件映射344、联合主键映射36案例:采用联合主键映射+组件映射对t_person表进行操作。36二、Hibernate查询操作391、HQL语句查询392、Criteria条件查询423、Native SQL查询43三、Hibernate高级特性441、二级缓存44A.二级缓存适用环境44B.二级缓存使用方法44C.二级缓存的管理方法452、查询缓存45A.查询缓存适用的环境45B.查询缓存的使用方法.453、Hibernate操作并发处理.45A.悲观锁45B.乐观锁46Day01一、 Hibernate基本概念1、 Hibernate是什么,有什么作用和好处Hibernate是一个数据库访问框架,用于实现对数据库的增删查改操作。使用Hibernate框架可以简化数据库访问操作,要程序员将更多的经历放在业务层编写上。原有JDBC操作数据库存在一些问题,主要有以下几个方面 需要编写大量的复杂的SQL语句 需要设置大量的SQL参数或者将ResultSet取值封装成实体对象 当数据库移植时,需要修改部分SQL语句和操作使用Hibernate框架可以解决以上问题。2、 Hibernate实现原理设计原理:ORM(Object Relation Mapping)对象关系映射。意思是将程序中的实体对象和关系数据库表中的一行记录进行映射。这样在程序中使用该工具就可以将一个对象写入数据表,或者将数据表记录自动封装成一个对象返回。例:User user=(User)session.get(User.class,1); 自动生成一个select*from d_user where id=1; 自动解析ResultSet封装成一个User对象返回; 插入数据:session.save(user);可以这样理解,利用Hibernate可以将User对象直接更新到数据中;查询时可以将数据表记录以User对象形式返回。中间的JDBC+SQL操作对程序员来说不用关心,在Hibernate底层封装好了。同类框架还有一些,比如iBATIS,JPA等。3、 Hibernate框架主要结构 Hibernate主要有以下组成部分: 实体类:用于映射数据表记录 映射表示文件(*.hbm.xml)描述实体类名和表明,属性名和字段名之间的映射关系 Hibernate配置文件(hibernate.cfg.xml)定义数据库连接参数,和一些框架系统参数 底层API Configuration:配置对象,用于加载hibernate.cfg.xml SessionFactory:用于创建Session对象(指java连接数据库之间的会话,与用户浏览中的Session没有关系) Session:用于执行对象操作,例如增删改查。 Query:用于执行复杂的查询操作。 Transaction:用于控制hibernate事务。默认情况下,hibernate关闭了自动提交机制。二、 Hibernate基本应用1、 Hibernate使用步骤 引入hibernate和数据库驱动开发包 添加hibernate配置文件hibernate.cfg.xml例:hibernate.cfg.xml放到工程src下org.hibernate.dialect.MySQLDialectjdbc:mysql:/localhost:3306/dangdangrootwhscom.mysql.jdbc.Driverthreadtruetrue 编写实体类和映射描述文件hbm.xml(hbm.xml 需要cfg.xml加载)例:User.hbm.xml和实体类User放到同一个目录下 编写DAO数据访问操作代码例:部分操作代码import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.Transaction;/借助于hibernate保存到数据库Configuration conf=new Configuration();/加载hibernate配置conf.configure(/hibernate.cfg.xml);/获取sessionFactorysessionFactory sf=conf.buildSessionFactory();/获取sessionSession session=sf.openSession();/打开事务Transaction ts=session.beginTransaction();/保存session.save(user);/主键Id查询User user=(User)session.get(User.class, id);/删除User user=new User();user.setId(4);session.delete(user);/全部字段更新 new User 并赋值/更新部分字段值User user=(User)session.load(User.class, id);user.setEmail();/提交事务mit();/释放session.close();三、 映射类型 在定义属性和字段之间映射时,可以通过type知道映射类型。主要作用是完成属性值和字段值之间类型的转换。Type属性可以指定Java类型和Hibernate类型。1、 Hibernate映射类型主要有以下几种: 整数类型integer,long,byte,short 浮点数类型float,double 字符串类型string Boolean char(1)类型yes_no:可以将true和false映射成Y和N字符true_false:可以将true和false映射成T和F字符 日期(YYYY-MM-DD)date 日期+时间timestamp 其他big_decimal,big_integer,blob,clob图为hibernate映射类型表四、 主键生成在主键映射时,可以利用指定主键的生成。当进行添加save()操作时,hibernate会根据指定生成方式生成一个id值,一般不需要程序员参与。Hibernate预定义的生成方式如下: identity 通知hibernate框架,主键值采用数据库自动增长机制生成。常用于MySQL,SQLServer。 sequence通知hibernate框架,主键值采用指定序列生成,然后insert数据库。主要适用于Oracle,使用格式 foo_seq native通知hibernate框架,根据dialect方言不同,自动选择identity和sequence方式。如果方言是MySQL选择identity,如果方言是Oralce选择sequence increment通知hibernate框架,先执行select max(id) from table,然后加1在执行insert操作。只用于各种数据库。 assinged 通知hibernate框架,忽略主键生成。需要程序员在代码中设置id值。setId(指定值). uuid,hilo等 hibernate会根据uuid算法生成一个主键值,该值为字符串类型。 hibernate会根据hilo算法生成一个主键值,该值为数值类型。 如果以上生成方式不能满足,可以自定义。首先定义一个类,该类要实现IdentifierGenerator接口,在generator方法定义自己的主键规则。 然后在配置。Day02一、 Hibernate框架的基本特性1、 Hibernate一级缓存A. 一级缓存的特点 当查询某个对象时,Hibernate首先去一级缓存中查找,如果存在将缓存中的对象取出返回。如果不存在才去数据库查询。 当查询某个对象时,Hibernate会自动将数据库查询出的对象放入一级缓存(例如session的load和get方法查询出的对象)。 一级缓存默认启用。一般被称为Session级别的缓存。因此一级缓存随着Session对象创建,随着Session对象释放而销毁。 每个Session都有自己一个独立的一级缓存空间,不能访问其他Session的缓存空间。B. 一级缓存的好处在使用同一个Session查询同一个对象若干次的时候,只是第一次时查询数据库,后续几次都会从缓存取出。从而减少对数据库的查询次数。C. 使用建议 在处理一个请求时,使用一个session对象处理。可以使用ThreadLocal技术封装Session。例:使用ThreadLocal技术封装Session工具类import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtil private static ThreadLocal sessionLocal=new ThreadLocal();private static SessionFactory sf;static/借助于hibernate保存到数据库Configuration conf=new Configuration();/加载hibernate配置conf.configure(/hibernate.cfg.xml);/获取sessionFactorysf=conf.buildSessionFactory();public static Session getSession()Session session=sessionLocal.get();if(session=null)/新建sessionsession=sf.openSession();sessionLocal.set(session);return session;public static void closeSession()Session session = sessionLocal.get();sessionLocal.set(null);if(session != null)session.close(); 如果不需要将对象占用一级缓存,可以使用下面方法手动管理缓存空间。 session.evict(Obj);/将Obj对象从缓存中清除。 session.clear();/清空缓存中所有对象。 3.0版本之后Hibernate将session对象与Thread绑定机制进行了封装,支持线程单例。使用方法如下: 在Hibernate.cfg.xml中添加配置org.hibernate.dialect.MySQLDialectjdbc:mysql:/localhost:3306/dangdangrootwhscom.mysql.jdbc.Driver Thread truetrue 在HibernateUtil中使用SessionFactory的getCurrentSession()方法获取Session对象。import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtil private static SessionFactory sf;static/借助于hibernate保存到数据库Configuration conf=new Configuration();/加载hibernate配置conf.configure(/hibernate.cfg.xml);/获取sessionFactorysf=conf.buildSessionFactory();public static Session getSession()/获取当前线程关联的Session对象,如果没有就新建一个/使用前需要在hibernate.cfg.xml中配置Session session = sf.getCurrentSession();return session;注意:getCurrentSession()方法返回的Session对象,需要在事务中。因为Session在事务结束后自动关闭。/打开事务Transaction ts=session.beginTransaction();/提交事务mit();2、 Hibernate对象持久性Hibernate是一个持久层框架,为应用程序构建一个持久层。图为:状态关系的转换在Hibernate使用中,实体对象可以有以下几种状态: 临时态采用new方式新建的对象。 持久态持久态特点: 对象数据状态发生改变,Hibernate会自动同步到数据库。 对象不能被垃圾回收机制(gc)回收。当一个对象与Session发生关系后,就会变成持久对象。或者这样说,在Session缓存中的对象,都具有持久性,对象数据改变都要负责同步操作。持久对象在调用session.flush()方法时进行数据库同步。当在执行事务提交时,底层默认调用了flush()。 游离态/脱管态当一个持久对象脱离了Session管理后,就处于游离态。例如调用了session.evict(Obj);session.clear();例:向User表中插入100000条记录Session session = HibernateUtil.getSession();Transaction tx = session.beginTransaction();for(int i=0;i100000;i+) User user = new User(); /setter设置值 session.save(user);/user变为持久对象,放入缓存 if(i%50=0) session.flush();/将缓存中的user对象与数据库同步 session.clear();/清除缓存中的user,释放空间 mit();/同步+事务提交HibernateUtil.closeSession();3、 Hibernate延迟加载Hibernate在查询一个对象时,并没有立刻去数据库查询,而是在调用对象的getter方法时,才触发SQL去数据库加载数据。A. 针对于以下方法,Hibernate默认使用延迟加载机制: session.load();采用延迟加载id=?对象 query.iterator();采用延迟加载访问查询集合集 关联属性的getter方法();采用延迟加载实例化关联属性B. Session的get和load方法区别:作用相同,都是按照主键条件查询某个对象,不同点如下: get方法不使用延迟加载机制,load采用延迟加载机制。 如果没有满足条件的记录,get方法返回null,load则抛出异常。 Load方法返回的对象是一个动态代理类(Hibernate框架动态生成的,是实体类的子类型),get方法返回的对象类型就是原实体类型。C. 延迟实现原理 在使用具有延迟加载机制API时,返回的是一个动态代理类型。首先动态在内存中创建的一个类。然后动态编译这个类,载入类加载器。 返回的动态代理类是原实体类型的一个子类。 动态代理类重写了实体类的getter,检测是否加载数据库的数据,未加载进行数据库查询,然后返回该属性值。User user=User$EnhancerByCGLIB$234234 /执行User$EnhancerByCGLIB$234234的getEmail();方法User.getEmail();/检测数据是否加载,然后返回属性值D. Hibernate框架如何动态生成一个代理类 首先借助asm.jar在内存中动态创建一个类。 然后借助cglib-2.1.3.jar在内存中动态创建一个实体类的子类。E. 使用建议在程序中,如果使用上述延迟加载操作,需要避免Session对象过早关闭问题。否则出现InitializationException异常:could not initialze proxy-no Session,为避免上述异常,一般采用OpenSessionInView模式。可以将Session关闭采用Fiter或Interceptor(struts2推荐)封装。发送请求拦截器AActionDAOResultJSP拦截器A(关闭Session)HTML响应二、 Hibernate综合练习前期案例:任务列表示例重构(采用Struts2+Hibernate)A. Hibernate前期准备 引入hibernate和数据库驱动开发包 添加hibernate配置文件hibernate.cfg.xml 添加实体类Product.hbm.xmlB. 为了更好使用一级缓存,采用ThreadLocal封装Sessionpublic class HibernateUtil private static SessionFactory sf;private static ThreadLocal sessionLocal = new ThreadLocal();staticConfiguration conf = new Configuration();/加载hibernate配置conf.configure(/hibernate.cfg.xml);/获取sessionFactorysf = conf.buildSessionFactory();public static Session getSession()Session session = sessionLocal.get();if(session = null)/新建一个sessionsession = sf.openSession();sessionLocal.set(session);return session;public static void closeSession()Session session = sessionLocal.get();sessionLocal.set(null);if(session != null)session.close();C. 采用Hibernate重构ProjectDAO 重构findAll();方法/查找所有数据public List findAll()throws Exception/执行HQL查询,面向对象进行查询String hql=from Project;Query query=HibernateUtil.getSession().createQuery(hql);List projects=query.list();return projects; 重构findAllPage(int page,int rowpage);方法public List findAllPage(int page,int rowpage)throws Exception/执行HQL查询,面向对象进行查询String hql=from Project;Query query=HibernateUtil.getSession().createQuery(hql);/设置分页查询参数int begin = (page-1)*rowpage;query.setFirstResult(begin);/设置返回记录的起始索引query.setMaxResults(rowpage);/设置返回记录的最List projects=query.list();return projects; 重构countTotalPage(int pageSize);方法/根据pageSize统计总页数public int countTotalPage(int pageSize)throws ExceptionString hql=select count(*) from Project;Query query=HibernateUtil.getSession().createQuery(hql);int num=(Long)query.uniqueResult().intValue();if(num=0)return 1;elseif(num%pageSize=0)return num/pageSize;elsereturn num/pageSize+1; 重构addProject(Project p);方法/save保存添加数据public void addProject(Project p)HibernateUtil.getSession().save(p); 重构delProject(int id);方法/根据id删除数据public void delProject(int id)Project pro = new Project();pro.setId(id);HibernateUtil.getSession().delete(pro); 重构updateProject(Project p);方法/更新数据public void updateProject(Project p)throws ExceptionHibernateUtil.getSession().update(p); 重构loadProject(int id);方法/加载数据public Project loadProject(int id)Project pro = (Project)HibernateUtil.getSession().load(Project.class, id);return pro;D. 为了支持延迟加载API,采用拦截器实现OpenSessionInView模式 编写OpenSessionInViewInterceptor拦截器extends AbstractInterceptorpublic class OpenSessionInViewInterceptor extends AbstractInterceptorpublic String intercept(ActionInvocation invocation) throws Exception Transaction tx = null;trytx = HibernateUtil.getSession().beginTransaction();invocation.invoke();/执行action,mit();return null;catch(Exception ex)ex.printStackTrace();if(tx != null)tx.rollback();throw ex;finallyHibernateUtil.closeSession(); 配置拦截器到struts.xml/login.jsplist5/WEB-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车展端午节活动策划方案
- 管工进场考试题及答案
- 歌剧赏析考试题及答案
- 高考试题及答案物理
- 技术转移成效见证承诺书(3篇)
- 员工绩效考核评估报告标准化模板
- 费县中考试题及答案
- 班主任老师演讲稿:感恩的心(8篇)
- 环保话题的讨论与思考议文周记7篇
- (正式版)DB15∕T 3404.4-2024 《全民所有自然资源资产清查技术指南 第4部分:草原资源》
- 仓库货物运送管理制度
- 《思想道德与法治》课件-第一节 人生观是对人生的总的看法
- 颈深间隙感染诊疗与管理
- 安徽科技馆笔试题目及答案
- 厂房分割租赁协议书
- 会计中级职称《财务管理》电子书
- 无人机教员聘用协议书
- 足球教练员的职业素养与道德规范
- 产地证培训讲义
- 《南京理工大学化工》课件
- 养殖场远程视频监控解决方案
评论
0/150
提交评论