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值,值越大发送语句越少