Hibernate学习笔记1

Hibernate学习笔记1

1.Hibernate框架介绍

1.1.什么是hibernate

1.2.什么是orm

1.3.为什么使用hibernate框架

2.Hiberate框架学习目标

3.Hibernate快速入门

3.1.Hibernate下载

3.2.创建数据库与表

3.3.创建实体类

3.4.导入hibernate依赖jar包

3.5.创建映射文件

3.6.创建hibernate核心配置文件

3.7.编写测试代码

3.8.Hibernate工作原理总结

4.Hibernate配置详解

4.1.核心配置文件配置

4.2.映射文件配置

5. Hibernate常用API介绍

5.1.Configuration

5.2.sessionFactory

5.3.Session

5.4.Transaction

5.5.Query

5.6.Criteria

1.Hibernate框架介绍

1.1.什么是hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。

1.2. 什么是orm

对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

对象-关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

ORM模型的简单性简化了数据库查询过程。使用ORM查询工具,用户可以访问期望数据,而不必理解数据库的底层结构。

1.3. 为什么使用hibernate框架

  • Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
  • Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作

Hibernate是企业级开发中主流框架。映射的灵活性很出色。它支持很多关系型数据库

2. Hiberate框架学习目标

掌握hibernate的基本配置

掌握hibernate常用API

掌握hibernate的关联映射

掌握hibernate的检索方式

掌握hibernate的优化方式

3. Hibernate快速入门

3.1. Hibernate下载

下载后的目录结构

documentation目录:存放hibernate的相关文件与API

lib目录:存放hibernate编译和运行所依赖的jar包,其中required子目录下包含了运行hibernate项目必须的jar包

project目录:存放hibernate各种相关的源代码与资源.

在lib/required目录中,包含的jar包

3.2. 创建数据库与表

CREATE DATABASE hibernateTest;
USE RhibernateTest;
CREATE TABLE t_customer(
         id INT PRIMARY KEY AUTO_INCREMENT,
         NAME VARCHAR(20),
         address VARCHAR(50)
)

3.3. 创建实体类

3.4. 导入hibernate依赖jar包

导入lib/required下所有的jar

导入数据库的驱动jar包

日志相关jar包

将hibernate/project/etc/log4j.properties文件导入到工程src下.

3.5. 创建映射文件

映射配置文件主要是用于描述实体类与数据表之间的映射关系。

位置:要与实体类在同一个包下.

名称:类名.hbm.xml

约束:hibernate核心jar包下的org.hibernate包下hibernate-mapping-3.0.dtd文件中查找

3.6. 创建hibernate核心配置文件

它主要是hibernate框架所使用的,它主要包含了连接数据库相关信息,hibernate相关配置等。

位置:在src下创建一个hibernate.cfg.xml

约束:

约束文件所在位置:hiberante核心jar包下的org.hibernate包下

在这个文件中如何配置?

可以参考 hibernate-release-5.0.7.Final\project\etc\hibernate.properties文件

3.7. 编写测试代码

3.8. Hibernate工作原理总结

hibernate工作原理:

1、通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件。 2、由hibernate.cfg.xml中的<mappingresource="xx/xx/xxx.hbm.xml"/>读取解析映射信息。

3、通过config.buildSessionFactory();//得到sessionFactory。

4、sessionFactory.openSession();//得到session。

5、session.beginTransaction();//开启事务。

6、persistentoperate;

7、session.getTransaction().commit();//提交事务

8、关闭session;

9、关闭sessionFactory;

4. Hibernate配置详解

4.1. 核心配置文件配置

对于hibernate的核心配置文件它有两种方式:

  1. hibernate.cfg.xml
  2. hibernate.properties

我们在开发中使用比较多的是hibernate.cfg.xml这种方式,原因它的配置能力更强,易于修改

我们主要讲解的是hibernate.cfg.xml配置

1.可以加载数据库相关信息

2.hibernate相关配置

3.加载映射配置文件

对于hibernate.cfg.xml配置文件中的内容可以参考hibernate/project/etc/hibernate.properties的配置

配置这个属性后,我们可以进行表的自动创建

Create-drop 每次都会创建一个新的表,执行完成后删除。一般在测试中使用

Create 每次都会创建一个新的表,一般是在测试中使用

update 如果数据库中有表,不创建,没有表创建,如果映射不匹配,会自动更新表结构(只能添加)

validate 只会使用存在的表,并且会对映射关系进行校验.

4.2. 映射文件配置

映射配置文件它的名称是类名.hbm.xml,它一般放置在实体类所在的包下。

这个配置文件的主要作用是建立表与类的映射关系。

1.统一声明包名,这样在<class>中就不需要写类的全名

2.关于<class>标签配置

name属性:类的全名称

table 表的名称,可以省略,这时表的名称就与类名一致 catalog属性:数据库名称 可以省略.如果省略,参考核心配置文件中url路径中的库名称

3.关于<id>标签

首先它必须存在。<id>是用于建立类中的属性与表中的主键映射。

name 类中的属性名称

column 表中的主键名称 column它也可以省略,这时列名就与类中属性名称一致

length 字段长度

type属性 指定类型

<generator>它主要是描述主键生成策略.

4.关于<property>标签

它是描述类中属性与表中非主键的映射关系

关于hibernate的映射文件中类型问题

对于type属性它的取值,可以有三种:

  1. java中的数据类型
  2. hibernate中的数据类型
  3. SQL的数据类型

默认是hibernate中数据类型

5. Hibernate常用API介绍

5.1. Configuration

它主要是用于加载hibernate配置.

Configuration config=newConfiguration().config(); 主要加载src下的hibernate.cfg.xml

Configuration config=new Configuration();主要加载的src下的hibernate.properties

Configuration config=newConfiguration().config(核心配置文件名称);加载指定的名称的配置文件

问题:我们是在hibernate.cfg.xml文件中有xxx.hbm.xml文件的位置。如果我们使用的是hibernate.properties这种核心配置,它如何加载映射配置?

5.2. sessionFactory

首先SessionFactory它的获取是通过Configuration得到。

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

通过SessionFactory可以得到Session.

是从连接池中获取一个连接。

获取一个与线程绑定的Session.

SessionFactory它不是轻量级的,不要频繁创建关闭它。在一个项目中有一个SessionFactory就可以,通过SessionFactory来获取Session进行操作。

问题:怎样可以保证在一个项目中所使用的SessionFactory是同一个哪?

SessionFactory内部还维护了一个连接池,如果我们要想使用c3p0连接池,应该怎样处理?

1.我们要导入c3p0的相关jar包

在hibernate/lib/options下有关于c3p0连接池jar包

2.在hibernate.cfg.xml文件中配置c3p0连接

可以查看etc/hibernate.properties中关于c3p0的配置

5.3. Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。

问题:我们如何解决session的安全问题?

我们只需要在方法内部来使用Session就可以。

问题:Session如何获取到?

SessionFactory.openSession(); 相当于直接通过SessionFactory创建一个新的Session,使用完成后要手动调用close来关闭。

SessionFactory.getCurrentSession();获取一个与线程绑定的Session,当我们提交或事务回滚后会自动关闭。

Session常用的方法:

save 保存对象

update修改操作

delete删除

get/load根据id进行查询

savenOrUpdate执行save或update操作

createQuery()获取一个Query对象

CreateSQLQUery()获取一个可以操作sql的SQLQuery对象

createCriteria()获取一个Criteria它可以完成条件查询

5.4. Transaction

Transaction接口主要用于管理事务,它是hibernate的事务接口,对底层的事务进行了封装。使用它可以进行事务操作。

commit 事务提交

rollback 事务回滚

问题:如果获取一个Transaction对象

Session.beginTransaction();

问题:如果在程序中没有开启事务,是否存在事务?

有事务,session的每一个操作就会开启一个事务。

默认情况下事务是不会自动提交的。

默认不自动提交

事务自动提交.

5.5. Query

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

通过Query主要完成查询操作.

我们通过Query可以执行hql语句.

Query query=Session.createQuery(hql);

下面这个可以执行sql语句

SQLQUery sqlQuery=Session.createSQLQuery(sql);

SQLQuery是Query的子.

查询所有操作---使用HQL

分页查询

查询指定列信息

Select name ,address from Customer; 得到的是List<Object[]>结果

要想得到List<Customer>结果

  1. 在Customer类中生成以name,address为参数的构造,注意,无参数构造也要有。
  2. Select newCustomer(name,address) from Customer;

条件查询

可以使用where关键字

无名称参数 from Customer where name=?

对其进行赋值 query.setParameter(0,”张三”)

有名称参数 from Customer where name=:myname;

对其进行赋值 query.setParameter(“myname”,”李四”);

如果查询结果可以保证就是唯一 的,我们可以使用

query. uniqueResult()来得到一个单独对象.

SQLQuery

要想执行本地sql

SQLQuery sqlQuery=session.createSqlQuery(Stringsql);

使用addEntity方法来将结果封装到指定的对象中,如果不封装,得到的是List<Object>

如果sql中有参数,我们使用setParameter方法完成参数传递。

如果结果就是一个可以使用uniqueResult()来得到一个单独对象。

5.6. Criteria

Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。

首先我想使用Criteria,必须得到Criteria

Criteria criteria=Session.createCriteria()

查询所有操作

Session.createCriteria(实体类.class)得到一个Criteria对象,调用list查询所有

分页操作与query的方法一样

setFirstResult() setMaxResults()

条件查询

criteria.add(Restrictions.eq(“name”,”xxxx”));

criteria.add(Restrictions.or(Restricitons.eq(),Restrictions.list()…..))

我们使用Criteria可以更加面向对象去操作,它非常适合进行多条件组合查询。

推荐阅读目录

Java学习求职路线(资料、视频、源码、项目实战)

程序员用这5种方式学习编程最无效,停止这些可以少走弯路!

大学毕业刚培训完Java,没有经验怎么找工作呢?

⊙请问你知道什么是栈吗?

⊙看看你对队列的了解有多少?

⊙面试题68(加深你对栈的理解_让你知道什么是栈)

⊙来测试一下你对数据结构中的栈和队列的了解有多少?

⊙面试题63(链表,哈希表)

⊙ 请你对Java中树的了解有多少?

这个培训机构怎么?

JavaEE就业学习路线(给初学者以及自学者一个学习方向)?

Servlet实现一个简单的登录【验证码】功能

二维码生成源码

java学习微信讨论群

Spring学习笔记

Mybatis学习笔记

原文发布于微信公众号 - java学习(javaxxf)

原文发表时间:2018-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏施炯的IoT开发专栏

《101 Windows Phone 7 Apps》读书笔记-BABY NAME ELIMINATOR

课程内容 Ø本地数据库 Ø在应用程序中处理数据     Baby Name Eliminator是一种通过输入性格特征而获取婴儿名字的应用程序(我和我的妻...

19260
来自专栏Seebug漏洞平台

CVE-2017-16943 Exim UAF漏洞分析——后续

上一篇分析出来后,经过@orange的提点,得知了meh公布的PoC是需要特殊配置才能触发,所以我上一篇分析文章最后的结论应该改成,在默认配置情况下,meh提供...

43380
来自专栏james大数据架构

SQL SERVER 内存分配及常见内存问题 简介

一、问题: 1、SQL Server 所占用内存数量从启动以后就不断地增加:       首先,作为成熟的产品,内存溢出的机会微乎其微。对此要了解SQL SER...

365100
来自专栏杨建荣的学习笔记

PostgreSQL里面的一些命令小结

近两天总结了下PostgreSQL的基本操作命令,对PostgreSQL也有了一个基本的认识。 PostgreSQL的功能还是很丰富的,有序列,支持db lin...

75080
来自专栏腾讯大数据的专栏

网卡收包流程

0.前言 为提升信鸽基础服务质量,笔者就网络收包全流程进行了内容整理。 网络编程中我们接触得比较多的是socket api和epoll模型,对于系统内核和网卡驱...

2.3K140
来自专栏IT技术精选文摘

分布式事务原理与实践

事务简介 事务的核心是锁和并发,采用同步控制的方式保证并发的情况下性能尽可能高,且容易理解。这种方式的优势是方便理解;它的劣势是性能比较低。 计算机可以简单的理...

194100
来自专栏Java技术栈

75 道 BAJT 中高级 Java 面试题,你能答上几道?

整理了下 BATJ 关于 JAVA 的面试题目,大家参考下吧,希望对大家有所帮助,可以帮大家查漏不缺。

10520
来自专栏Seebug漏洞平台

CVE-2017-16943 Exim UAF漏洞分析--后续

作者:Hcamael@知道创宇404实验室 上一篇分析出来后,经过@orange的提点,得知了meh公布的PoC是需要特殊配置才能触发,所以我上一篇分析文章最后...

33060
来自专栏微信公众号:Java团长

75 道 BAJT 高级 Java 面试题,你能答上几道?

希望大家在每天闲暇之余学习其中几道题目,日积月累,去 BAJT 面试时,一切都水到渠成。

13320
来自专栏Python爬虫实战

MySQL 从零开始:08 番外:随机生成数据库数据

1、网页版:Generatedata1.1 预览1.2 功能介绍1.2.1 自定义数据集名称1.2.2 选择城市1.2.3 数据集1.2.4 导出类型1.2.5...

60030

扫码关注云+社区

领取腾讯云代金券