这是黑马视频的学习笔记
hibernate的5种查询方式
对象导航查询
根据id查询某个客户,再查询这个客户里面所有的联系人//根据cid=1查询客户,再查询这个客户里面所有的联系人
Customer customer=session.get(Customer.class, 1);
// 再查询此客户里面所有的联系人
//得到联系人的set集合
Set<LinkMan> linkMans= customer.getSetLinkMan();
System.out.println(linkMans.size());
OID查询
根据id查询某一条记录,返回对象
hql查询
使用Query对象,要写hql语句实现查询
1.创建Query对象,写hql语句。再调用query对象的方法查询得到结果
2.查询所有
查询所有客户记录
//创建Query对象
Query query=session.createQuery("from Customer");
//调用方法得到结果
List<Customer> list=query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
3.条件查询
语句写法:from 实体类名 where 属性=?and 。。。。。
from 实体类名 where 属性 like ?
//创建Query对象
Query query=session.createQuery("from Customer c where c.cid=? and c.custName=?");
// 2 设置条件值 位置从0开始计数
query.setParameter(0, 1);
query.setParameter(1, "baidu");
//3.调用方法得到结果
List<Customer> list=query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//创建Query对象
Query query=session.createQuery("from Customer c where c.custName like ?");
// 2 设置条件值 位置从0开始计数
query.setParameter(0, "%浪%");
//3.调用方法得到结果
List<Customer> list=query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
4.排序查询
form 实体类名 order by 属性 desc
//创建Query对象
Query query=session.createQuery("from Customer order by cid");
//3.调用方法得到结果
List<Customer> list=query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
5.分页查询
//创建Query对象
Query query=session.createQuery("from Customer");
//设置分页数据
query.setFirstResult(0);
query.setMaxResults(3);
//2.调用方法得到结果
List<Customer> list=query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
6.投影查询
查询不是所有字段值,而是部分字段的值
select 属性。。。 from 实体类名
//创建Query对象
Query query=session.createQuery("select custName from Customer");
//2.调用方法得到结果
List<Object> list=query.list();
for (Object object : list) {
System.out.println(object);
}
7.聚集函数使用
hql语法:select count(*) from 实体类名
//创建Query对象
Query query=session.createQuery("select count(*) from Customer");
//2.调用方法得到结果
Object object=query.uniqueResult();
Long lobject=(Long)object;
int count=lobject.intValue();
System.out.println(count);
QBC查询
使用Criteria对象
查询所有
Criteria criteria=session.createCriteria(Customer.class);
@SuppressWarnings("unchecked")
List<Customer> list=criteria.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
条件查询
//创建对象
Criteria criteria=session.createCriteria(Customer.class);
//使用criteria里面的方法设置条件值
//用add方法,表示设置条件值
//在add方法里面使用类的方法实现条件设置
//类似于cid=?
criteria.add(Restrictions.eq("cid", 1));
criteria.add(Restrictions.eq("custName", "传智播客"));
List<Customer> list=criteria.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
Criteria criteria=session.createCriteria(Customer.class);
criteria.add(Restrictions.like("custName", "%浪%"));
List<Customer> list=criteria.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
排序查询
riteria criteria=session.createCriteria(Customer.class);
//设置对哪个属性进行排序,设置排序规则
criteria.addOrder(Order.desc("cid"));
@SuppressWarnings("unchecked")
List<Customer> list=criteria.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
分页查询
Criteria criteria=session.createCriteria(Customer.class);
criteria.setFirstResult(0);
criteria.setMaxResults(3);
@SuppressWarnings("unchecked")
List<Customer> list=criteria.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
统计查询
Criteria criteria=session.createCriteria(Customer.class);
criteria.setProjection(Projections.rowCount());
Object object=criteria.uniqueResult();
Long lobject=(Long)object;
int count =lobject.intValue();
System.out.println(count);
离线查询
DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Customer.class);
Criteria criteria=detachedCriteria.getExecutableCriteria(session);
List<Customer> list=criteria.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
本地SQL查询
使用SQLQuery对象,要写sql语句
hql的多表查询
1.内连接
返回list,list里面是数组形式
Query query=session.createQuery("from Customer c inner join c.setLinkMan");
List list=query.list();
2.迫切内连接
迫切内连接和内连接的底层实现一样。但是迫切内连接返回的list中每部分是对象
Query query=session.createQuery("from Customer c inner join fetch c.setLinkMan");
List list=query.list();
3.左外连接
返回list,list里面是数组形式
Query query=session.createQuery("from Customer c left outer join c.setLinkMan");
List list=query.list();
4.迫切左外连接
Query query=session.createQuery("from Customer c left outer join fetch c.setLinkMan");
List list=query.list();
迫切左外连接和左外连接的底层实现一样。但是迫切左外连接返回的list中每部分是对象
5.右外连接
类似左外连接
hibernate检索策略
1. 检索策略:hibernate检索策略分为 立即查询 和 延迟查询
立即查询:根据id查询,调用get方法,一调用get方法马上发送语句查询数据库
延迟查询:根据id查询,调用load方法,一调用load方法不会马上发送语句查询数据库。在得到对象里面的值时才会发送语句查询数据库
2. 延迟查询又分成 类级别延迟 和 关联级别延迟
类级别延迟:根据id查询返回实体类对象,调用load方法不会立刻发送查询语句
关联级别延迟: 查询一个客户,再查询这个客户的所有联系人。查询所有联系人的过程是否需要延迟。如果要延迟,就是关联级别延迟
3.关联级别延迟操作:
在映射文件中配置实现;根据客户得到所有联系人,要在客户的映射文件中配置
在set标签上使用两个属性,fetch=“select”(默认)。 lazy属性值 true(默认):延迟。 false:不延迟 。 extra:极其延迟
hibernate批量抓取
查询所有客户,返回list集合。遍历list集合,得到每个客户,再得到每个客户的所有联系人。
Criteria criteria=session.createCriteria(Customer.class);
@SuppressWarnings("unchecked")
List<Customer> list=criteria.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
//得到每个客户里面所有的联系人
Set<LinkMan> linkMans=customer.getSetLinkMan();
for (LinkMan linkMan : linkMans) {
System.out.println(linkMan.getLkm_name());
}
但是上面代码会发送多条sql语句,造成性能问题
2.解决方法:在客户的映射文件中的set标签中配置batch-size=“10”;数越大发送的语句越少,性能越高