首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hibernate查询详解、连接池、逆向工程

前言

在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式….到目前为止,我们都是使用一些简单的主键查询阿…使用HQL查询所有的数据….本博文主要讲解Hibernate的查询操作,连接池,逆向工程的知识点

get/load主键查询

由于主键查询这个方法用得比较多,于是Hibernate专门为我们封装了起来…

get()立即查询

这里写图片描述

load()懒加载

这里写图片描述

对象导航查询

如果对象与对象之前存在一对多、多对一的关系的时候

在以前SQL查询的时候:我们如果想要得到当前对象与另一对象的关联关系的时候,就必须用多表查询来得到数据

Hibernate提供了对象导航查询:我们可以使用主键查询完之后,得到的对象,直接使用对象得到集合…就可以得到对应的数据了

HQL查询

Hibernate的前面章节中已经讲解过了基本的概念了。在这里我们就直接看看怎么使用了。

值得注意的是:

在hbm.xml文件中的auto-import="true" 要设置true。当然了,默认值就是ture

如果是false,写hql的时候,要指定类的全名

查询全部列

值得注意的是:HQL不支持*号,下面的代码是错误的。

查询指定的列

值得注意的是:使用HQL查询指定的列,返回的是对象数组Object[]

这里写图片描述

封装对象

前面测试了查询指定的列的时候,返回的是对象数组…可是对象数组我们不好操作啊…Hibernate还提供了将对象数组封装成对象的功能

JavaBean要有对应的构造函数

条件查询

在SQL中条件查询我们也用得比较多,我们来看看HQL中的条件查询有什么新特性。

占位符

占位符就是指?号,我们在SQL中也常常用…

这里写图片描述

命名参数

HQL还支持命名参数查询!下面我们来看一下怎么用:

语法:

这里写图片描述

范围查询

范围查询就是使用between and关键字来查询特定范围的数据。。和SQL是一样的…

模糊查询

模糊查询就是使用Like关键字进行查询,和SQL也是一样的。

%号要写在参数上,不能写带SQL上!

聚合函数统计

我们也经常会查询数据库中一共有多少条记录这样的需求。那么在HQL中怎么用呢?

HQL提供了uniqueResult()这么一个方法,返回只有一条记录的数据

这里写图片描述

分组查询

分组查询和SQL是一样的…

连接查询

连接查询也就是多表查询…多表查询有三种

内连接【等值连接】

左外连接

有外链接

值得注意的是:连接查询返回的也是对象数组!

迫切连接

由于连接查询返回的是对象数组,我们使用对象数组来操作的话会很不方便…既然是连接查询,那么对象与对象是肯定有关联关系的…于是乎,我们想把左表的数据填充到右表中,或者将右表的数据填充到左表中…使在返回的时候是一个对象、而不是对象数组!HQL提供了fetch关键字供我们做迫切连接

查询语句放在配置文件中【命名查询】

我们可以在具体的映射配置文件中存放一些常用的语句。以Dept为例

在程序中,我们可以获取配置文件配置的语句

Criteria 查询

Criteria是一种完全面向对象的查询

Criteria使用的是add()来添加条件。条件又使用一个Restrictions类来封装

我们来简单看一下Restrictions的方法:

这里写图片描述

都是一些大于、小于、等于之类的….Criteria查询就使用不了分组、连接查询了。

SQLQuery本地SQL查询

有的时候,我们可能表的结构十分复杂,如果使用关联映射的话,配置文件是十分臃肿的…因此,我们并不是把全部的数据表都使用映射的方式来创建数据表…

这时,我们就需要用到SQLQuery来维护我们的数据了..

SQLQuery是不能跨数据库的,因为Hibernate在配置的时候就指定了数据库的“方言”

返回的也是对象数组:

这里写图片描述

Hibernate也支持在SQLQuery中对数据进行对象封装..只要添加类型就行了

这里写图片描述

分页查询

传统的SQL我们在DAO层中往往都是使用两个步骤来实现分页查询

得到数据库表中的总记录数

查询起始位置到末尾位数的数据

Hibernate对分页查询也有很好地支持,我们来一下:

提供了方法让我们设置起始位置和结束位置

提供了ScrollableResults来得到滚动结果集,最终得到总记录数

值得注意的是,滚动结果集是从0开始的,因此需要+1才可得到总记录数!

这里写图片描述

如果我们们使用的是,我们可以通过uniqueResult()方法获取数据的唯一记录,得到的数据转换成Long类型即可。

Hibernate连接池

Hibernate自带了连接池,但是呢,该连接池比较简单..而Hibernate又对C3P0这个连接池支持…因此我们来更换Hibernate连接池为C3P0

查看Hibernate自带的连接池

我们可以通过Hibernate.properties文件中查看Hibernate默认配置的连接池

hibernate.properties的配置文件可以在找到

Hibernate的自带连接池啥都没有,就一个连接数量为1

这里写图片描述

查看Hibernate对C3P0的支持

这里写图片描述

修改Hibernate连接池

查找Hibernate支持的连接池组件有什么

这里写图片描述

线程Session使用

我们创建Session的时候,有两个方法

openSession()【每次都会创建新的Session】

getCurrentSession()【获取当前线程的Session,如果没有则创建】

一般地,我们使用线程Session比较多

如果要使用getCurrentSession(),需要在配置文件中配置:

测试数据

为什么要使用逆向工程

由于我们每次编写Hibernate的时候都需要写实体,写映射文件。而且Hibernate的映射文件也容易出错。而逆向工程可以帮我们自动生成实体和映射文件,这样就非常方便了。

使用PowerDesigner

在设计数据库表时,我们使用PowerDesigner来生成概念模型\物理模型…

设计一个人员组织架构:有机构、部门、员工、领导、角色、权限。

一个机构有多个部门

一个部门有多个员工

领导可以管理多个部门,同时领导他自己也是员工

一个员工可以有多个角色

一个角色可以分配给多个人

人员角色分配后可以设置是否有效,分配时间等

一个角色有多个权限

概念模型:

这里写图片描述

在PowerDesigner中,箭头指向的方向永远是“一”的一方

生成物理模型:

这里写图片描述这里写图片描述

最后生成物理模型是这样子的:

这里写图片描述

生成sql语句

我们可以单个生成,一个一个复制

这里写图片描述

也可以把整个物理模型的sql语句一起生成:

这里写图片描述

在数据库生成八张表:

这里写图片描述

在Idea下使用Hibernate逆向工程

这里写图片描述

值得注意的是:Intellij idea下生成出来的映射文件是没有对应的关联关系的。也就是说:一对多或多对多的关系,它是不会帮你自动生成的【好像是这样子的】。。。因此,需要我们自己添加Set【如果需要】

更新,如果想要体现对应的关联关系的话,请参考该博文!

https://my.oschina.net/wangyuefive/blog/683771

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180308G0QP4X00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券