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架构图:
MyBatis配置及操作详解:
**mybatis配置
- SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
- mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
- 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
- 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
- mybatis底层自定义了Executor接口操作数据库,Executor接口有两个实现,一个是基本实现、一个是缓存实现。
- Mapped Statement也是mybatis一个底层对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
- Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过
- Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
SqlSession:
- SqlSession是一个接口,默认使用DefaultSqlSession实现类,sqlSession中定义了数据库操作
- SqlSession中封装了对数据库的sql操作,如:查询、插入、更新、删除等。
- 通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。
SqlSessionFactoryBuilder:
SqlSessionFacoty是通过SqlSessionFactoryBuilder进行创建,SqlSessionFactoryBuilder只用于创建SqlSessionFactory,可以当成一个工具类,在使用时随时拿来使用不需要特殊处理为共享对象。
SqlSessionFactory:
SqlSessionFacoty是通过SqlSessionFactoryBuilder进行创建,SqlSessionFactoryBuilder只用于创建SqlSessionFactory,可以当成一个工具类,在使用时随时拿来使用不需要特殊处理为共享对象。
Namespace的作用:
命名空间除了对sql进行隔离,mybatis中对命名空间有特殊的作用,用于定义mapper接口地址。
SqlMapConfig.xml:
SqlMapConfig.xml中配置的内容和顺序如下:
- properties(属性):
- settings(配置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象)
- environment(环境子属性对象)
- transactionManager(事务管理)
- dataSource(数据源)
- 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的。
- 开启二级缓存:
- 在核心配置文件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的优点:
- 简化JDBC的编程.
- 修改了实体类,不需要修改源代码.
- 轻量级的框架.
Hibernate的执行流程 图:
流程说明:首先创建Configuration类的实例,并通过它来读取并解析配置文件hibernate.cfg.xml。然后创建SessionFactory读取解析映射文件信息,并将Configuration对象中的所有配置信息拷贝到SessionFactory内存(一级缓存级别)中。接下来,打开Session,让SessionFactory提供连接,并开启一个事务,之后创建对象,向对象中添加数据,通过session.save()方法完成向数据库中保存数据的操作。最后提交事务,并关闭资源。
持久化类:
- 持久化类指的是一个Java类与数据库表建立了映射关系.这个类称为是持久化类。
- *持久化类=Java类+映射文件,
- 持久化类要有一个唯一标识叫做OID与表的主键对应。
- 持久化类不要使用final进行修饰。
- 持久化对象的三种状态:瞬时状态(Transient:没有持久化表示,没有被session管理)、持久状态(Persistent:有持久化标识,且被session管理)、托管状态(Detached:有持久化标识,没有被session管理了)
- 持久化对象的三种状态的区别:此对象与session是否有关系,且与表中主键对应。
- Hibernate的持久态对象可以提高查询效率和自动更新数据库。
主键生类型和成策略:
- 自然主键:对象本身中有一个属性作为表的主键。
- 代理主键:不是使用对象本身中的属性作为表的主键.尽量多使用代理主键。
主键生成策略:
Hibernate一级缓存:
Hibernate框架*有两级缓存. Session级别的缓存是属于一级缓存,SessionFactory级别的缓存是二级缓存.
缓存:将数据库或硬盘中的数据,存入到内存中.当下次使用的时候可以从内存中获得,减少数据库访问次数.(优化性能)
Hibernate检索方式:
- HQL检索:Hibernate查询语言,语法与SQL类似(Query对象.createQuery(Str sql))。
- 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规范实现的操作数据库方式。