Java持久层框架整理

一:MyBatis框架

MyBatis介绍

 

  • Batista 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis
  • MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码
  • Mybatis通过xml或注解的方式将要执行的statement配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

Mybatis架构图:

Java持久层框架整理

MyBatis配置及操作详解:

**mybatis配置

  • SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
  • mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  1. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
  2. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
  3. mybatis底层自定义了Executor接口操作数据库,Executor接口有两个实现,一个是基本实现、一个是缓存实现。
  4. Mapped Statement也是mybatis一个底层对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
  5. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过 
  6. Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。 

SqlSession

  1.    SqlSession是一个接口,默认使用DefaultSqlSession实现类,sqlSession中定义了数据库操作
  2. SqlSession中封装了对数据库的sql操作,如:查询、插入、更新、删除等。
  3. 通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。

SqlSessionFactoryBuilder:

     SqlSessionFacoty是通过SqlSessionFactoryBuilder进行创建,SqlSessionFactoryBuilder只用于创建SqlSessionFactory,可以当成一个工具类,在使用时随时拿来使用不需要特殊处理为共享对象。

SqlSessionFactory:

    SqlSessionFacoty是通过SqlSessionFactoryBuilder进行创建,SqlSessionFactoryBuilder只用于创建SqlSessionFactory,可以当成一个工具类,在使用时随时拿来使用不需要特殊处理为共享对象。

 Namespace的作用

    命名空间除了对sql进行隔离,mybatis中对命名空间有特殊的作用,用于定义mapper接口地址。

SqlMapConfig.xml:

SqlMapConfig.xml中配置的内容和顺序如下:

  1. properties(属性):
  2. settings(配置)
  3. typeAliases(类型别名)
  4. typeHandlers(类型处理器)
  5. objectFactory(对象工厂)
  6. plugins(插件)
  7. environments(环境集合属性对象)
  8. environment(环境子属性对象)
  9. transactionManager(事务管理)
  10. dataSource(数据源)
  11. mappers(映射器)

Mapper.xml:

Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。

缓存:

  •  一级缓存:Mybatis一级缓存的作用域是同一个SqlSession。
  • Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。
  • Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

二级缓存:

  • Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。
  • 二级缓存是可以跨SqlSession的。
  • 开启二级缓存
  1. 在核心配置文件SqlMapConfig.xml中加入

       <setting name="cacheEnabled" value="true"/>

 

描述

允许值

默认值

cacheEnabled

对在此配置文件下的所有cache 进行全局性开/关设置。

true false

true

     2.要在你的Mapper映射文件中添加一行:  <cache /> 

     3.在select语句中useCache=false可以禁用当前的语句的二级缓存,即每次查询夸session 的查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。

二:Hibernate框架

  • Hibernate就是一个持久层的ORM的框架

  • ORM :Object Relational Mapping.对象关系映射.

  • javaBean -config.xml--数据库(三者映射)

Hibernate的优点:

  1. 简化JDBC的编程.
  2. 修改了实体类,不需要修改源代码.
  3. 轻量级的框架.

Hibernate的执行流程 图:

Java持久层框架整理

流程说明:首先创建Configuration类的实例,并通过它来读取并解析配置文件hibernate.cfg.xml。然后创建SessionFactory读取解析映射文件信息,并将Configuration对象中的所有配置信息拷贝到SessionFactory内存(一级缓存级别)中。接下来,打开Session,让SessionFactory提供连接,并开启一个事务,之后创建对象,向对象中添加数据,通过session.save()方法完成向数据库中保存数据的操作。最后提交事务,并关闭资源。

 

持久化类

  • 持久化类指的是一个Java类与数据库表建立了映射关系.这个类称为是持久化类。
  • *持久化类=Java类+映射文件,
  • 持久化类要有一个唯一标识叫做OID与表的主键对应。
  • 持久化类不要使用final进行修饰。
  • 持久化对象的三种状态:瞬时状态(Transient:没有持久化表示,没有被session管理)、持久状态(Persistent:有持久化标识,且被session管理)、托管状态(Detached:有持久化标识,没有被session管理了)
  • 持久化对象的三种状态的区别:此对象与session是否有关系,且与表中主键对应。
  •  Hibernate的持久态对象可以提高查询效率和自动更新数据库。

主键生类型和成策略

  1. 自然主键:对象本身中有一个属性作为表的主键。
  2. 代理主键:不是使用对象本身中的属性作为表的主键.尽量多使用代理主键。

主键生成策略

Java持久层框架整理

 

Hibernate一级缓存

Hibernate框架*有两级缓存. Session级别的缓存是属于一级缓存,SessionFactory级别的缓存是二级缓存.

缓存:将数据库或硬盘中的数据,存入到内存中.当下次使用的时候可以从内存中获得,减少数据库访问次数.(优化性能)

Hibernate检索方式:

  1. HQL检索:Hibernate查询语言,语法与SQL类似(Query对象.createQuery(Str sql))。
  2. QBC检索:条件查询,更加面向对象的查询方式(Criteria criteria = session.createCriteria(Customer.class);

hibernate对 session的管理:

1. Session 对象的生命周期与本地线程绑定。

2. Session 对象的生命周期与 JTA 事务绑定。

3. Hibernate 委托程序管理 Session 对象的生命周期。

  • JPA:

 全称是:Java PersistenceAPI。是SUN公司推出的一套基于ORM的规范。hibernate框架中提供了JPA的实现。

JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA框架中支持大数据集、事务、并发等容器级事务

hibernate中有自己的独立ORM操作数据库方式,也有JPA规范实现的操作数据库方式。