Hibernate的两种检索方式(HQL检索、QBC检索)

Hibernate框架

  javaEE开发三层结构 (高内聚、低耦合)
  MVC: jsp+Servlet+javaBean
  M:model 模型(javaBean:封装数据)
  V:view 视图(jsp:展示数据)
  C:controller 控制器(Servlet:1、获得请求参数 2、调用业务 3、分发转向)
Hibernate的概述
   Hibernate就是一个持久层的ORM的框架.
   ORM:Object Relational Mapping.对象关系映射. 
下载Hibernate5
   下载网址:http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
 开发包目录,如下图所示:
Hibernate的两种检索方式(HQL检索、QBC检索)

1.创建表
Create database hibernate;
Use hibernate;
CREATE TABLE `cst_customer` (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  `cust_user_id` bigint(32) DEFAULT NULL COMMENT '负责人id',
  `cust_create_id` bigint(32) DEFAULT NULL COMMENT '创建人id',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_linkman` varchar(64) DEFAULT NULL COMMENT '联系人',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  PRIMARY KEY (`cust_id`)
);
2.创建项目引入jar包

Hibernate的两种检索方式(HQL检索、QBC检索)


3.创建实体

public class Customer {
private Long cust_id;
private String cust_name;
private Long cust_user_id;
private Long cust_create_id;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
...
}

4.编写映射配置文件(类名.hbm.xml)
<hibernate-mapping>
<!-- class标签用来创建 实体类和表的映射 -->
<class name="com.itheima.domain.Customer" table="cst_customer">
<!-- 设置表中的主键与类中的某个属性的映射 name是类中的属性名  column表中字段名 -->
<id name="cust_id" column="cust_id">
<!-- 只要是主键 需要有一个主键的生成策略: -->
<generator class="native"/>
</id>

<!-- 非主键的属性都使用property标签配置映射  name是类中的属性名  column表中字段名 -->
<property name="cust_name" column="cust_name"></property>
<property name="cust_user_id" column="cust_user_id"></property>
<property name="cust_create_id" column="cust_create_id"></property>
<property name="cust_source" column="cust_source"></property>
<property name="cust_industry" column="cust_industry"></property>
<property name="cust_level" column="cust_level"></property>
<property name="cust_linkman" column="cust_linkman"></property>
<property name="cust_phone" column="cust_phone"></property>
<property name="cust_mobile" column="cust_mobile"></property>
</class>
</hibernate-mapping>

5.创建Hibernate的核心配置文件(hibernate.cfg.xml)


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

<session-factory>
<!-- 必须的配置 -->
<!-- 配置连接数据库的基本的信息: -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<!-- 数据库的方言: -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- Hibernate的可选项 -->

<!-- 加载映射 -->
<mapping resource="com/itheima/domain/Customer.hbm.xml"/>
</session-factory>


</hibernate-configuration>



6.HibernateUtils工具类


public class HibernateUtils {


private static SessionFactory sessionFactory;

static{
//创建Configuration对象,用于加载主配置文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
//构建一个sessionFactory工厂类 (相当于一个连接池)
sessionFactory = cfg.buildSessionFactory();
}

//得到一个连接
public static Session openSession(){
return sessionFactory.openSession();
}

//从线程局部变量中获得session
public static Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}

/*public static void main(String[] args) {

}*/
}


Hibernate的检索方式


1.HQL检索: HQL,Hibernate Query Language(Hibernate查询语言,语法与SQL类似)
2.QBC检索: QBC,Query By Criteria(条件查询,更加面向对象的查询方式)


HQL检索--基本检索


@Test
/**
* HQL:基本检索
*/
public void demo2(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

// 基本查询
/*Query query = session.createQuery("from Customer");
List<Customer> list = query.list();*/
// 起别名
//Query query = session.createQuery("from Customer c");
Query query = session.createQuery("select c from Customer c");
List<Customer> list = query.list();

for (Customer customer : list) {
System.out.println(customer);
}

tx.commit();
}
HQL检索--排序检索


@Test
/**
* HQL:排序检索  -- 根据id降序
*/
public void demo3(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

// 基本查询
Query query = session.createQuery("from Customer order by cust_id desc");
List<Customer> list = query.list();

for (Customer customer : list) {
System.out.println(customer);
}

tx.commit();
}


HQL检索--条件检索
@Test
/**
* HQL:条件查询
*/
public void demo4(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

// 按位置绑定参数
/*Query query = session.createQuery("from Customer where cust_name = ?");
// query.setString(0, "小军军");
query.setParameter(0, "小军军");
List<Customer> list = query.list();*/

// 按名称绑定参数
Query query = session.createQuery("from Customer where cust_name = :name");
query.setParameter("name", "小添添");
/*List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}*/
Customer customer = (Customer) query.uniqueResult();
System.out.println(customer);

tx.commit();
}


HQL检索--分页检索


@Test
/**
*  分页查询 联系人信息
*/
public void demo5(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

Query query = session.createQuery("from LinkMan order by lkm_id desc");
query.setFirstResult(5);
query.setMaxResults(5);
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}

tx.commit();
}


HQL检索--统计检索


@Test
/**
*  统计查询
*/
public void demo6(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

Query query = session.createQuery("select count(*) from Customer");
Long num = (Long) query.uniqueResult();
System.out.println(num);

tx.commit();
}


HQL检索--投影检索


@Test
/**
* 投影查询
*/
public void demo7(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 投影查询一列
/*List<String> list = session.createQuery("select cust_name from Customer").list();
for (String string : list) {
System.out.println(string);
}*/
// 投影查询多列:
/*List<Object[]> list = session.createQuery("select cust_id,cust_name from Customer").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}*/

// 投影的构造的方式查询:
List<Customer> list = session.createQuery("select new Customer(cust_id,cust_name) from Customer").list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}


QBC检索--基本检索


@Test
/**
* 简单的查询
*/
public void demo1(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 简单查询:
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();

for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}


QBC检索--条件检索


@Test
/**
* 简单的查询
*/
public void demo2(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 条件查询:
Criteria criteria = session.createCriteria(Customer.class);
// 设置条件:
// criteria.add(Restrictions.eq("cust_name", "小军军"));
criteria.add(Restrictions.like("cust_name", "%小%"));
criteria.add(Restrictions.gt("cust_id", 1l));

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

for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}


QBC检索--分页检索


@Test
/**
* 分页查询
*/
public void demo3(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 条件查询:
Criteria criteria = session.createCriteria(LinkMan.class);
// 设置分页查询:
criteria.setFirstResult(5);
criteria.setMaxResults(5);

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

for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
}


QBC检索--排序检索


@Test
/**
* 排序查询
*/
public void demo4(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

// 排序查询:
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.addOrder(Order.desc("lkm_id"));

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

for (LinkMan linkMan : list) {
System.out.println(linkMan);
}

tx.commit();
}


QBC检索--统计检索


public void demo5(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

Criteria criteria = session.createCriteria(LinkMan.class);
criteria.setProjection(Projections.rowCount());
Long count = (Long) criteria.uniqueResult();

System.out.println(count);
tx.commit();
}
QBC检索--离线条件检索


@Test
/**
* 离线条件查询:DetachedCriteria(SSH整合经常使用.)
* * 可以脱离session设置参数.
*/
public void demo6(){
// 获得一个离线条件查询的对象
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);


detachedCriteria.add(Restrictions.eq("cust_name","小童童"));

Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

List<Customer> list = detachedCriteria.getExecutableCriteria(session).list();// 离线条件查询对象与session绑定.
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}