【JAVAEE学习笔记】hibernate04:查询种类、HQL、Criteria、查询优化和练习为客户列表增加查询条件
一、查询种类
1.oid查询-get
2.对象属性导航查询
3.HQL
4.Criteria
5.原生SQL
二、查询-HQL语法
- //学习HQL语法
- public class Demo {
- //基本语法
- @Test
- public void fun1(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql = " from cn.itcast.domain.Customer ";//完整写法
- String hql2 = " from Customer "; //简单写法
- String hql3 = " from java.lang.Object ";
- Query query = session.createQuery(hql3);
- List list = query.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //排序
- public void fun2(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql1 = " from cn.itcast.domain.Customer order by cust_id asc ";//完整写法
- String hql2 = " from cn.itcast.domain.Customer order by cust_id desc ";//完整写法
- Query query = session.createQuery(hql2);
- List list = query.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //条件查询
- public void fun3(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql1 = " from cn.itcast.domain.Customer where cust_id =? ";//完整写法
- String hql2 = " from cn.itcast.domain.Customer where cust_id = :id ";//完整写法
- Query query = session.createQuery(hql2);
- // query.setParameter(0, 2l);
- query.setParameter("id", 2l);
- List list = query.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //分页查询
- public void fun4(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql1 = " from cn.itcast.domain.Customer ";//完整写法
- Query query = session.createQuery(hql1);
- //limit ?,?
- // (当前页数-1)*每页条数
- query.setFirstResult(2);
- query.setMaxResults(2);
- List list = query.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //统计查询
- //count 计数
- //sum 求和
- //avg 平均数
- //max
- //min
- public void fun5(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql1 = " select count(*) from cn.itcast.domain.Customer ";//完整写法
- String hql2 = " select sum(cust_id) from cn.itcast.domain.Customer ";//完整写法
- String hql3 = " select avg(cust_id) from cn.itcast.domain.Customer ";//完整写法
- String hql4 = " select max(cust_id) from cn.itcast.domain.Customer ";//完整写法
- String hql5 = " select min(cust_id) from cn.itcast.domain.Customer ";//完整写法
- Query query = session.createQuery(hql5);
- Number number = (Number) query.uniqueResult();
- System.out.println(number);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //投影查询
- public void fun6(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql1 = " select cust_name from cn.itcast.domain.Customer ";
- String hql2 = " select cust_name,cust_id from cn.itcast.domain.Customer ";
- String hql3 = " select new Customer(cust_id,cust_name) from cn.itcast.domain.Customer ";
- Query query = session.createQuery(hql3);
- List list = query.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- }
学习HQL语法
- public class Demo2 {
- //回顾-原生SQL
- // 交叉连接-笛卡尔积(避免)
- // select * from A,B
- // 内连接
- // |-隐式内连接
- // select * from A,B where b.aid = a.id
- // |-显式内连接
- // select * from A inner join B on b.aid = a.id
- // 外连接
- // |- 左外
- // select * from A left [outer] join B on b.aid = a.id
- // |- 右外
- // select * from A right [outer] join B on b.aid = a.id
- //---------------------------------------------------------------------
- //HQL的多表查询
- //内连接(迫切)
- //外连接
- // |-左外(迫切)
- // |-右外(迫切)
- @Test
- //HQL 内连接 => 将连接的两端对象分别返回.放到数组中.
- public void fun1(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql = " from Customer c inner join c.linkMens ";
- Query query = session.createQuery(hql);
- List<Object[]> list = query.list();
- for(Object[] arr : list){
- System.out.println(Arrays.toString(arr));
- }
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //HQL 迫切内连接 => 帮我们进行封装.返回值就是一个对象
- public void fun2(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql = " from Customer c inner join fetch c.linkMens ";
- Query query = session.createQuery(hql);
- List<Customer> list = query.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //HQL 左外连接 => 将连接的两端对象分别返回.放到数组中.
- public void fun3(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql = " from Customer c left join c.linkMens ";
- Query query = session.createQuery(hql);
- List<Object[]> list = query.list();
- for(Object[] arr : list){
- System.out.println(Arrays.toString(arr));
- }
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //HQL 右外连接 => 将连接的两端对象分别返回.放到数组中.
- public void fun4(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql = " from Customer c right join c.linkMens ";
- Query query = session.createQuery(hql);
- List<Object[]> list = query.list();
- for(Object[] arr : list){
- System.out.println(Arrays.toString(arr));
- }
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- }
学习HQL语法(不常用) - 多表查询语法
三、查询-Criteria语法
- public class Demo {
- @Test
- //基本语法
- public void fun1(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Criteria c = session.createCriteria(Customer.class);
- List<Customer> list = c.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //条件语法
- public void fun2(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Criteria c = session.createCriteria(Customer.class);
- // c.add(Restrictions.idEq(2l));
- c.add(Restrictions.eq("cust_id",2l));
- List<Customer> list = c.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //分页语法 - 与HQL一样
- public void fun3(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Criteria c = session.createCriteria(Customer.class);
- //limit ?,?
- c.setFirstResult(0);
- c.setMaxResults(2);
- List<Customer> list = c.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //排序语法
- public void fun4(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Criteria c = session.createCriteria(Customer.class);
- c.addOrder(Order.asc("cust_id"));
- //c.addOrder(Order.desc("cust_id"));
- List<Customer> list = c.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //统计语法
- public void fun5(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Criteria c = session.createCriteria(Customer.class);
- //设置查询目标
- c.setProjection(Projections.rowCount());
- List list = c.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- }
学习Criteria语法
非离线
离线
- public class Demo2 {
- @Test
- public void fun1(){
- //Service/web层
- DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
- dc.add(Restrictions.idEq(6l));//拼装条件(全部与普通Criteria一致)
- //----------------------------------------------------
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Criteria c = dc.getExecutableCriteria(session);
- List list = c.list();
- System.out.println(list);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- }
学习离线Criteria
四、查询优化
类级别查询
get方法:没有任何策略.调用即立即查询数据库加载数据.
load方法: 应用类级别的加载策略
- public class Demo {
- @Test
- // get方法 : 立即加载.执行方法时立即发送sql语句查询结果
- public void fun1(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Customer c = session.get(Customer.class, 2l);
- System.out.println(c);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- // load方法(默认):是在执行时,不发送任何sql语句.返回一个对象.使用该对象时,才执行查询.
- // 延迟加载: 仅仅获得没有使用.不会查询.在使用时才进行查询.
- // 是否对类进行延迟加载: 可以通过在class元素上配置lazy属性来控制.
- //lazy:true 加载时,不查询.使用时才查询b
- //lazy:false 加载时立即查询.
- public void fun2(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Customer c = session.load(Customer.class, 2l);
- //----------------------------------------------------
- tx.commit();
- session.close();
- System.out.println(c);
- }
- }
懒加载|延迟加载
- public class Demo {
- //集合级别的关联
- //fetch:select 单表查询
- //lazy:true 使用时才加载集合数据.
- @Test
- public void fun1(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Customer c = session.get(Customer.class, 2l);
- Set<LinkMan> linkMens = c.getLinkMens();//关联级别
- System.out.println(linkMens);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- //集合级别的关联
- //fetch:select 单表查询
- //lazy:false 立即记载集合数据
- @Test
- public void fun2(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Customer c = session.get(Customer.class, 2l);
- Set<LinkMan> linkMens = c.getLinkMens();//关联级别
- System.out.println(linkMens);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- //集合级别的关联
- //fetch:select 单表查询
- //lazy:extra 极其懒惰.与懒加载效果基本一致. 如果只获得集合的size.只查询集合的size(count语句)
- @Test
- public void fun3(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Customer c = session.get(Customer.class, 2l);
- Set<LinkMan> linkMens = c.getLinkMens();//关联级别
- System.out.println(linkMens.size());
- System.out.println(linkMens);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- //集合级别的关联
- //fetch:join 多表查询
- //lazy:true|false|extra 失效.立即加载.
- @Test
- public void fun4(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- Customer c = session.get(Customer.class, 2l);
- Set<LinkMan> linkMens = c.getLinkMens();//关联级别
- System.out.println(linkMens.size());
- System.out.println(linkMens);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //fetch: subselect 子查询
- //lazy: true 懒加载
- public void fun5(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql = "from Customer";
- Query query = session.createQuery(hql);
- List<Customer> list = query.list();
- for(Customer c:list){
- System.out.println(c);
- System.out.println(c.getLinkMens().size());
- System.out.println(c.getLinkMens());
- }
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //fetch: subselect 子查询
- //lazy: false 立即加载
- public void fun6(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql = "from Customer";
- Query query = session.createQuery(hql);
- List<Customer> list = query.list();
- for(Customer c:list){
- System.out.println(c);
- System.out.println(c.getLinkMens().size());
- System.out.println(c.getLinkMens());
- }
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //fetch: subselect 子查询
- //lazy: extra 极其懒惰
- public void fun7(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql = "from Customer";
- Query query = session.createQuery(hql);
- List<Customer> list = query.list();
- for(Customer c:list){
- System.out.println(c);
- System.out.println(c.getLinkMens().size());
- System.out.println(c.getLinkMens());
- }
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- }
关联级别 延迟加载 & 抓取策略(客户再获取多个联系人)
- public class Demo2 {
- @Test
- //fetch:select 单表查询
- //lazy:proxy
- //customer-true 懒加载
- public void fun1(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- LinkMan lm = session.get(LinkMan.class, 3l);
- Customer customer = lm.getCustomer();
- System.out.println(customer);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //fetch:join 多表
- //lazy: 失效
- public void fun3(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- LinkMan lm = session.get(LinkMan.class, 3l);
- Customer customer = lm.getCustomer();
- System.out.println(customer);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- @Test
- //fetch:select 单表查询
- //lazy:proxy
- //customer-false 立即加载
- public void fun2(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- LinkMan lm = session.get(LinkMan.class, 3l);
- Customer customer = lm.getCustomer();
- System.out.println(customer);
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- }
关联级别 延迟加载 & 抓取策略(通过联系人获得客户)
结论:为了提高效率.fetch的选择上应选择select. lazy的取值应选择 true. 全部使用默认值.
no-session问题解决: 扩大session的作用范围.
- public class Demo {
- @Test
- public void fun1(){
- Session session = HibernateUtils.openSession();
- Transaction tx = session.beginTransaction();
- //----------------------------------------------------
- String hql = "from Customer ";
- Query query = session.createQuery(hql);
- List<Customer> list = query.list();
- for(Customer c:list){
- System.out.println(c.getLinkMens());
- }
- //----------------------------------------------------
- tx.commit();
- session.close();
- }
- }
抓取数量
五、练习:为客户列表增加查询条件
在上一次笔记的代码基础上,在显示客户列表之前,加入筛选的条件:
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- //1获得查询条件
- String cust_name = request.getParameter("cust_name");
- //2判断查询条件是否不为空
- DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
- if(cust_name!=null && !"".equals(cust_name)){
- dc.add(Restrictions.like("cust_name", "%"+cust_name+"%"));
- }
- //不为空=>添加条件
- //3 调用Service查询所有客户
- List<Customer> list = cs.getAll(dc);
- //4 将客户列表放入request域
- request.setAttribute("list", list);
- //5 转发到list.jsp显示
- request.getRequestDispatcher("/jsp/customer/list.jsp").forward(request, response);
- }
Servlet层代码
- public List<Customer> getAll(DetachedCriteria dc) {
- Session session = HibernateUtils.getCurrentSession();
- //打开事务
- Transaction tx = session.beginTransaction();
- List<Customer> list = customerDao.getAll(dc);
- //关闭事务
- tx.commit();
- return list;
- }
Service层代码
- public List<Customer> getAll(DetachedCriteria dc) {
- //1 获得session
- Session session = HibernateUtils.getCurrentSession();
- //2 将离线对象关联到session
- Criteria c = dc.getExecutableCriteria(session);
- //3 执行查询并返回
- return c.list();
- }
Dao层代码
【JAVAEE学习笔记】hibernate04:查询种类、HQL、Criteria、查询优化和练习为客户列表增加查询条件的更多相关文章
- JAVAEE学习——hibernate04:查询种类、HQL、Criteria、查询优化和练习为客户列表增加查询条件
一.查询种类 1.oid查询-get 2.对象属性导航查询 3.HQL 4.Criteria 5.原生SQL 二.查询-HQL语法 //学习HQL语法 public class Demo { //基本 ...
- 【JAVAEE学习笔记】hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...
- JAVAEE学习——hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...
- Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新
CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等.目前已支持Chrome 25, Firefox 19 ...
- 【JAVAEE学习笔记】hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户
今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...
- QML学习笔记(五)— 做一个简单的待做事项列表
做一个简单的QML待做事项列表,能够动态添加和删除和编辑数据 GitHub:八至 作者:狐狸家的鱼 本文链接:QML学习笔记(五)— 做一个待做事项列表 主要用到QML:ListView 效果 全部代 ...
- javaEE学习笔记-单例模式
定义: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的三要素: (1)私有的静态的成员变量 (2)私有的构造方法 (3)公共的静态的入口点方法 单例模式的分类: (1)饿 ...
- javaEE学习笔记-利用DOM4J解析xml至数据库
xml代码文件名:test02.xml <ACCESOS> <item> <SOCIO> <NUMERO>00045050</NUMERO> ...
- JavaEE学习笔记---数据库操作篇
测试JDBC和SQLServer的插入操作,源码如下: import java.sql.Connection;import java.sql.DriverManager;import java.sql ...
随机推荐
- 接口调用 GET方式
/** * 第一步 视图展示 . 视图页面(忽略) * @return [type] [description] */ /** * 第二步 控制器先将要运行的接口处理好(接口及参数)传到到Model层 ...
- 统计学习方法:罗杰斯特回归及Tensorflow入门
作者:桂. 时间:2017-04-21 21:11:23 链接:http://www.cnblogs.com/xingshansi/p/6743780.html 前言 看到最近大家都在用Tensor ...
- 《阿里巴巴Java开发手册(正式版》读记
前几天,阿里巴巴发布了<阿里巴巴Java开发手册(正式版>,第一时间下载阅读了一番. 不同于一般大厂内部的代码规范,阿里巴巴的这本Java开发手册,可谓包罗万象,几乎日常Java开发中方方 ...
- 【uwp】浅谈China Daily中数据同步到One Drive的实现
新版China Daily与旧版相比新增了数据同步的功能,那这个功能具体是如何实现的呢,现在让我们来一起看看. 1.注册应用 开发者中心的应用注册就不用多说了(https://developer.mi ...
- 关于使用mybatis的几点总结
mybatis的几点总结 1.关于resultType和resultMap的使用 查询结果集统一采用resultType,不要采用resultMap,因为resultMap需要写许多的表字段和实体类的 ...
- 【国家集训队2012】tree(伍一鸣)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 ...
- hdu4185二分图匹配
Thanks to a certain "green" resources company, there is a new profitable industry of oil s ...
- Java:构造器,构造代码块,静态代码块的执行顺序
1.构造器:与类同名且没有返回值,用来初始化类属性: 构造器又分为无参构造器和有参构造器 1.1:无参构造器 public class Contruction{ ...属性... public Con ...
- python爬虫第一天
python爬虫第一天 太久没折腾爬虫 又要重头开始了....感谢虫师大牛的文章. 接下来的是我的随笔 0x01 获取整个页面 我要爬的是百度贴吧的图,当然也是跟着虫师大牛的思路. 代码如下: #co ...
- 关于php调用.net的web service 踩过的坑
从前一阵开始,公司要和对方做web service对接.由于对方使用.net语言,而我方使用php.本来经理是要求我们也用.net写web service的服务端.而我上学时学的.net全忘了... ...