hibernate  查询_第1页
hibernate  查询_第2页
hibernate  查询_第3页
hibernate  查询_第4页
hibernate  查询_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

HIBERNATE 查 询 HIBERNATE 查 询 方 式 对 象 导 航 查 询 需求:根据 id 查询某个客户,再查询这个客户里面所有的联系人。 根据对象关系得到另一个对象。 OID 查 询 根据 id 查询某一条记录,返回对象。 调用 session 里的 get 方法来实现:传入 Class 对象和 id 值 Customer customer = session.get(Customer.class,1); HQL 查 询 Query 对象,写 hql 实现查询 hql 和 普通 sql 的区别:普通 sql 操作数据库表和字段,hql 操作实体类和属性。 使用 hql 进行查询 创建 Query 对象,写 hql 语句。调用 Query 对象里面的方法,得到结果。 查 询 所 有 from 实体类的名字 需求:查询所有客户记录 Query query = session.createQuery(“from Customer“); List list = query.list(); 条 件 查 询 from 实体类名称 where 属性名称 1=? and 属性名称 2=? from 实体类名称 where 属性名称 like ? Query query = session.createQuery(“from Customer c where c.cid= ? and c.custName= ?“); query.setParameter(0,1); query.setParameter(1,“百度“); 模糊条件查询 Query query = session.createQuery(“from Customer c where c.custName like ?“); query.setParameter(0,“%浪 %“); 排 序 查 询 from 实体类名称 order by 实体类属性名称 asc/desc Query query = session.createQuery(“from Customer order by cid desc“); 分 页 查 询 在 hql 中,无法直接使用 分页查询语句 , hibernate 的 Query 对象中封装了两个方法实现分页查 询。 Query query = session.createQuery(“from Customer“); /设置开始位置 query.setFirstResult(0); /设置每页记录数 query.setMaxResults(3); 投 影 查 询 定义: 查询表中的部分字段, 而不是全部字段. hql 语句 select 实体类属性名称 1,实体类属性名称 2 from 实体类名称 select 语句后面不能写 * . Query query = session.createQuery(“select custName from Customer“); List list = query.list(); 聚 集 函 数 的 使 用 常用的聚集函数:count,sum,avg ,max,min 1. 查询表记录数 select count(*) from 实体类名称 Query query = session.createQuery(“select count(*) from Customer“); Object obj = query.uniqueResult(); QBC 查 询 Query By Criteria:org.hibernate.Criteria 接口 查 询 所 有 Criteria criteria = session.createCriteria(Customer.class); LIst list = criteria.list(); 条 件 查 询 Criteria criteria = session.createCriteria(Customer.class); /设置条件 criteria.add(Restriction.eq(“cid“,1); criteria.add(Restriction.eq(“custName“,“百度“); LIst list = criteria.list(); 使用 Criteria 对象的 add 方法, criteria.add(Criterion criterion); Restrictions 类提供了如下的方法,返回 Criterion 接口对象 方法 说明 Restrictions.eq Restrictions.allEq 利用 Map 来进行多个等于的限制 Restrictions.gt Restrictions.ge Restrictions.lt Restrictions.le Restrictions.between BETWEEN Restrictions.like LIKE Restrictions.in in Restrictions.and and Restrictions.or or Restrictions.sqlRestriction 用 SQL 限定查询 排 序 查 询 Criteria criteria = session.createCriteria(Customer.class); criteria.addOrder(Order.desc(“cid“); LIst list = criteria.list(); 分 页 查 询 Criteria criteria = session.createCriteria(Customer.class); criteria.setFirstResult(0); criteria.setMaxResults(3); 统 计 查 询 Criteria criteria = session.createCriteria(Customer.class); crieteria.setProjection(Projections.rowCount(); 离 线 查 询 不直接使用 session /创建对象 DatachedCriteria datachedCriteria = DatachedCriteria.forClass(Customer.class); /最终执行时 ,才引入 session Criteria criteria = detachedCriteria.getExecutableCriteria(session); HQL 多 表 查 询 MYSQL 中 多 表 查 询 内连接 如果字段没有关联数据,,则不显示 select * from t_customer c, t_linkman l where c.cid=l.clid; select * from t_customer c, inner join t_linkman l on c.cid=l.clid; 左外连接 select * from t_customer c, left join t_linkman l on c.cid=l.clid; 右外连接 select * from t_customer c, right join t_linkman l on c.cid=l.clid; HQL 中 多 表 查 询 内连接 from customer c inner join c.setLinkMan Query query = session.createQuery(“from customer c inner join c.setLInkMsn“); List list = query.list(); 迫切内连接 from customer c inner join fetch c.setLinkMan 迫切内连接与内连接底层数据库操作是一样的。内连接返回的 list 中的元素是数组类型,而迫切内 连接返回的 list 中的元素是 pojo 左外连接 from customer c left join c.setLinkMan 迫切左外连接 from customer c left join fetch c.setLinkMan 右外连接 from customer c right join c.setLinkMan 本 地 SQL 查 询 SQLQuery 对象,使用普通 sql 实现查询 HIBERNATE 检 索 策 略 检 索 策 略 的 概 念 hibernate 检索策略分为两类 立即查询:根据 id 进行查询,调用 get 方法,会马上发语句查询数据库 延迟查询:根据 id 查询,调用 load 方法,只有在得到对象里的值时,才发送查询语句 延迟查询分为两类: 类级别延迟 get/load 关联级别延迟 cascade fetch fetch=FetchType.EAGER( ManyToOne 默认) fetch =FetchType.LAZY(大部分默认):属性获取不发,使用时发。 性 能 优 化 处理 1 + n 问题,当使用 fetch=FetchType.EAGER 时,查询一张表会级联查询相关表。这时, 可能会立即发多条查询语句,影响性能。 解决方法: 设置为 fetch =FetchType.LAZY。 使用表连接。比如 left join fetch 或者使用 createCriteria(内部自动调用 join fetch) 使用 batchsize HIBERNATE 缓 存 机 制 一级缓存在 session 级别,二级缓存在 sessionFactory 级别,三级缓存 相同缓存 二 级 缓 存 经常被访问,不会经常改动,数量有限。(比如:用户权限) 实 体 类 添 加 注 解 Cache(usage = CacheConcurrencyStrategy.READ_WRITE) HIBERNATE.CFG.XML 的 相 关 配 置 true true org.hibernate.cache.ehcac he.EhCacheRegionFactory EHCACHE.XML 缓 存 的 配 置 文 件 二 级 缓 存 的 测 试 package club.lemos; import club.lemos.model.Group; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class HibernateCacheTest private static SessionFactory sessionFactory; BeforeClass public static void beforeClass() sessionFactory = new Configuration().configure().buildSessionFactory(); AfterClass public static void afterClass() sessionFactory.close(); Test public void testSave() Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Group group = new Group(); group.setName(“lisi“); session.save(group); session.getTransaction().commit(); Test public void testCache2() Session session = sessionFactory.openSession(); session.beginTransaction(); Group group = (Group) session.load(Group.class, 1); System.out.println(group.getName(); session.getTransaction().commit(); session.close(); Session session2 = sessionFactory.openSession(); session2.beginTransaction(); Group group2 = (Group) session2.load(Group.class, 1); System.out.println(group.getName(); session2.getTransaction().commit(); session2.close(); /用 java 代码生成建表语句 Test public void testSchemaExport() new SchemaExport(new Configuration().configure().create(true, true); public static void main(String args) beforeClass(); 查 询 缓 存 相同的查询,从二级缓存中取。 true List categories = (List session.createQuery(“from Category“).setCacheable(true).list(); 缓 存 算 法 LRU,LFU,FIFO 事 务 隔 离 机 制 定义:ACID atomicity consistency(一致性) isolation(隔离性) durability 事务并发可能出现的问题 第一类丢失更新 时间 取款事务 A 存款事务 B T1 开始事务 T2 开始事务 T3 查询账户余额为 1000 元 T4 查询账户余额为 1000 元 T5 汇入 100 元,把余额改为 1100 元 T6 提交事务 T7 取出 100 元,把余额改为 900 元 T8 撤销事务 T9 余额恢复为 1000 元(丢失更新) 脏读 时间 取款事务 A 转账事务 B T1 开始事务 T2 开始事务 T3 查询账户余额为 1000 元 T4 汇入 100 元,把余额改为 1100 元 T5 查询余额为 1100 元(读取脏数据) T6 回滚 T7 取款 1100 元 T8 提交事务失败 不可重复读 时间 取款事务 A 转账事务 B T1 开始事务 T2 开始事务 T3 查询账户余额为 1000 元 T4 汇入 100 元,把余额改为 1100 元 T5 提交事务 T6 查询余额为 1100 元 T7 提交事务(前后不一致) 第二类丢失更新(不可重复读的特殊情况) 时间 转账事务 A 取款事务 B T1 开始事务 T2 开始事务 T3 查询账户余额为 1000 元 T4 查询账户余额为 1000 元 T5 取出 100 元,把余额改为 900 元 T6 提交事务 T7 汇入 100 元 T8 提交事务 T9 余额改为 1100 元(丢失更新) 幻读(强调新增或者删除,不是更新) 时间 查询学生事务 A 插入新学生事务 B T1 开始

温馨提示

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

最新文档

评论

0/150

提交评论