Hibernate学习

简述

持久层ORM框架

ORM:对象关系映射 类与表之间的映射(建立关系),操作对象相当于操作表(体现面向对象的思想)。

 

优点

1、减少重复性代码(数据库连接代码、sql语句)

2、ORM实现

3、映射灵活性

4、可扩展性,API开放

5、缓存

 

传统Web应用方式

Servlet+jsp+javabean+jdbc可以完成所有Web应用的开发,过于底层,开发效率低。

传统jdbc开发

UserDao{

public void save(User user){

Connection con = ... //定义连接对象

PreparedStatement stmt = .... //定义预编译对象

con = .. //获得连接

String sql = ... //编写sql语句

stmt = conn. //预编译

stmt=.setXXX(); // 传进来的类要进行修改时,设置的名字也要修改

stmt.excuteUpdate();

}

}

 

配置

1、创建表

2、创建pojo类

3、创建映射,最好与pojo类放在同一包下

 

4、创建配置文件

 

映射的配置详解

1、class标签的配置

标签用来建立类与表的映射关系

属性:

name :类的全路径

table :表名(类名与表名一致,table可以省略)

catalog :数据库名

2、id标签的配置

标签用来建立类中的属性与表中的主键的对应关系

属性:

name :类中的属性名

column :表中的字段名(类中的属性名和表中的字段名如果一致,column可以省略)

length :长度

type :类型

3、property标签的配置

标签用来建立类中的普通属性与表的字段的对应关系

属性:

name :类中的属性名

column :表中的字段名

length :长度

type :类型

not-null :设置非空

unique :设置唯一

 

Hibernate的核心配置方式

1、属性文件的方式

属性文件的方式不能引入映射文件(手动编写代码加载映射文件)

2、XML文件的方式(常用)

 

Hibernate组件详解

1、ConfigurationHibernate的配置对象

作用:

加载核心配置文件

hibernate.properties

  Configuration cfg = new Configuration();

 hibernate.cfg.xml

  Configuration cfg = new Configuration().configure();

加载映射文件

// 手动加载映射

configuration.addResource("com/itheima/hibernate/demo1/Customer.hbm.xml");

 

2、SessionFactory:Session工厂

SessionFactory内部维护了Hibernate的连接池和Hibernate的二级缓存。是线程安全的对象。一个项目创建一个对象即可。

配置连接池:

<!-- 配置C3P0连接池 -->

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

<!--在连接池中可用的数据库连接的最少数目 -->

<property name="c3p0.min_size">5</property>

<!--在连接池中所有数据库连接的最大数目  -->

<property name="c3p0.max_size">20</property>

<!--设定数据库连接的过期时间,以秒为单位,

如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->

<property name="c3p0.timeout">120</property>

 <!--3000秒检查所有连接池中的空闲连接 以秒为单位-->

<property name="c3p0.idle_test_period">3000</property>

 

3、 Session:类似Connection对象是连接对象

Session代表的是Hibernate与数据库的链接对象。不是线程安全的。与数据库交互桥梁。

Session中的API

 

保存方法:

Serializable save(Object obj);

 

查询方法:

T get(Class c,Serializable id);

T load(Class c,Serializable id);

get方法和load方法的区别?

 

 

修改方法

void update(Object obj);

 

删除方法

void delete(Object obj);s

 

保存或更新

void saveOrUpdate(Object obj)

 

查询所有

 

 

4、Transaction:事务对象

Hibernate中管理事务的对象。

api:

commit();

rollback();

 

Hibernate的持久化类的编写规则

无参数构造

属性私有

属性尽量使用包装类

提供一个唯一OID与主键对应

不要使用final修饰

 

Hibernate的主键生成策略

主键分类

  自然主键

  代理主键

主键生成策略

  increment

  identity

  sequence

  uuid

  native

  assigned

  foreign

 

持久化类三种状态(为了理解API)

瞬时态

没有唯一标识OID,没有被session管理

持久态

OID,被session管理

托管态

OID,没有被session管理

 

Hibernate的一级缓存

一级缓存:Hibernate优化手段,称为是session级别缓存,能自动更新数据库。

一级缓存:快照区

 

Hibernate的事务管理

Hibernate解决读问题

  配置设置隔离级别

 Hibernate解决Service事务

  保证连接对象一致:1、向下传递2、使用ThreadLocal对象(用于绑定线程),hibertnate内部采用的是线程绑定的方式

 

Hibernate的其他的API

Query HQL 面向对象方式的查询。

Criteria QBC 完成面向对象化。

SQLQuery SQL查询

 

Hibernate一对多关联映射

 

1、数据库表与表之间的关系

一对多关系

例:一个部门对应多个员工,一个员工只能属于某一个部门。

一对多的建表原则:在多的一方创建外键指向一的一方

多对多关系

例:一个学生可以选择多门课程,一门课程也可以被多个学生选择。

多对多的建表原则:创建中间表设置两字段指向多的双方。

 一对一关系(了解)

例:一个公司只能有一个注册地址,一个注册地址只能被一个公司注册。

一对一的建表原则:随便一方创建外键指向另一方

 

2、编码

 

1、创建数据库和表

2、 创建实体

3、创建映射文件

 

多的一方

 

一的一方

 

4、创建核心配置文件

 

Hibernate的一对多级联操作

1、场景:一对多关系只保存一边是否可以:

 

 

2、 一对多的级联操作解析

  1、什么叫做级联

级联指的是,操作一个对象的时候,是否会同时操作其关联的对象。

  2、级联是有方向性

操作一的一方的时候,是否操作到多的一方

操作多的一方的时候,是否操作到一的一方

 

3、 级联操作

  1、保存或更新

保存客户级联联系人

 

保存联系人级联客户

 

 

  2、级联删除

 删除客户级联删除联系人 

 

出现问题及解决方式

1、例子:一对多设置了双向关联产生多余的SQL语句

 

2、解决多余的SQL语句

单向维护:使一方放弃外键维护权,一的一方放弃。

在set上配置inverse=”true”

 

Hibernate的多对多关联映射

1、 创建表

2、创建实体

3、创建映射

用户的映射

 

 

角色的映射

 

 

 

Hibernate的查询的方式

1、OID查询

OID检索:Hibernate根据对象的OID(主键)进行检索

使用get方法

Customer customer = session.get(Customer.class,1l);

使用load方法

Customer customer = session.load(Customer.class,1l);

 

2、Hibernate的查询方式:对象导航检索

对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。

LinkMan linkMan = session.get(LinkMan.class,1l);

Customer customer  = linkMan.getCustomer();

 

Customer customer = session.get(Customer.class,2l);

Set<LinkMan> linkMans = customer.getLinkMans();

 

3、 Hibernate的查询方式:HQL检索

HQL查询:Hibernate Query LanguageHibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。

 

4、 Hibernate的查询方式:QBC检索

QBC查询:Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。

 

5、Hibernate的查询方式:SQL检索

 

延迟加载的概述

什么是延迟加载

延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。

 延迟加载的分类

1、类级别的延迟加载

指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);

类级别延迟加载通过<class>上的lazy进行配置,如果让lazy失效

lazy设置为false

将持久化类使用final修饰

 Hibernate. Initialize()

2、关联级别的延迟加载

指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。

Customer customer = session.get(Customer.class,1l);

customer.getLinkMans();----通过客户获得联系人的时候,联系人对象是否采用了延迟加载,称为是关联级别的延迟。

抓取策略往往会和关联级别的延迟加载一起使用,优化语句。

 

 抓取策略

1、抓取策略的概述

通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么样格式通过策略进行配置。

通过<set>或者<many-to-one>上通过fetch属性进行设置

fetch和这些标签上的lazy如何设置优化发送的SQL语句

2、 <set>上的fetchlazy

fetch:抓取策略,控制SQL语句格式

select :默认值,发送普通的select语句,查询关联对象

 join :发送一条迫切左外连接查询关联对象

subselect :发送一条子查询查询其关联对象

 lazy:延迟加载,控制查询关联对象的时候是否采用延迟

true :默认值,查询关联对象的时候,采用延迟加载

 false :查询关联对象的时候,不采用延迟加载

extra :及其懒惰。

在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

 3、<many-to-one>上的fetchlazy

fetch :抓取策略,控制SQL语句格式。

 select :默认值,发送普通的select语句,查询关联对象。

join :发送一条迫切左外连接。

 lazy :延迟加载,控制查询关联对象的时候是否采用延迟。

 proxy :默认值,proxy具体的取值,取决于另一端的<class>上的lazy的值。

 false :查询关联对象,不采用延迟。

no-proxy :(不会使用)

在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

 

批量抓取

 什么是批量抓取:一批关联对象一起抓取,batch-size

 

转载于:https://www.cnblogs.com/kyuusan/p/11048863.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值