视频课程链接:http://edu.51cto.com/course/10747.html
一、查询操作
1. Hibernate支持多种查询方式
2.分类
主键查询、HQL查询、Criteria查询、原生SQL查询、命名查询、JDBC操作
导航查询(根据关联关系自动查询)
二、主键查询
1. get方法
Session的get()
2. load方法
Session的load()
三、HQL查询
1. 简介
1.1 概念
HQL:Hibernate Query Language,Hibernate查询语言
是一种面向对象的查询语句,其中没有表和列的概念,只有类、对象和属性的概念
1.2 优点
- 不需要编写复杂的SQL语句,而是针对实体类和属性进行查询
- 查询结果是直接返回的List对象集合,不需要再次封装
- 独立于数据库,根据dialect自动生成对应数据库的SQL语句
2. 基本用法
2.1 语法
[select/update/delete 属性名] from 类名 [where] [group by] [having] [order by]
类似于sql,对应关系
SQL | HQL |
---|---|
表名 | 类名 |
列名 | 属性名 |
select id,name,pwd,age from t_user | select id,username,password,age from User |
2.2 使用HQL需要四步
-
获取Session
-
编写HQL语句
-
创建Query对象
Query接口是HQL查询接口,提供了各种查询功能
-
执行查询,得到结果
Session session = HibernateUtil.getSession();
// String hql="from User"; //实体类名,类名区分大小写
// String hql = "from day01.User"; // 也可写成类的全名
// String hql = "select * from User"; // 报错:此处不能使用*星号
String hql = "select u from User u"; // 设置别名
Query query = session.createQuery(hql);
List<User> list = query.list();
System.out.println(list);
HibernateUtil.close();
3. 实体查询
- 实体查询1:查询所有用户
- 实体查询2:带条件
- 实体查询3:单个实体
4. 投影查询
投影查询就是只查询类的一个或多个属性,并不获取对象的全部属性,也称为属性查询
有如下三种形式:
- 查询单个属性,将每条查询结果封装成Object对象
- 查询多个属性
- 将每条查询结果封装成Object数组
- 将每条查询结果封装成Map集合(了解)
- 将每条查询结果通过构造函数封装成对象
5. 参数绑定
5.1 ?参数占位符
使用?作为占位符,可以先设定查询参数,然后通过Query的setXxx()方法设置参数值
下标从0开始,与PreparedStatement有所不同(从1开始)
5.2 命名参数
使用:name标识一个名为name的查询参数,然后根据此参数名设置参数值
5.3 bean参数
将参数封装为一个bean,然后通过Query的setProperties(Object bean)方法设置参数值
6. 分页和聚合函数
6.1 分页
Query对象提供了简便的分页方法:
- setFirstResult(int firstResult) 设置从第几条开始
- setMaxResults(int maxResults) 设置读取最大记录数据
Hibernate会根据底层数据库自动生成相应的分页语句
6.2 聚合函数
常用聚合函数:count()、max()、min()、avg()、sum()
子查询
分组查询:group by .... having
四、Criteria查询
1. 简介
Criteria查询是Hibernate提供的一种完全面向对象的查询,它用面向对象的方式将构造查询的过程做了封装,又称为对象查询
详见文档 第15章 条件查询 Criteria
2. 基本用法
Restriction类提供了许多静态方法,用来限定查询条件
五、原生SQL查询
1. 简介
Hibernate对原生SQL查询也提供了支持,也称为本地SQL查询
通过SQLQuery也支持原生SQL查询
addEntity()将查询结果集中的关系数据映射为对象
2. 基本用法
String sql="select * from t_user";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(User.class); //将查询结果集中的关系数据映射为对象
List<User> list = query.list();
System.out.println(list);
六、命名查询
1. 简介
命名查询是指在映射文件中定义字符串形式的查询语句,即将查询语句写在hbm映射文件中
命名查询既可以是HQL查询语句,也可以是SQL查询语句
2. HQL语句的命名查询
在映射文件中使用<query>元素定义一个HQL查询语句,与<class>元素并列
3. SQL语句的命名查询
在映射文件中使用<sql-query>元素定义一个SQL查询语句,与<class>元素并列
七、JDBC操作
1. 简介
在Hibernate4.x中可以使用Session的doWork()方法进行JDBC操作,会将Connection暴露出来
2. 基本用法
Session session = HibernateUtil.getSession();
final List<User> list=new ArrayList<User>();
session.doWork(new Work() {
@Override
public void execute(Connection conn) throws SQLException {
ResultSet rs = conn.prepareStatement("select * from t_user")
.executeQuery();
while (rs.next()) {
User user = new User(rs.getInt("id"), rs.getString("name"),
rs.getString("pwd"), rs.getInt("age"));
list.add(user);
}
}
});
System.out.println(list);
HibernateUtil.close();
八、其他
1. 更新操作
使用Query的executeUpdate()方法对数据进行更新操作:增、删、改
Session session = HibernateUtil.getSession();
TransactionManager.beginTransaction();
// String hql="delete from User where id in (2,3,5,7,20) and password='123'";
String hql = "update User u set u.password='666666' where u.username='alice'";
Query query = session.createQuery(hql);
int count = query.executeUpdate(); // 受影响的行数
System.out.println(count);
TransactionManager.commit();
System.out.println("更新成功");
HibernateUtil.close();
2. formula属性
该属性可以利用SQL动态的生成实体属性,将SQL执行结果映射到实体属性上
要求:
- 实体要存在相应的属性
- sql语句必须用小括号()包裹起来
- 如果操作列名,必须为表起别名
<!--
该属性不对应数据库表中的某列,对应的是sql查询的结果
-->
<property name="count" formula="(select count(u.id) from t_user u)"></property>
九、作业
1. 任务
- 创建部门表t_dept(id,name)及对应的实体类和hbm文件
- 创建员工表t_emp(id,name,dept_id)及对应的实体类和hbm文件
- 创建班级表t_class(id,name)及对应的实体类和hbm文件
- 创建学生表t_student(id,name,class_id)及对应的实体类和hbm文件
2. 预习
多对一、一对多、多对多、一对一
继承、组件、JPA