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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

hibernate总结.docx

1、hibernate总结05-06流水号问题07-10分页14 one-to-one 可是创建表在什么时候创建呢15 one-to-many16 one-to-many主控权在one端17 one-to-many主控权在one端 迫切左外连接 :只返回左侧第一个对象 left join fetch18 one-to-many 主控权在many端(推荐)19 openSessionInView20 自身做映射:tree21 many-to-many 两端看集合22 多对多拆分成两个一对多:配置和标准一对多相同 23 继承类映射: 1. 一张表描述:一棵树继承类 24 继承类映射: 2. 每个类对应

2、一张表:公共类为一张表、子类分别对应一张表25 继承类映射: 3. 每个具体类对应一张表:公共类为抽象、子类分别对应一张完整表 26 主键生成方式27 优化一对多28 单端抓取策略29 单端抓取策略34 复合主键35 解决多表存在公共字段的问题38 分离查询39 过滤器查询40-43 二级缓存 hibernate原理:1.解析hibernate.cfg.xml读取数据库配置信息 2.通过hibernate.cfg.xml读取对象映射配置文件(获取数据表属性 初始化数组用于存入对象的get方法串) 3.连接数据库 4.构造sql字符串 5.构造传入对象的get方法串存入数组中 6.插入数据(获取

3、sql串,先从数组中得到get方法串通过反射得到 真实的get方法及类型,并调用get方法获得属性值把?替换掉存入库) * ORM框架:object relation mapping对象关系映射 * sessionFactory工厂模式,内部使用了构造方法私有化是单例模式,session是对外的公共接口,是静态的可直接调用 * session与jsp内置对象无关 * 底层封装了jdbc,拼写sql串 * ORM解决的主要问题就是对象-关系的映射。域模型和关系模型都分别建立在概念模型的基础上。域模型是面向对象的,而关系数据模型是面向关系的. * 优点:封装性好、数据库无关性好、使用简单、移植性强

4、 * 缺点:实体操作所以批量时性能不好、表关系不能复杂 * hibernate操作的是对象,必须区分大小写通过观察HibernateSessionFactory中,加载配置文件,得到sessionFactory,通过getSession()得到session,通过closeSession()关闭session等。在该类中已封装好了。* ORM框架:object relation mapping对象关系映射 * Hibernate既不会渗透到上层域模型中,也不会渗透到下层数据模型中。 软件开发人员可以独立设计域模型,不必强迫遵守任何规范。 数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范

5、。 对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便。 * 创建表:反向生成 - 第一种 public static void createTable() SchemaExport se = new SchemaExport(configuration); se.create(true, true); - 第二种:配置属性文件 update #hibernate.hbm2ddl.auto create-drop先删除在创建 #hibernate.hbm2ddl.auto create创建覆盖原库 #h

6、ibernate.hbm2ddl.auto update存在就不创建否则创建 #hibernate.hbm2ddl.auto validate检查是否存在库,不存在就异常 * 一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。SessionFactory有以下特点: 它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。 它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFactory实例, 在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据

7、库创建一个单独的SessionFactory实例。 *Session接口是Hibernate应用使用最广泛的接口。 Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。 Session有以下特点: 不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。 Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象, 例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。 * 持久化对象的状态: - 临时对

8、象:刚被new出来,没有经过session管理,随时都有可能丢失。 - 持久对象:由临时对象转化而来,经过session管理,数据库中有对应记录 - 游离对象:由持久对象转化而来,数据库中有对应记录,暂时脱离session管理(更新) * 保存对象:save和session.persist(p);* HQL:HIBERNATE QUERY LANGUAGE查询对象的语言 * QBC:Query By Criteria查询对象的语言(更加体现面向对象) from entity where propertyName=:param select a.username,a.sex from entit

9、y a where propertyName=:param投影 * QBE检索方式:是QBC检索方式的子查询方式 /- * hql: public List show(final String sex) return (List) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) Query query = session.createQuery(from TPerson where sex=:uname); query.setString(uname,sex); return query.list

10、(); ); /链式:推荐使用 public List showA(final String sex) return (List) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) return session.createQuery(from TPerson where sex=:uname) .setString(uname,sex) .list(); ); /- qbc: /* * 显示 */ SuppressWarnings(unchecked) public List showQBC(fi

11、nal String sex) return (List) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) Criteria c = session.createCriteria(TPerson.class); Criterion cr = Expression.eq(sex,sex); c.add(cr); return c.list(); ); /* * 显示 */ SuppressWarnings(unchecked) public List showQBC1(final String se

12、x) return (List) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) Criteria c = session.createCriteria(com.zmx.domain.TPerson); Criterion cr = Expression.eq(sex,sex); c.add(cr); return c.list(); ); /* * 显示 */ SuppressWarnings(unchecked) public List showQBC2(final String sex) r

13、eturn (List) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) return session.createCriteria(TPerson.class) .add(Expression.eq(sex,sex) .list(); ); - qbe: 它是QBC的子功能,允许创建一个对象模板,然后检索出所有和模板相同的对象,但功能不是很强大,且只支持=和like运算符,前提是要依赖QBC查询 public List showQBE(final String sex) return (List

14、) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) TPerson p = new TPerson(); p.setSex(sex); return session.createCriteria(TPerson.class) .add(Example.create(p) .list(); ); /* * * 排序 */ SuppressWarnings(unchecked) public List show() return (List) UtilTemDao.execute(new UtilTe

15、m() public Object callBack(Session session) return session.createCriteria(TPerson.class) .addOrder(Order.desc(id) .list(); ); /* * 聚合函数 */ public double getAvg() return (Double) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) return session.createCriteria(TPerson.class) .set

16、Projection(Projections.avg(id) .list() .get(0); ); /* * 聚合函数 */ public int getCount() return (Integer) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) return session.createCriteria(TPerson.class) /.setProjection(Projections.count(id) .setProjection(Projections.rowCount() .li

17、st() .get(0); ); /* * 分组 * 注意:不返回当前的对象,返回object */ SuppressWarnings(unchecked) public List getGroup() return (List) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) return session.createCriteria(TPerson.class) .setProjection(Projections.groupProperty(sex) .list(); ); /* * 子查询

18、 * 注意:必须是单列单返回 */ SuppressWarnings(unchecked) public List getSubQuery() return (List) UtilTemDao.execute(new UtilTem() public Object callBack(Session session) DetachedCriteria dc = DetachedCriteria.forClass(TPerson.class); dc.setProjection(Projections.max(id); return session.createCriteria(TPerson.c

19、lass) .add(Subqueries.propertyEq(id, dc) .list(); ); 数据库子查询:必须是单列单返回 select * from t_person where username=(select username from t_person where id=20)对于查询显示有两种方式:迭代,加强for返回单个对象 public TPerson show(final int id) return (TPerson) UtilTemDao.execute(new UtilTem() public Object callBack(Session session)

20、 return session.createQuery(from TPerson where id=:id) .setInteger(id,id) .setMaxResults(1) .uniqueResult(); ); * 加载对象:必须只能通过oid * get方法加载:立刻发出sql语句 - 使用后可以及时关闭session对象 - 如果对象不存在那么空指针异常nullPointException - 使用场景:如果就是为了显示或获取属性值 * load方法加载(性能好):延时加载对象,不发出sql语句,直到获取该对象属性值的时候才发出sql语句,使用了CGLIB做代理 - 在获取值之

21、前关闭session对象那么就异常 porxy-no-session - 如果对象不存在那么对象没有找到异常objectNotFound(使用了CGLIB做代理) - 如果在描述文件中设置延时为假那么和get相同都是立刻发出sql语句 - 使用场景:删除对象/* * get */ public TPerson findByIdGet(int id) Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); TPerson p = (TPerson) session.get(TPerso

22、n.class, id); session.beginTransaction().commit(); return p; /* * load */ public TPerson findByIdLoad(int id) Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); TPerson p = (TPerson) session.load(com.zmx.domain.TPerson, id); session.beginTransaction().commit(); /sess

23、ion.close(); return p; * 关联映射: - one-to-one:一对一 - 人和身份证 * 描述实体、在描述关联文件 - cascade=all表示级联 关系描述标签: 从端: person - one-to-many:一对多 - 员工和家庭成员 * 描述实体、在描述关联文件 * one端:对象应该描述到一个关联的集合中 inverse=false表示主控权在one端 * 主控权在谁,谁就负责加载对端 * 会发出多余的update语句,性能不太好 * many端:* 可以把many端的外键属性直接删除掉包括描述文件中的属性 public String save() St

24、ring fname = tf.getUsername().split(,);关注:因为同名后会自动以逗号拼串 String fsex = tf.getSex().split(,); for(int i=0;ifname.length;i+) TFamily tf1 = new TFamily(); tf1.setUsername(fnamei.trim(); tf1.setSex(fsexi.trim(); user.getTfs().add(tf1); dao.saveUser(user); return SUCCESS; * 使用外连接返回object数组,且位置固定 范例: publi

25、c void testA() PersonDao dao = new PersonDao(); Iterator it = dao.show().iterator(); while(it.hasNext() Object obj = (Object) it.next(); TUser user = (TUser) obj0; System.out.println(user.getUsername(); 页面: one: one-to-many inverse=true主控权在many端(推荐) * 配置对象-配置关系文件 * 如果在对象中删除了外键属性那么在配置文件中也要删除 * 延时加载对端many的数据 *

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

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