Hibernate框架第四天

    xiaoxiao2021-03-25  117

    Hibernate框架的第四天


    今天内容

    1. Hibernate的查询方式(重点掌握) 2. Hibernate的查询策略(了解)

    案例一:使用Hibernate完成查询所有联系人功能


    需求分析

    1. 完成所有的联系人的查询

    技术分析之Hibernate框架的查询方式

    1. 唯一标识OID的检索方式 * session.get(类.class,OID) 2. 对象的导航的方式 3. HQL的检索方式 * Hibernate Query Language -- Hibernate的查询语言 4. QBC的检索方式 * Query By Criteria -- 条件查询 5. SQL检索方式(了解) * 本地的SQL检索

    技术分析之HQL的查询方式概述

    1. HQL的介绍 * HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似 * 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式 2. HQL与SQL的关系 * HQL 查询语句是面向对象的,Hibernate负责解析HQL查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句. * HQL 查询语句中的主体是域模型中的类及类的属性(HQL语句中使用的JavaBean的类和类中的属性) * SQL 查询语句是与关系数据库绑定在一起的. SQL查询语句中的主体是数据库表及表的字段

    技术分析之HQL的查询演示

    1. HQL基本的查询格式 * 支持方法链的编程,即直接调用list()方法 * 简单的代码如下 * session.createQuery("from Customer").list(); 2. 使用别名的方式 * 可以使用别名的方式 * session.createQuery("from Customer c").list(); * session.createQuery("select c from Customer c").list(); 3. 排序查询 * 排序查询和SQL语句中的排序的语法是一样的 * 升序 * session.createQuery("from Customer order by cust_id").list(); * 降序 * session.createQuery("from Customer order by cust_id desc").list(); 4. 分页查询 * Hibernate框架提供了分页的方法,咱们可以调用方法来完成分页 * 两个方法如下 * setFirstResult(a) -- 从哪条记录开始,如果查询是从第一条开启,值是0 * setMaxResults(b) -- 每页查询的记录条数 * 演示代码如下 * List<LinkMan> list = session.createQuery("from LinkMan").setFirstResult(0).setMaxResults().list(); 5. 带条件的查询 * setParameter("?号的位置,默认从0开始","参数的值"); 不用考虑参数的具体类型 * 按位置绑定参数的条件查询(指定下标值,默认从0开始) * 按名称绑定参数的条件查询(HQL语句中的 ? 号换成 :名称 的方式) * 例如代码如下 Query query = session.createQuery("from Linkman where lkm_name like ? order by lkm_id desc"); query.setFirstResult(0).setMaxResults(3); query.setParameter(0, "%熊%"); List<Linkman> list = query.list(); for (Linkman linkman : list) { System.out.println(linkman); }

    HQL的投影查询

    1. 描述 当我们查询实体对象时,并不需要所有字段信息,只需要查询部分信息,但是还希望让他成为一个实体对象, 实质就是将查询的部分信息投影到实体对象中去 使用要求: HQL语句 1.必须是 new 实体类名称(查询的字段) select new Customer(custId,custName) from Customer;         注意:如果你的实体类在工程中唯一,可以直接写类名,如果不唯一,需写全限定类名 2.实体类要求:需要有和查询字段相同的参数列表的构造函数 2. 投影查询的案例 * 如果查询多个字段,例如下面这种方式 List<Object[]> list = session.createQuery("select c.cust_name,c.cust_level from Customer c").list(); for (Object[] objects : list) { System.out.println(Arrays.toString(objects)); } * 如果查询两个字段,也可以把这两个字段封装到对象中 * 先在持久化类中提供对应字段的构造方法 * 使用下面这种HQL语句的方式 List<Customer> list = session.createQuery("select new Customer(c.cust_name,c.cust_level) from Customer c").list(); for (Customer customer : list) { System.out.println(customer); }、、、

    技术分析之聚合函数查询

    1. 获取总的记录数丽丽 Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); List<Number> list = session.createQuery("select count(c) from Customer c").list(); Long count = list.get(0).longValue(); System.out.println(count); tr.commit(); 2. 获取某一列数据的和 Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); List<Number> list = session.createQuery("select sum(c.cust_id) from Customer c").list(); Long count = list.get(0).longValue(); System.out.println(count); tr.commit();

    技术分析之QBC检索方式

    0. QBC:Query By Criteria 按条件进行查询 1. 简单查询,使用的是Criteria接口 List<Customer> list = session.createCriteria(Customer.class).list(); for (Customer customer : list) { System.out.println(customer); } 2. 排序查询 * 需要使用addOrder()的方法来设置参数,参数使用org.hibernate.criterion.Order对象 * 具体代码如下: Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); Criteria criteria = session.createCriteria(Linkman.class); // 设置排序 criteria.addOrder(Order.desc("lkm_id")); List<Linkman> list = criteria.list(); for (Linkman linkman : list) { System.out.println(linkman); } tr.commit(); 3. 分页查询 * QBC的分页查询也是使用两个方法 * setFirstResult(); * setMaxResults(); * 代码如下; Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); Criteria criteria = session.createCriteria(Linkman.class); // 设置排序 criteria.addOrder(Order.desc("lkm_id")); criteria.setFirstResult(0); criteria.setMaxResults(3); List<Linkman> list = criteria.list(); for (Linkman linkman : list) { System.out.println(linkman); } tr.commit(); 4. 条件查询(Criterion是查询条件的接口,Restrictions类是Hibernate框架提供的工具类,使用该工具类来设置查询条件) * 条件查询使用Criteria接口的add方法,用来传入条件。 * 使用Restrictions的添加条件的方法,来添加条件,例如: * Restrictions.eq -- 相等 * Restrictions.gt -- 大于号 * Restrictions.ge -- 大于等于 * Restrictions.lt -- 小于 * Restrictions.le -- 小于等于 * Restrictions.between -- 在之间 * Restrictions.like -- 模糊查询 * Restrictions.in -- 范围 * Restrictions.and -- 并且 * Restrictions.or -- 或者 * 测试代码如下 Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); Criteria criteria = session.createCriteria(Linkman.class); // 设置排序 criteria.addOrder(Order.desc("lkm_id")); // 设置查询条件 criteria.add(Restrictions.or(Restrictions.eq("lkm_gender", "男"), Restrictions.gt("lkm_id", 3L))); List<Linkman> list = criteria.list(); for (Linkman linkman : list) { System.out.println(linkman); } tr.commit(); 5. 聚合函数查询(Projection的聚合函数的接口,而Projections是Hibernate提供的工具类,使用该工具类设置聚合函数查询) * 使用QBC的聚合函数查询,需要使用criteria.setProjection()方法 * 具体的代码如下 Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); Criteria criteria = session.createCriteria(Linkman.class); criteria.setProjection(Projections.rowCount()); List<Number> list = criteria.list(); Long count = list.get(0).longValue(); System.out.println(count); tr.commit();

    技术分析之离线条件查询

    1. 离线条件查询使用的是DetachedCriteria接口进行查询,离线条件查询对象在创建的时候,不需要使用Session对象,只是在查询的时候使用Session对象即可。 2. 创建离线条件查询对象 * DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class); 3. 具体的代码如下 Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class); // 设置查询条件 criteria.add(Restrictions.eq("lkm_gender", "男")); // 查询数据 List<Linkman> list = criteria.getExecutableCriteria(session).list(); for (Linkman linkman : list) { System.out.println(linkman); } tr.commit();


    技术分析之SQL查询方式(了解)

    1. 基本语法 Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); SQLQuery sqlQuery = session.createSQLQuery("select * from cst_linkman where lkm_gender = ?"); sqlQuery.setParameter(0,"男"); sqlQuery.addEntity(Linkman.class); List<Linkman> list = sqlQuery.list(); System.out.println(list); tr.commit();

    技术分析之HQL多表查询

    1. 多表的查询进来使用HQL语句进行查询,HQL语句和SQL语句的查询语法比较类似。 * 内连接查询 * 显示内连接 * select * from customers c inner join orders o on c.cid = o.cno; * 隐式内连接 * select * from customers c,orders o where c.cid = o.cno; * 外连接查询 * 左外连接 * select * from customers c left join orders o on c.cid = o.cno; * 右外连接 * select * from customers c right join orders o on c.cid = o.cno; 2. HQL的多表查询* 迫切和非迫切: * 非迫切返回结果是Object[] ,两个实体类对象,封装是两个对象的集合 * 迫切连接返回的结果是对象,把客户的信息封装到客户的对象中,把订单的信息封装到客户的Set集合中。最后将主表对象封装到集合中list<Customer> 3. 内连接查询 * 内连接使用 inner join ,默认返回的是Object数组 Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); List<Object[]> list = session.createQuery("from Customer c inner join c.linkmans").list(); for (Object[] objects : list) { System.out.println(Arrays.toString(objects)); } tr.commit(); * 迫切内连接:inner join fetch ,返回的是实体对象 Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); List<Customer> list = session.createQuery("from Customer c inner join fetch c.linkmans").list(); Set<Customer> set = new HashSet<Customer>(list); for (Customer customer : set) { System.out.println(customer); } tr.commit(); 4. 左外连接查询 * 左外连接: 封装成List<Object[]> * 迫切左外连接 Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); List<Customer> list = session.createQuery("from Customer c left join fetch c.linkmans").list(); Set<Customer> set = new HashSet<Customer>(list); for (Customer customer : set) { System.out.println(customer); } tr.commit();
    转载请注明原文地址: https://ju.6miu.com/read-21840.html

    最新回复(0)