




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.hibernate的概念#Hibernate ORM框架 数据持久层的框架 与数据库有紧密的关系#Hibernate 冬眠 2.hibernate的包结构#doc Hibernate的官方文档#eg Hibernate提供参考的小例子#ect Hibernate核心配置文件的模板#test Hibernate技术的测试文档#src Hibernate的源代码#lib Hibernate的所有的jar包#grammar hql语言的语法定义#Hibernate3.jar Hibernate的核心jar包3.hibernate的核心jar包#找到Hibernate的11个基本的jar包 还数据库的jar包#antlr.jar #cglib.jar#asm.jar#asm-attrs.jars #commons-collections.jar#commons-logging.jar#ehcache.jar#hibernate3.jar#jta.jar#dom4j.jar#log4j.jar#ojdbc6.jar4.关于hibernate.cfg.xml的作用#hibernate.cfg.xml 配置数据库连接的核心配置文件 有且只有一个#配置核心配置文件 具体的每一个property 请参考perties文件#oracle.jdbc.driver.OracleDriver#用户名#jdbc:oracle:thin:localhost:1521:orcl#密码#org.hibernate.dialect.OracleDialect#方言:dialect 根据数据库的不一样 生成该数据库可以识别的语句每个数据库的分页语句都不一样Hql 就是一门世界语 面向对象的sql语句 MSSQL:select top 5 * from 表名 where 主键 in (select 主键 from 表名) sqlMYSQL:select * from 表名 limit 0,5 mysqlORACLE:select * from (select t.*,rownum rn from 表名 t order by t.id ) where rn= ? and rn=? Osql5.*.hbm.xml文件的作用#*.hbm.xml 配置类和数据库表的映射的核心配置文件 *一定要和类名保持一致 无限多个#一个vo有一个hbm.xml文件#配置类和数据表的映射的文件#类在哪个包下 配置文件就应该在该包下# Student类# private int stu_id;#private String stu_name;#private String stu_sex;#private int stu_age;#private String stu_address;#对应的Student.hbm.xml文件# # #将写好的Student.hbm.xml 的路径通过map resource=“”填入到hibernate.cfg.xml配置文件中#将ECT文件夹中的perties文件拷贝到src目录中6.最基本的增删查改操作Save update delete get load saveorupdate 7.对于HibernateUtil的封装操作8.从类生成表#通过以下语句根据hbm配置文件去建表#Configuration cfg =new Configuration();cfg.configure();/通过我们的类来建一张表SchemaExport export =new SchemaExport(cfg);export.create(true, true);9.从表反向成为类的步骤1.打开Myeclipse Database explorer视图2选择要反向生成类的表10.使用Myeclipse自动添加hibernate支持1.使用Myeclipse添加Hibernate项目的支持2.选择hibernate的版本 以及相应的jar包 core.libraries里面有11个核心jar包3.是否生成hibernate.cfg.xml配置文件 有一个可以打钩的复选框代表了配置文件在我们配置完毕之后自动打开4.从已有的myeclipse.database.explorer自动扫描出当前已经配置好的好用的数据库连接 ,将读取出来的信息加载到当前的hibernate.cfg.xml文件中5.帮助我们生成一个hibernate工具类 默认的名字叫hibernatesessionFactory11.hibernate.cfg.xml中可选配置show_sql=trueformat_sql=trueHbm2ddl.Auto Create|update 如果取值是create 不管你执行任何的操作 先把表删了再说 再重建 再执行你的sql语句如果取值是update的话 如果发现了你的表结构没有变,就插入数据 如果表结构变了,也继续插入,只是数据置空如果你这里表结构需要重新设计,请使用create如果需要插入数据 是使用update12.主键生成策略#被映射的类必须定义对应的数据表的主键字段#主键的特点:非空 不能相同#Hibernate为我们提供了很多的主键的生成方法#达到主键非空 不能相同的目的#Increment mysql的主键生成方式类似于sql server identity 可以支持oracle #Identity 这个sql server mysql db2 不支持oracle #sequence 是oracle支持的 haha就是当前你oracle中存在的一个序列名 haha #hilo 高低位的算法 现在我们的数据库创建一个表hahaxixi 里面有一个字段叫nextvalue 初始值是1 每插入100数据就加next_value就加1个hahaxixi next_value 100 #seqhilo 创建一个临时的sequence叫做next_value 初始值是0next_value 0 #uuid 生成一长串的不同的字符串 例如4028ac1639f73f7e0139f73f8147000 #guid是mssql server中的一种主键生成方式 例如:6E5B36946881432DB3E780014EE19D3A #native 会自动选择在oracle中设置主键生成的方式native,它会以sequence的形式去生成主键,这个自动生成的sequence的名字叫hibernate_sequence 这个序列会被每一个实体所共享#assigned 让应用程序在save之前为对象分配一个标示符#select 使用触发器来生成一个主键#sequence-identity 使用数据库序列来生成唯一值13.关系映射(双向和单向)在此处声明:Myeclipse生成的hibernateSessionFactory有bug女人 Woman_idWoman_name男人Man_idMan_name主键双向一对一public class Man/*男人的编号*/private int man_id;/*男人的名字*/private String man_name;/*男人对应的女人*/private Woman woman; 最重要的配置还是在从表这边public class Woman/*女人的编号*/private int woman_id;/*女人的名字*/private String woman_name;/*可以通过这里找到关联的男人*/private Man man; man 主外键一对一的关系在从表中添加一个字段(非空 唯一 和主表的主键相关联) public class Woman private int woman_id;private String woman_name;private Man man; /*这个字段是必须的 就代表了在表中再添加一个字段*/ Man表public class Man private int man_id;private String man_name;private Woman woman;这里的property-ref就代表了引用Woman类的对应的配置文件中的叫做man的这个属性部门表Dept_idDept_name员工表Emp_idEmp_nameDept_id一对多* * 作者: 赵XX * 时间:2012-9-24 下午04:41:08 * 版权说明:软帝信息科技有限公司 * 说明:部门表 */public class Dept /*部门编号*/private int dept_id;/*部门名称*/private String dept_name;部门表的映射文件 * * 作者: 赵XX * 时间:2012-9-24 下午04:40:46 * 版权说明:软帝信息科技有限公司 * 说明: 员工表 */public class EmpVO /*员工编号*/ private int emp_id;/*员工名称*/ private String emp_name; /*这里就代表员工属于哪个部门*/ private Dept dept;员工表的映射文件 在做增加的时候如果先增加部门 在增加员工 2条语句Hibernate: insert into Dept (dept_name) values (?)Hibernate: insert into EmpVO (emp_name, dept_id) values (?, ?)先增加员工 再增加部门 3条语句 最后一条语句是用来建立关联关系的 是一条update语句Hibernate: insert into EmpVO (emp_name, dept_id) values (?, ?)Hibernate: insert into Dept (dept_name) values (?)Hibernate: update EmpVO set emp_name=?, dept_id=? where emp_id=?我们可以从多方找到一方单向一对一的关联双向关联 我们可以从一方获得多方* * 作者: 赵XX * 时间:2012-9-24 下午04:41:08 * 版权说明:软帝信息科技有限公司 * 说明:部门表 */public class Dept /*部门编号*/private int dept_id;/*部门名称*/private String dept_name;private Set empvos=new HashSet(); 通过一对多 多对一的出来的结论一对多的关联多的一方的many-to-one是必不可少的一的一方的set中的one-to-many是可有可无的如果不写一的一方 那就是一个单向关联如果一的一方写了 多的一方也写的 就是双向关联主键一对一(主表和从表)从表的one-to-one是必不可少的contrainted是必须的从表的主键生成策略必须是foreign 去引用one-to-one的属性name的名称单向的一对一主表中的one-to-one是可有可无的如果一的主表配置了one-to-one 从表也配置了one-to-one 就是主键一对一双向关联主外建一对一(主表和从表)建立主外建的一对一的关联在从表中添加一个字段(非空 唯一 和主表的主键相关联) 双方去维护关系主表的one-to-one的配置不可少从表many-to-one的配置也必不可少唯一的 非空的通过主表的one-to-one的property-ref去应用从表中的many-to-one多对多/* * * 作者:赵丹 * 时间: 2012-9-26上午10:06:11 * 说明: 角色实体类 * 版权信息:软帝信息科技有限公司 */public class CommonRole /*角色编号*/private int role_id;/*角色名称*/private String role_name;/*通过角色可以获得多个用户*/private Setusers=new HashSet();/*通过角色可以获得多个资源*/private Setres=new HashSet(); /* * * 作者:赵丹 * 时间: 2012-9-25下午3:19:48 * 说明: 用户实体类 * 版权信息:软帝信息科技有限公司 */public class CommonUser /*用户编号*/private int user_id;/*用户名*/private String user_name;/*用户密码*/private String user_password;/*用户状态*/private int user_status;/*可以找到多个角色*/private Set roles=new HashSet();/* * * 作者:赵丹 * 时间: 2012-9-26上午10:10:43 * 说明:资源实体类 * 版权信息:软帝信息科技有限公司 */public class CommonRes /*资源编号*/private int res_id;/*自身节点的编号*/private int node_id;/*父节点的编号*/private int p_id;/*资源名称*/private String res_name;/*资源的连接地址*/private String res_url;/*可以得到资源对应的角色*/private Set roles=new HashSet(); 14.组件映射组件映射的概念:把通用的实体的属性抽象出来单独作为一个类当前我们将person做了一个通用组件public class Person private String name;private String sex;private String age;private String address;在类中使用将这个组件引如进来public class Teacher private int id;private Person per;这里person类引用的就是通用的person组件在配置文件中通过将单独的那个类给引入进来这里per就是指的类中的这个Person组件 15.集合映射标签实际上就是一个list代码public class Man private int man_id;private String man_name;private List womans=new ArrayList();hbm.xml中代码 public class Man private int man_id;private String man_name;private Mapmap=new HashMap(); 使用map标签 里面有的意思就是说将表中的字段取出来放入一个map中,但是作为map-key的表中的woman_name这个字段One-to-many会返回多个womans对象15.5.级联操作cascade = CascadeType.ALL save delete all诛连九族15.8对象的三种状态以及openSession和getcurrentSession之间的区别16.继承映射17.批量处理见/uohzoaix/article/details/737242718.hql语言Hql语言是一门查询查询语言Hql的规则是 用类来代替表 用类的属性来代替表中的字段查询全部select o from 类名 ofrom 类名from 类名 as o条件查询select o from Womans o where o.woman_name like 张%select o from Womans o where o.woman_id=4 and o.woman_name like 张%Configuration cfg=new Configuration();cfg.configure();SessionFactory sf=cfg.buildSessionFactory(); Session s=sf.openSession(); Query query=s.createQuery(select o from Womans o where o.woman_id=? and o.woman_name like ?); query.setInteger(0,4); query.setString(1,张%); /如果说返回单个值 Womans woman=(Womans)query.uniqueResult();System.out.println(woman.getWoman_name();from Man,Womansselect w.woman_name from Womans w where w.man.man_id=(select man_id from Man where man_id=1)select w, m from Womans w,Man m where m.man_id=w.man.man_idselect w,m from Womans w right join w.man m where m.man_id=1使用的聚合函数 得到的结果只有一个值如果说你当前的聚合函数和分组的条件放在一起,就相当于你相去查看该组的聚合结果集/分组的规则:分组的意思:根据一些共同点将数据分成一个或者多个组如果说当前你的查询的字段有多个,那么除了聚合函数之外,其他的字段都要当做聚合函数不参与分组分组的条件java1210 java1211 张三 张大炮李四 李大炮 18.5 Criteria查询19.native sql查询A如果查询的数据是多个对象的话 返回的是一个list的集合例如 Hql from 类 条件 或者 select o from 类 o where 条件Sql select * from 表 B如果查询的数据是表中的多个字段,并不是所有的属性 ,返回值也是一个list但是这个list中存放的是object数组 objectcount代表了查询的字段的每一个的顺序C.如果查询出来的数据是一个数值的话 应用使用query.uniqueResult 或者使用query.list.get(0) 转换成为Long类型D. 如果查询出来的数据是一个对象的话 应用使用query.uniqueResult 或者使用query.list.get(0) 转换成为该对象类型即可E在使用本地的sql语言的时候nativesql 通过createsqlquery 得到sqlquery对象 该对象用来处理sql语句 如果返回的是单个对象的话 需要在后面加上addentity(类.class)这样就可以通过sqlquery.uniqueResult查询出来的结果自动转换为你需要的对象FHQL语言的原则,将表名变成类名 将字段名变成属性名 连接查询不需要on需要通过导航来建立关系 这里w.man 这里就是导航例如Select w,m from Womans w left join w.man mG如果查询是多张表的数据 如果该数据存在导航关系 只需要一句话即可,hibernate会自动帮助建立起关联关系这里w.man.man_name根据这句话 会自动建立关联关系例如Select w.woman_id,w.woman_name,w.man.man_name from Womans w20.懒加载Get和load之间的区别21.fetch的策略22.二级缓存缓存的概念:在hibernate中,hibernate给我们提供一个缓存机制。一级缓存(session) 二级缓存(sessionFactory) 1. 加入ehcache.xml文件2. 加入ehcache的jar包3. 在hibernate.cfg.xml配置文件中加入4. 5. org.hibernate.cache.EhCacheProvider 6. 7. true8. 然后在你需要确定哪个类来配置二级缓存9. 在该类中添加一个注解10. Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)11. 在session开启事务之后12. 加上 s2.setCacheMode(CacheMode.NORMAL); 说明当前的session可以使用二级缓存23.悲观锁和乐观锁Hibernate中的悲观锁和乐观锁悲 乐锁的场景应用的范围悲观锁: 当我用的时候 我就将这个对象锁,其他人都不能用AnnotationConfiguration cfg=new AnnotationConfiguration();cfg.configure();SessionFactory sf=cfg.buildSessionFactory();Session s=sf.getCurrentSession();s.beginTransaction(); Piao piao=(Piao)s.get(Piao.class,1,LockMode.UPGRADE);/这里就可以将这个对象锁住,只让第一个使用该对象的人去使用 piao.setStatus(2); s.save(piao); s.getTransaction().commit(); Session s2=sf.getCurrentSession(); s2.beginTransaction(); s2.getTransaction().commit(); piao.setStatus(3); s2.save(piao); 乐观锁会在你的类中定义一个version的注解 用来标识当前的数据的版本号Entitypublic class PiaoIdGeneratedValue(strategy=GenerationType.AUTO) Version 这里就声明了当前的这个类是支持乐观锁的,可以同步使用资源private int id;private String name;private int status;23.5实现通用的增加 删除 修改 查询 TOP查询 分页查询 通用:这五个方法可以被每一个类都可以使用?package com.softeem.dao;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import org.hibernate.Query;import org.hibernate.Session;import com.softeem.idao.ICommonDAO;import com.softeem.utils.HibernateUtil;import com.softeem.utils.PageUtil;import com.softeem.vo.Student;/* * * 作者: 赵XX * 时间:2012-9-27 下午01:22:40 * 版权说明:软帝信息科技有限公司 * 说明: 通用的增 删 查 改 方法 */public class CommonDAO implements ICommonDAO private Session s; public void save(Object o) s=HibernateUtil.getSession();s.beginTransaction();s.save(o);s.getTransaction().commit(); public void update(Object o) s=HibernateUtil.getSession();s.beginTransaction();s.update(o);s.getTransaction().commit(); /反射/Class.forName(类的路径) =Class/Object.getClass()=Class/类.class()=Classpublic void delete(Object o,int id) s=HibernateUtil.getSession();s.beginTransaction(); Object ob=s.get(o.getClass(),id);s.delete(ob);s.getTransaction().commit();public Object findbyid(Object o,int id) s=HibernateUtil.getSession(); s.beginTransaction();Object ob=s.get(o.getClass(), id); s.getTransaction().commit(); return ob;/查询全部的分页/多个条件查询分页/排序后的数据也要分页/Object代表你要查询的是哪个表/pageindex代表了当前是第几页/where代表了你的where条件/params代表了给where语句加入参数/order代表了排序/带条件 带排序的分页public PageUtil findbyindex(Object o,String where,Objectparams,Maporder, int pageindex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 青海省大通县2026届九上化学期中联考试题含解析
- 河北省石家庄市长安区2026届英语九上期末教学质量检测模拟试题含解析
- 广东省深圳市育才一中学2026届九年级英语第一学期期末联考模拟试题含解析
- 2025年养老护理员(三级)急救技能实际操作试题及答案
- 2026届资阳市重点中学九年级化学第一学期期中达标检测模拟试题含解析
- 2026届云南省大理市化学九上期中检测模拟试题含解析
- 2026届黑龙江省宝泉岭农垦管理局化学九年级第一学期期末检测模拟试题含解析
- 2026届黑龙江省宝泉岭农垦管理局九年级化学第一学期期中质量跟踪监视试题含解析
- 2026届安徽庐江县英语九上期末质量检测试题含解析
- 离婚协议补充协议:共同财产分割及子女教育费用承担
- 海南省危房改造对象认定表
- GB/T 8295-2008天然橡胶和胶乳铜含量的测定光度法
- 生产作业管理讲义
- 诗和词的区别课件
- (新版)海南自由贸易港建设总体方案考试题库(含答案)
- 战现场急救技术教案
- 内蒙古电网介绍
- 气力输送计算
- 新北师大版七年级上册数学全册课件
- 公共关系学授课教案
- 河北省城市集中式饮用水水源保护区划分
评论
0/150
提交评论