持续更新--Hibernate常用操作

@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);//它就相当于HQLfrom 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);//它就相当于HQLfrom 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);//它就相当于HQLfrom 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();

}

 

猜你喜欢

转载自blog.csdn.net/zhao_tong/article/details/80401191