Hibernate5-课程笔记4
单表查询:
Hibernate是DAO层技术,对数据的使用,查询是最为重要的。Hibernate的查询技术非常强大,支持原始SQL语句查询,支持QBC查询及Hibernate特有的HQL查询。
HQL,Hibernate Query Language,Hibernate查询语言,它与SQL非常相似。但,HQL是面向对象的查询语言,而SQL是面向二维表的。HQL查询语句中使用的是类名与属性名,而SQL语句使用的是表名与字段名。
QBC,Query By Criteria,标准查询,一种比HQL更为面向对象的查询方法。
对应API:
(1) Query接口:
Hibernate进行HQL查询的接口,支持动态绑定参数的功能。使用Session对象的createQuery方法可获取Query对象。
Query query = session.createQuery(hql);
(2)SQLQuery接口:
Hibernate进行SQL原生查询的接口,支持动态绑定参数的功能,是Query接口的子接口。使用Session对象的createSQLQuery()方法可获取SQLQuery对象。
SQLQuery sqlQuery = session.createSQLQuery(sql);
其查询出的结果对象默认为Object,当然,若结果为List,则其元素为Object。使用SQLQuery的addEntity(Xxx.class)方法,可以将其结果泛型设定为指定类型。
(3) Criteria接口:
Criteria,标准、准则,Hibernate进行Criteria查询的接口,与Query接口无关。使用Session对象的createCriteria()方法可获取Criteria对象。
Criteria criteria = session.createCriteria(Xxx.class);
具体查询代码:
(1) 查询所有:
//查询所有
@Test
public void test01_SQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String sql = "select tid,tname,tage,tscore from t_student";
List<Student> list = session.createSQLQuery(sql).addEntity(Student.class).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test01_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
//sql中出现的是表名与字段名,hql中出现的是类名与属性名
String hql = "from Student";
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test01_QBC() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
List<Student> list = session.createCriteria(Student.class).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
(2)对查询结果排序:
//查询结果查询
@Test
public void test02_SQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String sql = "select tid,tname,tage,tscore from t_student order by tage desc";
List<Student> list = session.createSQLQuery(sql).addEntity(Student.class).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test02_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student order by age desc";
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test02_QBC() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
List<Student> list = session.createCriteria(Student.class).addOrder(Order.desc("age")).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
(3) 动态参数绑定查询:
//动态参数绑定查询
@Test
public void test03_1() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where age > ? and score < ?";
List<Student> list = session.createQuery(hql)
.setInteger(0, 20)
.setDouble(1, 94)
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test03_2() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where age > :myage and score < :myscore";
List<Student> list = session.createQuery(hql)
.setInteger("myage", 20)
.setDouble("myscore", 94)
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test03_3() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where age > ? and score < ?";
List<Student> list = session.createSQLQuery(hql)
.setParameter(0, 20)
.setParameter(1, 94.0) //这里必须是94.0
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test03_4() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where age > :myage and score < :myscore";
List<Student> list = session.createQuery(hql)
.setParameter("myage", 20)
.setParameter("myscore", 94.0) //这里必须是94.0
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
(4) 分页查询:
//分页查询
@Test
public void test04_SQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String sql = "select * from t_student limit ?,?";
List<Student> list = session.createSQLQuery(sql)
.addEntity(Student.class)
.setInteger(0, 4)
.setInteger(1, 3)
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test04_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student";
List<Student> list = session.createQuery(hql)
.setFirstResult(4)
.setMaxResults(3)
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
(5) 模糊查询:
//模糊查询
@Test
public void test05_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where name like :myname";
List<Student> list = session.createQuery(hql)
.setString("myname", "%n%")
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
(6) 唯一性查询:
//唯一性查询
@Test
public void test06_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where id=:myid";
Student student = (Student) session.createQuery(hql)
.setInteger("myid", 3)
.uniqueResult();
System.out.println(student);
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
(7) 聚合函数查询:
//聚合函数查询
@Test
public void test07_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "select count(id) from Student";
Long count = (Long) session.createQuery(hql).uniqueResult();
System.out.println(count);
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
(8) 投影查询:
//投影查询
@Test
public void test08_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "select new Student(name, age) from Student";
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
(9) 分组查询:
//分组查询
@Test
public void test09_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student group by age";
List<Integer> list = session.createQuery(hql).list(); //每个年龄段的第一个人
System.out.println(list); String hql2 = "select age from Student group by age";
List<Integer> list2 = session.createQuery(hql2).list(); //共有几个年龄段
System.out.println(list2); String hql3 = "select age from Student group by age having count(age) > 1";
List<Integer> list3 = session.createQuery(hql3).list(); //人数多于1人的年龄段
System.out.println(list3);
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
(10) iterator和N+1问题的解决:
@Test
public void test10_3() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
//第一次查询
String hql = "from Student";
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
//第二次查询
String hql2 = "from Student";
Iterator<Student> it2 = session.createQuery(hql2).iterate();
while (it2.hasNext()) {
Student student2 = it2.next();
System.out.println(student2);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
解释:list()方法对所有Student表的每条数据进行一次详情查询,但是第二次再用list()查询时不会从Session缓存中读取数据;
而iterator()方法首先对Student表的主键进行查询(对主键的查询比详情效率高,因为数据库中存在索引),再根据主键依次对Student表中的每条数据进行逐个查询,总共查询了N+1次,但是第二次再用iterator()查询时,只会做主键查询,然后根据主键从Session缓存中读取数据,而不会进行详情查询。
所以,如果要进行多次查询时,第一次使用list()查询,之后每次都使用iterator()查询。
(11) 命名查询(好处:可以在配置文件中修改查询语句):
//命名查询
@Test
public void test11_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
Student student = (Student) session.getNamedQuery("selectById")
.setInteger("myid", 3)
.uniqueResult();
System.out.println(student);
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}
对应映射文件为:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<!-- 类到表的映射,属性到字段的映射 -->
<class name="com.tongji.beans.Student" table="t_student">
<id name="id" column="tid">
<generator class="native"/>
</id>
<property name="name" column="tname"/>
<property name="age" column="tage"/>
<property name="score" column="tscore"/>
</class>
<query name="selectById">from Student where id=:myid</query>
</hibernate-mapping>
Hibernate5-课程笔记4的更多相关文章
- Linux内核分析课程笔记(一)
linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...
- (1/18)重学Standford_iOS7开发_iOS概述_课程笔记
写在前面:上次学习课程对iOS还是一知半解,由于缺乏实践,看公开课的视频有时不能很好地领会知识.带着问题去学习永远是最好的方法,接触一段时间iOS开发以后再来看斯坦福iOS公开课,又会有许多新的发现, ...
- Andrew Ng机器学习课程笔记(五)之应用机器学习的建议
Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...
- Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)
title: Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归) tags: 机器学习, 学习笔记 grammar_cjkRuby: true --- 之前看过一遍,但是总是模 ...
- Andrew Ng机器学习课程笔记--汇总
笔记总结,各章节主要内容已总结在标题之中 Andrew Ng机器学习课程笔记–week1(机器学习简介&线性回归模型) Andrew Ng机器学习课程笔记--week2(多元线性回归& ...
- Andrew 机器学习课程笔记
Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...
- 操作系统学习笔记----进程/线程模型----Coursera课程笔记
操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...
- 《CSS动画实用技巧》课程笔记
概述 这是我学习[CSS动画实用技巧][1]的课程笔记 常用动画属性--transition [常用动画属性--transition][2] .change img{ display:block; w ...
- Deeplearning.ai课程笔记--汇总
从接触机器学习就了解到Andrew Ng的机器学习课程,后来发现又出来深度学习课程,就开始在网易云课堂上学习deeplearning.ai的课程,Andrew 的课真是的把深入浅出.当然学习这些课程还 ...
- selenium课程笔记
selenium课程笔记第一天(2017-7-1) 一.配置火狐浏览器 运行:firefox.exe -p -no -remote selenium课程笔记第二天 用Eclipse+java+sele ...
随机推荐
- linux下telnet mysql的3306断口,提示Can't connect to MySQL server on localhost (110)
新购买的阿里云ECS服务器,食用lnmp环境,安装完毕后,telnet localhost 3306提示Can't connect to MySQL server on localhost (110) ...
- C#自动选择出系统中最合适的IP地址
写这个是因为很长时间以来,碰到过很多次这个问题,但都没当回事,这次又碰到了这个老问题,无奈百度了一圈儿未果,身边又没有大牛可以请教,就自己先“总结”了一套方法,一来给自己记录,二来如果碰巧能有朋友看到 ...
- SOCKET网络编程5
SOCKET网络编程快速上手(二)——细节问题(5)(完结篇) 6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢 ...
- 反射实现IOC功能
通过反射实现IOC功能 这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET ...
- Leapin' Lizards
Leapin' Lizards 题目大意: 在一个网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴 ...
- ASP.NET MVC4简单使用ELMAH记录系统日志
ASP.NET MVC4简单使用ELMAH记录系统日志 前言 在项目开发.测试以及已经上线的项目中都会存在bug,而如果我们在项目的各个阶段都能及时的监控系统出现的任何问题,那么对于我们开发人员来说完 ...
- 瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!
纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox! 前两天写的文章<纯手工打造漂亮的垂直时间轴,使用最简 ...
- C/C++用匿名数据结构实现时间和空间名利双收
程序的时间和空间,往往是一对矛盾,比如计算CRC32的时候会用到余式表 DWORD *crcTable; // DWORD[256]; 余式表可以用某种规则计算生成,为缩短文章长度就不写出来了,总之要 ...
- 基于session 的springMvc 国际化
项目中采用springMvc的框架,需要动态切换语言,找了一些资料,最后决定采用基于session的动态切换,实现动态切换中文,英文,韩文,其实就是把中文翻译成其他语言显示 springMvc国际化包 ...
- go语言中sync包和channel机制
文章转载至:https://www.bytelang.com/article/content/A4jMIFmobcA= golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"Go&quo ...