基础开源框架—hibernate-04

1.hibernate的查询方式

Hibernate框架中提供五种查询方式

1.对象导航查询

1)根据id查询客户,查询这个客户里面所有的联系人
查询这个客户里面所有联系人过程,使用对象导航查询实现
1 对象导航查询,叫法导航对象图查询
2 根据id查询某个客户,调用get方法实现,返回客户对象
查询客户里面所有的联系人

//对象导航查询

@Test

public void testSelectDemo1() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//	根据id查询某个客户,调用g

fetch
et方法实现,返回客户对象
Customer customer = session.get(Customer.class, 1);


//	查询客户里面所有的联系人

//只需要获取客户对象里面表示所有联系人set集合

Set<LinkMan> setLinkMan = customer.getSetLinkMan();


System.out.println(setLinkMan.size());


tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

(1)获取客户对象,通过客户对象,获取客户表示联系人set集合

  • 根据id查询客户
  • 在这里插入图片描述
  • 获取set集合时候,根据外键查询所有联系人
    在这里插入图片描述

2.oid查询

在这里插入图片描述

(1)实体类属性和表主键对应

表里面主键非空唯一值,对应实体类属性唯一值

(2)根据id查询,调用get方法
根据主键id查询,调用get方法
在这里插入图片描述
2 根据id查询,使用get方法实现,除了get方法之外,还有load方法

3 hql查询

(1)hql:hibernate query language,hibernate提供查询语言

(2)使用hibernate里面Query对象

1 什么是hql:hibernate提供查询语言

(1)hql语句和sql语句区别

  • 使用sql语句操作数据库表和表里面字段

  • 使用hql语句操作实体类和类里面属性

2 常用的hql语句
(1)查询所有 from 实体类名称
(2)条件查询 from 实体类名称 where 属性名称1=? and 属性名称2=?

3 使用hql查询操作时候,使用Query对象
(1)创建Query对象,调用session里面的方法创建
(2)调用Query对象里面的方法得到结果

  • 查询所有
//1 查询所有

@Test

public void testFinlAll() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建query对象

Query query = session.createQuery("from Customer");

 

//2 调用query的方法得到结果

List<Customer> list = query.list();


for (Customer customer : list) {

System.out.println(customer);

}


tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}
  • 条件查询
    1 条件查询
    (1)根据cid和custName进行查询
    (2)普通sql语句:
    SELECT * FROM t_customer WHERE cid=? AND custName=?

(3)hql语句:
from 实体类名称 where 属性名称1=? and 属性名称2=?
from Customer where cid=? and custName=?
(4)语句中?位置从0开始

//1 条件查询

@Test

public void testConditionDemo1() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建query对象

//根据cid和custName进行查询

Query query = session.createQuery("from Customer where cid=? and custName=?");


//2 设置查询条件值

//第一个参数?位置,从0开始的;第二个参数是?具体条件值

query.setParameter(0, 1);

query.setParameter(1, "360");


//3 调用方法获取结果

List<Customer> list = query.list();


for (Customer customer : list) {

System.out.println(customer);

}


tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}
  • 模糊查询
//3 模糊查询

@Test

public void testConditionDemo2() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//根据custName进行模糊查询

//1 创建query对象

Query query = session.createQuery("from Customer where custName like ?");


//2 设置条件值

query.setParameter(0, "%百%");


//3 调用方法得到结果

List<Customer> list = query.list();


for (Customer customer : list) {

System.out.println(customer);

}

tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

} }
  • 排序查询
    1 普通排序语句
    SELECT * FROM t_customer ORDER BY cid asc/desc

2 hql语句:
from 实体类名称 order by 要排序属性名称 排序方式
from Customer order by cid asc/desc

//4 排序查询

@Test

public void testOrderBy() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建query对象

Query query = session.createQuery("from Customer order by cid desc");


//2 调用方法

List<Customer> list = query.list();


for (Customer customer : list) {

System.out.println(customer);

}


tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}
  • 分页查询
    1 myql里面做分页,sql语句:
    SELECT * FROM t_customer LIMIT 0,2
    (1)第一个值是 开始位置
    (2)第二个值是 显示多少条记录

2 hql里面没有直接分页语句
(1)把分页使用两个方法封装,替代limit后面两个值

/5 分页查询

@Test

public void testPage() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建query对象

Query query = session.createQuery("from Customer");


//2 设置分页两个参数值,使用方法设置

//2.1 设置开始位置

query.setFirstResult(0);


//2.2 设置每页记录数

query.setMaxResults(3);


//2 调用方法

List<Customer> list = query.list();

for (Customer customer : list) {

System.out.println(customer);

}

tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}}
  • 投影查询
    1 投影查询:查询不是所有字段值,而是部分字段的值

2 hql投影查询语句:

(1)select 属性名称1,属性名称2 from 实体类名称

(2)在普通sql语句中,select ;使用hql语句 select后面不能直接写

//6 投影查询

@Test

public void testDemo1() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//根据custName查询

//1 创建query对象

Query query = session.createQuery("select custName from Customer");


//2 调用方法得到结果

List<Object> list = query.list();


for (Object object : list) {

System.out.println(object);

}


tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

 

//6 投影查询

@Test

public void testDemo1() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//根据custName查询

//1 创建query对象

Query query = session.createQuery("select cid,custName from Customer");


List<Object[]> list = query.list();


for (Object[] objects : list) {

System.out.println(Arrays.toString(objects));

}


//2 调用方法得到结果

//	List<Object> list = query.list();

//	

//	for (Object object : list) {

//	System.out.println(object);

//	}


tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}
  • 聚集函数使用
    1 常用的聚集函数

(1)count、sum、avg、max、min

2 hql聚集函数语句写法

SELECT COUNT(*) FROM t_customer
(1)查询表记录数

  • hql语句: select count(*) from Customer

(1)做查询记录数时候,返回某个值,可以使用Object获取到,Object不能转换成int
出现异常,把Object变成long类型,把long再变成int类型

//7 聚集函数使用

@Test

public void testCount() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建query对象

Query query = session.createQuery("select count(*) from Customer");	

//当查询返回一个值,调用query的方法得到值

Object obj = query.uniqueResult();

//	System.out.println(obj);


//把object变成long,再变成int类型

Long lobj = (Long) obj;

int count = lobj.intValue();


System.out.println(count);


tx.commit();

}catch(Exception e) {

e.printStackTrace();

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

4 qbc查询

(1)使用hibernate里面Criteria对象

(2)使用qbc时候,不需要写语句,调用封装的方法实现
1 使用hql查询需要写hql语句实现,但是使用qbc时候,不需要写语句了,使用方法实现
2 使用qbc时候,操作实体类和属性
3 使用qbc,使用Criteria对象实现
(1)创建Criteria对象
(2)调用方法得到结果

查询所有

//1 查询所有

@Test

public void testFindAll() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建criteria对象

Criteria criteria = session.createCriteria(Customer.class);


//2 调用方法得到结果

List<Customer> list = criteria.list();


for (Customer customer : list) {

System.out.println(customer);

}

tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

条件查询

1 条件查询

(1)根据cid和custName查询

//2 条件查询

@Test

public void testCondition1() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建criteria对象

Criteria criteria = session.createCriteria(Customer.class);


//2 设置对类里面哪些属性做条件查询操作,设置值

//add方法:设置属性和条件值

//使用类,调用类里面静态方法

//eq方法: 第一个参数属性名称,第二个参数设置条件值

criteria.add(Restrictions.eq("cid",1));

criteria.add(Restrictions.eq("custName","360"));


//3 得到结果

List<Customer> list = criteria.list();


for (Customer customer : list) {

System.out.println(customer);

}

tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

 

2 模糊查询

//2 条件查询

@Test

public void testCondition1() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建criteria对象

Criteria criteria = session.createCriteria(Customer.class);


//2 设置对类里面哪些属性做条件查询操作,设置值

//add方法:设置属性和条件值

//使用类,调用类里面静态方法

//eq方法: 第一个参数属性名称,第二个参数设置条件值

//	criteria.add(Restrictions.eq("cid",1));

//	criteria.add(Restrictions.eq("custName","360"));


criteria.add(Restrictions.like("custName","%百%"));


//3 得到结果

List<Customer> list = criteria.list();


for (Customer customer : list) {

System.out.println(customer);

}

tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

排序查询

//3 排序查询

@Test

public void testOrder() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建criteria对象

Criteria criteria = session.createCriteria(Customer.class);


//2 设置对哪个属性进行排序

criteria.addOrder(Order.desc("cid"));


//3 得到结果

List<Customer> list = criteria.list();


for (Customer customer : list) {

System.out.println(customer);

}

tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

分页查询

//4 分页查询

@Test

public void testpage() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建criteria对象

Criteria criteria = session.createCriteria(Customer.class);


//2 设置分页数据

criteria.setFirstResult(0);//开始位置

criteria.setMaxResults(3);//记录数


List<Customer> list = criteria.list();


for (Customer customer : list) {

System.out.println(customer);

}

tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

统计查询

1)查询表里面有多少条记录,封装的方法实现

 

//5 统计查询

@Test

public void testcount() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建criteria对象

Criteria criteria = session.createCriteria(Customer.class);


//2 设置实现统计功能

criteria.setProjection(Projections.rowCount());


//3 返回结果

Object obj = criteria.uniqueResult();

//变成long,再变成int

Long lobj = (Long) obj;

int count = lobj.intValue();


System.out.println(count);


tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

5 本地sql查询

(1)使用hibernate框架编写普通sql语句实现

(2)使用hibernate里面SQLQuery对象

1.Mysql里面多表查询

1 内连接查询
(1)查询两个表有关联数据
/*内连接 6 */
SELECT * FROM t_customer c,t_linkman m WHERE c.cid=m.clid
SELECT * FROM t_customer c INNER JOIN t_linkman m ON c.cid=m.clid
在这里插入图片描述

2 左外连接
/左外连接 7/
SELECT * FROM t_customer c LEFT OUTER JOIN t_linkman m ON c.cid=m.clid
(1)左边表里面所有数据,右边表关联数据
在这里插入图片描述

3 右外连接
/右外连接 7/
SELECT * FROM t_customer c RIGHT OUTER JOIN t_linkman m ON c.cid=m.clid
(1)右边表里面所有数据,左边表关联数据
在这里插入图片描述

2.HQL多表查询分类

HQL内连接
1 内连接查询hql语句写法:以客户和联系人为例

  • hql语句操作实体类和属性
//1 hql内连接操作

@Test

public void testSelectDemo1() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建query对象

Query query = session.createQuery("from Customer c inner join c.setLinkMan");


List list = query.list();


tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

3 返回list集合,list集合中每部分是数组结构
在这里插入图片描述

底层sql语句
在这里插入图片描述
4 迫切内连接
语句: from Customer c inner join fetch c.setLinkMan

/1 hql内连接操作

@Test

public void testSelectDemo1() {

SessionFactory sessionFactory = null;

Session session = null;

Transaction tx = null;

try {

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

tx = session.beginTransaction();


//1 创建query对象

Query query = session.createQuery("from Customer c inner join fetch c.setLinkMan");


List<Object[]> list = query.list();


tx.commit();

}catch(Exception e) {

tx.rollback();

}finally {

session.close();

sessionFactory.close();

}

}

(1)返回list集合中,每部分是对象结构
在这里插入图片描述
(2)底层sql语句
在这里插入图片描述

  • HQL左外连接
    1 左外连接hql语句:
    (1)from Customer c left outer join c.setLinkMan
    在这里插入图片描述
    在这里插入图片描述

(2)迫切左外连接
from Customer c left outer join fetch c.setLinkMan
在这里插入图片描述

4 右外连接hql语句:
(1)from Customer c right outer join c.setLinkMan

2.Hibernate检索策略(抓取)

在这里插入图片描述
1 立即查询
(1)调用方法之后做查询操作,只要调用这个方法,马上发送sql语句查询数据库
(2)效果:根据id查询,调用get方法
在这里插入图片描述

2 延迟查询
(1)根据id查询,调用load方法
在这里插入图片描述
什么时候使用,什么时候查询数据库

3 延迟查询分为两类:
第一类 类级别延迟
(1)根据id查询,返回实体类对象
(2)在实体类所在映射文件中,有class标签,使用lazy配置是否需要延迟
在这里插入图片描述
(3)如果lazy值true(默认值),表示执行load方法做延迟操作,但是如果配置lazy值false时候,执行load方法不会延迟(马上查询数据库)

第二类 关联级别延迟
(1)关联级别延迟一般不需要配置,有默认值,默认帮实现延迟效果
(2)查询客户之后,查询客户关联联系人,这个过程做延迟效果
在这里插入图片描述

关联级别延迟(了解)

1 在映射文件中进行配置实现
(1)根据客户得到所有的联系人,在客户映射文件中配置

2 在set标签上使用属性
(1)fetch一般使用select,lazy使用true,默认效果延迟
在这里插入图片描述
(1)fetch:值select(默认) join
(2)lazy:值

  • true:延迟(默认)
  • false:不延迟
  • extra:极其延迟
    在这里插入图片描述

3 在many-to-one标签使用属性配置
(1)fetch一般使用select,lazy使用proxy
(2)proxy:根据customer映射文件中class标签lazy配置绝对是否延迟
在这里插入图片描述

3.批量抓取

1 查询所有的客户,返回list集合,遍历list集合,得到每个客户,得到每个客户的所有联系人
(1)上面操作代码,发送多条sql语句
在这里插入图片描述
(2)在客户的映射文件中,set标签配置

(3)batch-size值,值越大发送语句越少
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值