@Test
public void test1(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//1.获取Query对象
Query query = s.createQuery("from Customer");
//2.执行对象的方法,获取结果集
List list = query.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}
/**
* 条件查询
* hibernate的参数占位符索引是从0开始的
*/
@Test
public void test2(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//1.获取Query对象
Query query = s.createQuery("from Customer where custName like ? and custLevel = ?");
//2.给参数占位符赋值
query.setString(0, "%集%");
query.setString(1, "普通客户");
//3.执行对象的方法,获取结果集
List list = query.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}
/**
* 条件查询
* 具名查询:
* 给参数占位符提供一个具体的名称
* 参数占位符的写法:
* :名称
* 赋值的时候不需要写冒号,直接写名称
*/
@Test
public void test3(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//1.获取Query对象
Query query = s.createQuery("from Customer where custName like :custName and custLevel = :custLevel");
//2.给参数占位符赋值
query.setString("custName", "%集%");
query.setString("custLevel", "普通客户");
//3.执行对象的方法,获取结果集
List list = query.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}
/**
* 排序查询
* 使用的关键字:
* order by
* 升序:
* asc 默认值
* 降序:
* desc
*/
@Test
public void test2(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
Query query = s.createQuery("from LinkMan order by lkmId desc ");
List list = query.list();
for(Object o : list){;
System.out.println(o);
}
tx.commit();
}
/**
* HQL使用聚合函数:
* 统计查询
* 聚合函数:
* count sum max min avg
*
* sql语句使用聚合函数时,在不使用group by子句的情况下,返回的结果,永远只有一行一列的情况。
*
* 在SQL语句时:
* select count(*) from table 它是统计所有字段,效率没有只统计主键字段高
* select count(主键) from table 它和第一个的结果是一样的,但是效率更高
* select count(非主键) from table 只统计不为null的字段
*/
@Test
public void test1(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
Query query = s.createQuery("select count(lkmId) from LinkMan");//它
Long total = (Long)query.uniqueResult();//返回的是一个唯一的结果集。 只有确定结果集唯一时,才能使用
System.out.println(total);
tx.commit();
}
/**
* 投影查询:
* 投影:使用一个实体的部分字段信息,来构建实体类对象,叫做对象的投影(在hibernate中的叫法)
* 使用HQL的方式查询实体类的部分字段信息,并且封装到实体类中。(QBC也能实现投影查询,但是不如hql的好用,所以使用投影查询,一般都用HQL)
* HQL语句的写法:
* select new Customer() from Customer
* 如果工程只有一个唯一的类,可以不写全限定类名,否则必须写全限定类名。
* 实体类要求:
* 必须提供一个相同参数列表的构造函数
*/
@Test
public void test3(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
Query query = s.createQuery("select new Customer(custId,custName) from Customer ");
List<Object[]> list = query.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}
1.1 Criteria:
1.1.1 概述
作用:它是使用对象和方法来查询。是一种更加面向对象的查询方式。
QBC查询:Query By Criteria
把查询语句以及条件全都转成了对象的方法。
如何获取:
使用Session对象的createCriteria(Class clazz)方法
参数含义:
要查询的实体类字节码对象
细节:
HQL能查的,QBC都能查,反之亦然。
/**
* 查询所有
*/
@Test
public void test1(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//1.获取Criteria对象
Criteria c = s.createCriteria(Customer.class);//它就相当于HQL的from Customer
//2.执行对象的方法获取结果集
List list = c.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}
/**
* 条件查询
*/
@Test
public void test2(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//1.获取Criteria对象
Criteria c = s.createCriteria(Customer.class);//它就相当于HQL的from Customer
//2.设置查询条件
c.add(Restrictions.like("custName", "%集%"));//from Customer where custName like "%集%"
c.add(Restrictions.eq("custLevel", "普通客户"));
//3.执行对象的方法获取结果集
List list = c.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}
/**
* 分页查询
* 和HQL是一模一样的
*/
@Test
public void test3(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//1.获取Criteria对象
Criteria c = s.createCriteria(Customer.class);//它就相当于HQL的from Customer
//2.设置分页
c.setFirstResult(2);
c.setMaxResults(2);
//3.执行对象的方法获取结果集
List list = c.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}
/**
* 排序查询
*/
@Test
public void test1(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//1.获取对象
Criteria c = s.createCriteria(Customer.class);
//2.设置排序
c.addOrder(Order.desc("custId"));
//3.获取结果集
List list = c.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}
统计查询
/**
* QBC使用聚合函数
* 统计查询
* 涉及的对象:
* Criteria
* 涉及的方法:
* setProjection(Projection p);
* 参数的含义
* Projection:要添加的查询投影
*/
@Test
public void test2(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//1.获取对象
Criteria c = s.createCriteria(Customer.class);//from Customer | select * from cst_customer
//2.想办法把select * 变成 select count(*)
// c.setProjection(Projections.rowCount());//select count(*)
c.setProjection(Projections.count("custId"));//select count(cust_id)
//3.获取结果集
// List list = c.list();
// for(Object o : list){
// System.out.println(o);
// }
Long total = (Long)c.uniqueResult();
System.out.println(total);
tx.commit();
}
离线查询
/**
* 离线条件查询
* 离线:
* 它是和在线对应的。
* Criteria对象是一个在线对象,它是由一个可用的(活动的)Session对象获取的出来的。
* 当session失效时,就无法再获取该对象了。
* 有一个对象,它也可以用于设置条件,但是获取的时候并不需要Session对象。
* 该对象就叫做离线对象:
* DetachedCriteria对象
* 使用该对象进行的查询就叫做:离线查询
*
* 如何获取该对象
* DetachedCriteria dCriteria = DetachedCriteria.forClass(要查询的实体类字节码);
*
*/
@Test
public void test3(){
//模拟一次web操作: 浏览器发送请求——调用servlet——调用service——调用dao——拿到结果到jsp上展示
List list = servletFindAllCustomer();
for(Object o : list){
System.out.println(o);
}
}
//模拟servlet
public List<Customer> servletFindAllCustomer(){
//离线对象
DetachedCriteria dCriteria = DetachedCriteria.forClass(Customer.class);
//设置条件:和Criteria是一样的
dCriteria.add(Restrictions.like("custName","%集%"));
return serviceFindAllCustomer(dCriteria);
}
public List<Customer> serviceFindAllCustomer(DetachedCriteria dCriteria) {
return daoFindAllCustomer(dCriteria);
}
public List<Customer> daoFindAllCustomer(DetachedCriteria dCriteria) {
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
//把离线对象使用可用Session激活
Criteria c = dCriteria.getExecutableCriteria(s);
List<Customer> list = c.list();
tx.commit();
return list;
}
* 修改一个实体
*/
@Test
public void testUpdate(){
//1.使用工具类获取一个Session
Session session = HibernateUtil.openSession();
//2.开启事务
Transaction tx = session.beginTransaction();
//3.根据id查询
Customer c = session.get(Customer.class, 1L);
c.setCustName("TBD云集中心");
//修改实体
session.update(c);
//4.提交事务
tx.commit();
//5.释放资源
session.close();
}
/**
* 删除一个实体
*/
@Test
public void testDelete(){
//1.使用工具类获取一个Session
Session session = HibernateUtil.openSession();
//2.开启事务
Transaction tx = session.beginTransaction();
//3.根据id查询
Customer c = session.get(Customer.class, 1L);
//删除实体
session.delete(c);//delete from cst_customer where cust_id = ?
//4.提交事务
tx.commit();
//5.释放资源
session.close();
}