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/
开发包目录,如下图所示:
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包
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();
}