[TOC]
# 简介
对数据库操作中,最常用的是select.使用hibernate如何select操作。
分为五种:
1导航对象图检索方式,根据已加载的对象导航到其它对象
2.OID检索方式,按照对象的OID来检索对象
3.HQL检索方式,使用面向对象的HQL查询语言
4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口
5.本地SQL检索方式,使用本地数据库的SQL查询语句
# 导航对象图检索方式
~~~
Customer c=session.get(Customer.class,2);
c.getOrders().size()
~~~
通过在hibernate中进行映射关系,在hibernate操作时,可以通过导航方式得到
其关联的持久化对象信息。
# OID检索方式
~~~
Session.get(Customer.class,3);
Session.load(Order.class,1);
~~~
Hibernate中通过get/load方法查询指定的对象,要通过OID来查询。
# HQL
HQL是我们在hibernate中是常用的一种检索方式。
HQL(Hibernate Query Language)提供更加丰富灵活、更为强大的查询能力
因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语 句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形式如下: Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc 其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。
基本步骤:
1. 得到Session
2. 编写HQL语句
3. 通过session.createQuery(hql)创建一个Query对象
4. 为Query对象设置条件参数
5. 执行list查询所有,它反胃的是List集合 uniqueResut()返回一个查询结果
## 数据准备
![](https://box.kancloud.cn/5c5b5deafcaea466041b1ce57337e1ed_674x545.png)
## 基本检索
form 类名
![](https://box.kancloud.cn/d2b78e1014339d4f9ea4339d67bc52f0_776x426.png)
## 排序检索
![](https://box.kancloud.cn/d3aec716af8197b23e65abcff29be50a_771x364.png)
## 条件检索
![](https://box.kancloud.cn/f56579a339f5badb0ff1e1299c60e06f_788x524.png)
## 分页检索
![](https://box.kancloud.cn/7dc55a8c9a9902633cb34844ab1a260b_687x487.png)
## 分组统计检索
分组 group by
统计 count max min avg sum
![](https://box.kancloud.cn/9ad6ad530613b04321cc9ee46d4a552e_760x509.png)
## 投影检索
使用投影将部分属性封装到对象中
![](https://box.kancloud.cn/954cfa7aedbf10fe2655c731aceed094_780x511.png)
注意: 我们要在po类中提供对应属性的构造方法,也要有无参数构造
## 命名检索
我们可以将hql语句先定义出来,在使用时通过session.getNamedQuery(hqlName);得到一个Query,在执行.
问题:hql定义在什么位置?
1.如果你有hbm配置文件,那么当前的hql操作是对哪一个实体进行操作,就在哪一个 实体的配置文件中声明。
![](https://box.kancloud.cn/ff7c1e6029fd815ff233f33ef6ca6f83_687x263.png)
# QBC
QBC(query by criteria),它是一种更加面向对象的检索方式。
QBC步骤:
1. 通过Session得到一个Criteria对象 session.createCriteria()
2. 设定条件 Criterion实例 它的获取可以通过Restrictions类提供静态。
Criteria的add方法用于添加查询条件
3. 调用list进行查询 criterfia.list.
## 基本检索
![](https://box.kancloud.cn/ed7f2c144ef957fe1d497bddd08e6d1b_759x436.png)
## 排序检索
![](https://box.kancloud.cn/c42639254853d95257d9dedcd3118e46_763x397.png)
注意在criteri.addOrder()方法的参数使用的Order是hibernate中的对象
## 条件检索
![](https://box.kancloud.cn/de33c8581990d3b5d49e31d119e98bec_768x574.png)
## 分页检索
![](https://box.kancloud.cn/dd27c0923234755ef5372d62368dbf65_768x429.png)
## 统计分组检索
Count sum avg max min
![](https://box.kancloud.cn/417f14e1c733848179a4098e53ee3d66_773x223.png)
## 离线条件检索
在多条件查询的时候,需要在Web层封装相应的参数到Criteria,而在Dao层才真正的去执行查询数据库的操作,所以需要在Web层创建Criteria并将其传递到Dao层,这个时候就不能在Web层使用session.createCriteria来创建Criteria,因为Criteria的一般创建都是使用session.createCriteria(),而session都是在Dao层才会创建的
![](https://box.kancloud.cn/87bf07e275aef50738564423b4a2508d_756x420.png)
# 本地SQL
![](https://box.kancloud.cn/9e74914690dac5d81f26adfca11dd450_794x620.png)
![](https://box.kancloud.cn/12ed466e7945eba6757889baddb66c1e_789x296.png)
# 多表操作
SQL多表操作
1.交叉连接 CROSS JOIN 会产生迪卡尔积
SELECT * FROM t_customer CROSS JOIN t_order;
2.内连接 INNER JOIN ON
SELECT * FROM t_customer AS c INNER JOIN t_order AS o ON c.id=o.c_customer_id;
使用内连接它只能将有关联的数据得到。
隐式内连接 使用 "逗号"将表分开,使用WHERE来消除迪卡尔积
SELECT * FROM t_customer AS c ,t_order o WHERE c.id=o.c_customer_id;
3.外连接 左外LEFT OUTER JOIN 右外RIGHT OUTER JOIN
OUTER可以省略
SELECT * FROM t_customer c LEFT OUTER JOIN t_order o ON c.id=o.c_customer_id;
# HQL多表操作
Hql多表操作分类:
1. 1. 交叉连接
2. 2. 内连接
* a) 显示内连接
* b) 隐式内连接
* c) 迫切内连接
* 3. 外连接
左外连接
迫切左外连接
右外连接
注意:在hibernate中有迫切连接的概念,而sql中没有。
## 内连接
显示内连接
显示内连接使用的是inner join with
![](https://box.kancloud.cn/5b8fa062a3f8abd436045967475a2e49_771x503.png)
## 隐式内连接
隐式内连接也我们在sql中操作不一样,它是通过”.”运算符来关联
![](https://box.kancloud.cn/fbd44206b33d2aa1caaefa3c94b5619e_737x357.png)
## 迫切内连接
迫切内连接得到的结果是直接封装到PO类中,而内连接得到的是Object[]数组,数组中封装的是PO类对象。
![](https://box.kancloud.cn/f432cc64ced26d6e2491a929171f71a0_792x457.png)
## 外连接
![](https://box.kancloud.cn/4450e4c8deb8e84059bad8a628242251_782x528.png)
- 基础
- 编译和安装
- scanner类(键盘录入)
- Random类(随机数)
- 数组
- 方法
- 类
- ArrayList集合
- char与int
- eclipse
- IDEA
- 变量与常量
- 常用API
- String,StringBuffer,StringBuilder
- 正则,Date,DateFormat,Calendar
- 包装类,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增强for,泛型
- List,set,判断集合唯一
- map,Entry,HashMap,Collections
- 异常
- IO
- File
- 递归
- 字节流
- 字符流
- IO流分类
- 转换流
- 缓冲流
- 流的操作规律
- properties
- 序列化流与反序列化流
- 打印流
- commons-IO
- IO流总结
- 多线程
- 线程池
- 线程安全
- 线程同步
- 死锁
- lock接口
- ThreadLoad
- 等待唤醒机制
- 线程状态
- jdbc
- DBUtils
- 连接池DBCP
- c3p0连接池
- 网络编程
- 多线程socket上传图片
- 反射
- xml
- 设计模式
- 装饰器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事务
- 监听器Listener
- 过滤器Filter
- json
- linux安装软件
- 反射详解
- 类加载器和注解
- 动态代理
- jedis
- Hibernate
- 简介
- 创建映射文件
- Hibernate核心配置文件
- 事务和增删改查
- HibernateUtils
- 持久化对象的三种状态
- 检索方式
- query
- Criteria
- SQLQuery
- 持久化类
- 主键生成策略
- 缓存
- 事务管理
- 关系映射
- 注解
- 优化
- struts2
- 搭建
- 配置详解
- Action
- 结果跳转方式
- 访问ServletAPI方式
- 如何获得参数
- OGNL表达式
- valueStack 值栈
- Interceptor拦截器
- spring
- 导包
- IOC和DI
- Bean获取与实例化
- Bean属性注入
- spring注解
- 注解分层
- junit整合
- aop
- 动态代理实现
- cglib代理实现
- aop名词
- spring的aop
- aop-xml详解
- aop-注解详解
- 代理方式选择
- jdbcTemplate
- spring事务管理
- 回滚注意
- 事务传播属性
- MyBatis
- MyBatis简介
- 入门程序
- 与jdbc hibernate不同
- 原始Dao开发
- Mapper动态代理方式
- SqlMapConfig.xml配置文件
- 输入参数pojo包装类
- resultMap
- 动态sql
- 一对一关联
- 一对多
- 整合spring
- 逆向工程
- maven
- maven简介
- 仓库
- maven目录结构
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入门程序
- 整合struct
- 依赖范围
- 添加插件
- idea配置
- jar包冲突
- 分模块开发
- 构建可执行的jar包(包含依赖jar包)
- springMVC
- 处理流程
- java面试
- java版本升级
- java1-8版本变更
- java9新特性
- 锁
- java资料
- idea
- jdk版本切换
- log4j
- 入门实例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代码优化