Java Web框架篇之MyBatis

Java Web系列文章汇总贴: Java Web知识总结汇总


MyBatis简介

是什么?
MyBatis是一款优秀的持久层框架,支持定制化SQL、存储过程以及高级映射。Mybatis消除了几乎所有的JDBC代码、手工设置参数以及获取结果集。Mybatis可以使用简单的XML或注解来配置和映射原生信息,
将接口和Java的POJOs(Plain Ordinary Java Objects,普通的Java对象)映射成数据库中的记录。

为什么?
ORM(Object Relational Mapping,对象关系映射)框架的实现,这样,开发者不需要再写繁琐的JDBC代码,也可以方便的处理数据库查询出来的结果集。

怎么做?
Mybatis逻辑结构如下图:
Java Web框架篇之MyBatis_第1张图片

层次结构如下:
Java Web框架篇之MyBatis_第2张图片

MyBatis执行步骤如下图:
Java Web框架篇之MyBatis_第3张图片

参考:
MyBatis的架构设计分析
MyBatis架构设计、执行流程等
Ibatis(MyBatis)框架之系统架构与映射原理


MyBatis之TypeHandler

无论是 MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型,如枚举转换为int存储到数据库中,从数据库中取出int值转换为枚举。

详细:
MyBatis枚举映射数据库int存储转换


MyBatis之Cache

MyBatis支持一级缓存,二级缓存特性,先后顺序如下:

二级缓存
一级缓存
数据库

一级缓存

即本地缓存,永久缓存,Mybatis自行控制缓存的读写删,在执行器(BaseExecutor)中使用,执行器是在SqlSessionFactory.openSession()后创建的SqlSession中执行SQL语句时创建的,所以一级缓存的生命周期等同于SqlSession,也就是说是Session级的缓存。此缓存默认开启。

配置文件为:


    //...
    
    //...

二级缓存

实现 org.mybatis.cache.Cache 接口都可以作为MyBatis的二级缓存;二级缓存的Cache对象由Configuration进行管理,而 每次构建SqlSessionFactory对象时都会创建新的Configuration对象,因此,二级缓存的生命周期与SqlSessionFactory是相同的。基于Mapper XML 配置,在创建每个MapperedStatement对象时,都会根据其所属的namespace名称空间,给其分配Cache缓存实例。

如果要实现 mybatis 的二级缓存,一般来说有如下两种方式:

  • 采用 mybatis 内置的 cache 机制。
  • 采用三方 cache 框架, 比如ehcache, oscache 等等.

其中,内置方式实现,配置文件为:

mybatis-config.xml配置:


    //...
    
    //...

xxx.mapper.xml配置:


Cache算法

Mybatis的所有Cache算法都是基于装饰器模式对PerpetualCache扩展增加功能。

  • FIFO:先入先出,基于LinkedList实现;
  • LRU:最近最少使用,基于LinkedHashMap实现,在put的时候,自动移除最少使用缓存对象;
  • SOFT:对Cache的value进行SoftReference包装;当缓存对象是Soft reference可达时,gc会向系统申请更多内存,而不是直接回收它,当内存不足的时候才回收它;
  • WEAK:对Cache的value进行WeakReference包装;WeakReference不会强制对象保存在内存中。它拥有比较短暂的生命周期,允许你使用垃圾回收器的能力去权衡一个对象的可达性。在垃圾回收器扫描它所管辖的内存区域过程中,一旦gc发现对象是weakReference可达,就会把它放到ReferenceQueue中,等下次gc时回收它。

参考:

Mybatis一二级缓存区别
Mybatis一级缓存实现
MyBatis的Cache机制完全解析
Mybatis二级缓存源码


Mybatis之分页

  • 1、内存分页
  • 2、sql分页
  • 3、拦截器分页

更多:
Mybatis四种分页方式


MyBatis之事务管理

  • 使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交
  • 使用MANAGED的事务管理机制,这种机制mybatis自身不会去实现事务管理,而是让程序的容器(JBOSS,WebLogic)来实现对事务的管理

参考:
深入理解MyBatis(七)—MyBatis事务
Mybatis事务管理的两种方式


扩展

JPA

是什么?
JPA(Java Persistence API,Java持久化API),定义了对象-关系映射(ORM)以及实体对象持久化的标准接口。

为什么?
1、简化现有JavaEE和JavaSE应用的对象持久化的开发工作
2、Sun希望整合ORM技术,实现持久化领域的统一

怎么做?
1、ORM映射元数据-对象与表之间的关系
2、JPA的API-操作实体对象,执行CURD操作
3、查询语言-面向对象

JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个。从功能上来说,JPA现在就是Hibernate功能的一个子集。JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现
参考:
JPA与Hibernate的关系

MyBatis与Hibernate对比

相同点:
1、基于ORM思想解决了对象与数据库表的映射问题
2、都是通过SessionFactoryBuider由XML配置文件生成SessionFactory,由SessionFactory 生成Session,由Session来开启执行事务和SQL(Structured Query Language,结构化查询语言)语句。
3、都支持JDBC(Java DataBase Connectivity,java数据库连接)和JTA(Java Transaction API,Java事务API(Application Programming Interface,应用程序编程接口))事务处理

不同点:
1、sql方面,mybaits通过mapper.xml维护映射结果,程序员手动编写sql相比hibernate自动生成hql(hibernate sql)更加灵活,sql调优更加容易(hibernate因为更好的封装性,开发效率提高的同时,sql语句调优要更费力,当然可以手动修改sql来优化,但是同时也会影响开发效率);hibernate的hql数据库移植性更好,体现在强壮性。hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂

2、缓存方面,mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制

更多:
Mybatis与Hibernate对比

TKmybatis

Mybatis不写Sql实现:
1、继承TKmybatis这个三方件中的Mapper/BaseMapper
2、实体类中进行JPA标注(@Entity、@Column、@Table等)
3、单表增删改查易行,多表关联查询待深入

TKmybatis重要思想:
1、通过SqlHelper.class,把代码转换成Mybatis需要的xml配置或内存模型等
2、执行Mybatis逻辑
3、通过SqlHelper工具类转换为目标xml,这个思想值得借鉴

MyBatis知识点

MyBatis常见题目总结

你可能感兴趣的:(Java,Web知识总结)