Hibernate学习第四天笔记

1、上次课回顾

1.1 hibernate的一对多

  • 表与表之间的关系
    • 一对多关系
    • 多对多关系
    • 一对一关系
  • hibernate的一对多配置 - 搭建hibernate基本环境 - 创建表 - 创建实体 - 一的一方 - 方的是多的一方的集合 - 多的一方 - 方的是一的一方的集合 - 创建映射 - 一的一方 - 配置的是set集合 - 多的一方 - 配置<many-to-one/> - 必须呢测试类
  • hibernate的一对多的操作
    • 级联操作 :cascade,用于操作其关联的对象
      • 级联保存或更新
      • 级联删除
    • 测试对象导航
    • 放弃外键维护权 :inverse:用户控制是否有外键维护能力

1.2 hibernate的多对多

  • hibernate多对多的配置

    • 搭建hibernate环境
    • 创建表
    • 创建实体
      • 放置的是对方的集合
    • 创建映射
      • 放置的是对象的
    • 编写测试类
  • hibernate多对多的操作

    • 级联操作
      • 级联保存或更新
      • 级联删除(了解即可)
    • 其他的操作
      • 给用户选择角色
      • 给用户修改角色
      • 给用户删除角色

2、Hibernate的查询的方式

2.1 OID查询

OID检索:hibernate根据对象的OID(主键)进行检索。

2.1.1 使用get方法

Customer customer = session.get(Customer.class,1l);

2.1.2 使用load方法

Customer customer = session.get(Customer.class,1l);

2.2 对象导航检索

对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。

LinkMan linkMan = Session.get(LinkMan.class,1l);
Customer customer = linkMan.getCustomer();

Customer customer =  session.get(Customer.class,2l);
List<LinkMan> linkmans = customer.getLinkMans();

2.3 HQL检索

HQL查询:Hibernate Query Language(Hibernate的查询语言),是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个进行查询的一种方式。

  • 初始化一些数据
    • 创建表
    • 创建对象

2.3.1 HQL的简单查询

public void demo2() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();
    String hql = "from Customer";
    Query query = session.createQuery(hql);
    List<Customer> list = query.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
    transaction.commit();
}

2.3.2 HQL的排序查询

/***
 * HQL的排序查询
 */
@Test
public void demo3() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();
    //默认情况:升序查询
    //List<Customer> list = session.createQuery("from Customer order by cust_id").list();
    //设置降序排序
    List<Customer> list = session.createQuery("from Customer order by cust_id desc").list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
    transaction.commit();
}

需要注意的是:我用的hibernate版本是5.4.1,在?后面加上数字0,1,1....。;老版本不需要加。

2.3.3 HQL的条件查询

/***
 * HQL的条件查询
 */
@Test
public void demo4() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();
    //条件查询
    //1、按位置绑定:根据参数的位置进行绑定
    //一个条件
    /*
     * Query query = session.createQuery("from Customer where cust_name=?0");
     * query.setParameter(0, "雷军"); List<Customer> list = query.list();
     */

    //多个条件
    /*
     * Query query = session.createQuery("from Customer where cust_id=?0 and cust_name like ?1");
     * query.setParameter(0, 1l); query.setParameter(1, "雷%"); 
     * List<Customer> list = query.list();
     */

    //2、按名称绑定
    Query query = session.createQuery("from Customer where cust_id= :aaa and cust_name like :name");
    query.setParameter("aaa", 2l);
    query.setParameter("name", "雷%");
    List<Customer> list = query.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }


    transaction.commit();
}

2.3.4 HQL的投影查询

投影查询:查询对象的某个或某些属性

/**
 * 投影查询:查询对象的某个或某些属性
 */
@Test
public void demo5() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    //投影查询
    //单个属性
    /*
     * List<Object> list =
     * session.createQuery("select c.cust_name from Customer c").list(); for (Object
     * object : list) { System.out.println(object); }
     */

    //多个属性
    /*
     * List<Object[]> list =
     * session.createQuery("select c.cust_id,c.cust_name from Customer c").list();
     * for (Object[] objects : list) { System.out.println(Arrays.toString(objects));
     * }
     */

    //查询多个属性:但是我们想封装到对象中
    List<Customer> list = session.createQuery("select new Customer(cust_id,cust_name) from Customer").list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
    transaction.commit();
}

2.3.5 HQL的分组统计查询

/**
 * 分组统计查询
 */
@Test
public void demo7() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    //uniqueResult():唯一结果,只能查到一个值
    //聚合函数的使用:count(),max(),min(),avg(),sum()
    /*
     * Object object= (Long)
     * session.createQuery("select count(*) from Cutomer").uniqueResult();
     * System.out.println(object);
     */

    //分组统计
    List<Object[]> list = session.createQuery("select cust_source,count(*) from Customer group by cust_source").list();

    //大于等于2的
    //List<Object[]> list = session.createQuery("select cust_source,count(*) from Customer group by cust_source having count(*) >=2").list();
    for (Object[] objects : list) {
        System.out.println(Arrays.toString(objects));
    }

    transaction.commit();
}

2.3.6 HQL的分页查询

* 分页查询
 */
@Test
public void demo6() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    Query query = session.createQuery("from LinkMan");
    query.setFirstResult(3);        //起始位置
    query.setMaxResults(5);         //每页数据条数
    List<LinkMan> list = query.list();

    for (LinkMan linkMan : list) {
        System.out.println(linkMan);
    }

    transaction.commit();
}

2.3.7 多表查询

  • SQL的多表查询

    • 连接查询
      • 交叉连接
      • 内连接
        • 隐式内连接
        • 显式内连接
      • 外连接
        • 左外连接
        • 右外连接
    • 子查询
  • HQL的多表查询

    • 连接查询
      • 交叉连接
      • 内连接
        • 显式内连接
        • 隐式内连接
        • 迫切内连接
      • 外链接
        • 左外连接
        • 右外连接
        • 迫切左外连接

代码如下

/**
 * HQL多表查询
 */
@Test
public void demo8() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = 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)); }
     */

    //迫切内连接:其实就是在普通的内连接inner join 后添加一个关键字fetch
    List<Customer> customers = session.createQuery("select distinct c from Customer c inner join fetch c.linkMans ").list();//通知Hibernate,将另一个对象的数据封装到该对象中
    for (Customer customer : customers) {
        System.out.println(customer);
    }
    transaction.commit();

}           

2.4 QBC检索

QBC:Query By Criteria,条件查询:是一种更加面向对象化的查询方式。

2.4.1 简单查询

    /**
 * 简单查询
 */
@Test
public void demo1() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    //获得criteria的对象
    Criteria criteria = session.createCriteria(Customer.class);
    List<Customer> list = criteria.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    transaction.commit();
}

2.4.2 排序查询

/**
 * 排序查询
 */
@Test
public void demo2() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    //获得criteria的对象
    Criteria criteria = session.createCriteria(Customer.class);
    //Order是hibernate中的一个对象
    criteria.addOrder(Order.desc("cust_id"));
    List<Customer> list = criteria.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    transaction.commit();
}

2.4.3 分页查询

/*
 * 分页查询
 */
@Test
public void demo3() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    //获得criteria的对象
    Criteria criteria = session.createCriteria(LinkMan.class);
    criteria.setFirstResult(3);
    criteria.setMaxResults(5);
    List<LinkMan> list = criteria.list();
    for (LinkMan linkMan : list) {
        System.out.println(linkMan);
    }

    transaction.commit();
}

2.4.4 条件查询

/*
 * 分页查询
 */
@Test
public void demo4() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    //获得criteria的对象
    Criteria criteria = session.createCriteria(Customer.class);

    /**
     *  设置条件:
     *  ==  eq (equals)
     *  >   gt (greater than)
     *  >=  ge (greater equals)
     *  <   lt (less than)
     *  <=  le (less equals)
     *  <>  ne (not equals)
     *  like
     *  in
     *  between
     *  and
     *  or
     */
    criteria.add(Restrictions.eq("cust_source", "影视"));
    criteria.add(Restrictions.like("cust_name", "雷%"));
    //criteria.add(Restrictions.or(Restrictions.like("cust_name", "雷%")));
    List<Customer> list = criteria.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    transaction.commit();
}

2.4.5 统计查询

/*
 *  统计查询
 */
@Test
public void demo5() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    //获取Criteria的对象
    Criteria criteria = session.createCriteria(Customer.class);

    /**
     * add              :普通的条件,where后面的条件
     * addOrder         :排序
     * setProjection    :聚合函数和group by ,having 后面的条件
     */
    criteria.setProjection(Projections.rowCount());
    Long num = (Long) criteria.uniqueResult();
    System.out.println(num);
    transaction.commit();
}

2.4.6 离线条件查询(SSH)-->DetachedCriteria

使用DetachedCriteria-->离线(脱离session)

/*
   *  离线条件查询
 */
@Test
public void demo6() {
    DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
    detachedCriteria.add(Restrictions.like("cust_name", "雷%"));

    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    Criteria criteria = detachedCriteria.getExecutableCriteria(session);
    List<Customer> list = criteria.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
    transaction.commit();

}

2.5 SQL检索

@Test
public void demo1() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction transaction = session.beginTransaction();

    /*
     * List<Object[]> list =
     * session.createSQLQuery("select * from cst_customer").list(); for (Object[]
     * objects : list) { System.out.println(objects); }
     */

    SQLQuery query = session.createSQLQuery("select * from cst_customer");
    query.addEntity(Customer.class);
    List<Customer> list = query.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
    transaction.commit();
}

3、Hibernate的抓取策略

3.1延迟加载

3.1.1延迟加载的概述

延迟加载:lazy(懒加载)。执行到该行代码的时候,不会马上送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。

3.2延迟加载的分类

3.2.1类级别的延迟加载

值的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class)

  • 配置
    • 在配置文件的class标签中设置lazy为true或者false,默认为true.
  • 让lazy失效
    • 将lazy设置为false
    • 将持久化类使用 final修饰
    • hibernate.initialize(Customer)

3.2.2关联级别的延迟加载

值的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。Customer customer = session.get(Customer.class);

3.2 抓取策略

3.2.1 抓取策略的概述

  • 通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么格式通过策略进行配置。
    • 通过或者<many-to-one>上通过fetch属性进行设置。
    • fetch和这些标签上的lazy如何设置优化发送的SQL语句。

3.2.1.1 上的fetch和lazy

  • fetch:抓取策略,控制SQL语句格式

    • select :默认值,发送普通的select语句,查询关联对象
    • join :发送一条迫切左外连接查询关联对象
    • subselect :发送一条子查询查询其关联的额对象
  • lazy: 延迟加载,控制查询关联对象的时候是否采用延迟

    • true :默认值,查询关联对象的时候,采用延迟加载
    • false :查询关联对象的时候,不采用延迟加载
    • extra :及其懒惰,

3.2.1.2 <many-to-one>上的fetch和lazy

  • fetch:抓取策略:控制SQL语句格式
    • select :默认,发送普通的select语句,查询关联对象
    • join :发送一条迫切左外连接。
  • lazy:延迟加载,控制查询关联对象的时候是否采用延迟加载
    • proxy :默认,
    • false :查询关联对象,不采用延迟加载
    • no-proxy(不会使用)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值