mybatis知识

Spring整合Mybatis

2018-08-27  本文已影响153人  ZMRWEGo

一 、 Mybatis概览

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

1. Mybatis的框架设计

MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架


mybatis框架图
接口层

Mybatis和数据库交互的两种方式:

上述使用MyBatis 的方法,是创建一个和数据库打交道的SqlSession对象,然后根据Statement Id 和参数来操作数据库,这种方式固然很简单和实用,但是它不符合面向对象语言的概念和面向接口编程的编程习惯。由于面向接口的编程是面向对象的大趋势,MyBatis 为了适应这一趋势,增加了第二种使用MyBatis 支持接口(Interface)调用方式。

然后编写对应接口文件

  public interface RandomGener_Dao {
//搜索tag不为1的id
 Integer selectUnusingId();
//更新tag 为1
void updateId(@Param("id") Integer id);
}

根据MyBatis 的配置规范配置好后,通过SqlSession.getMapper(XXXMapper.class) 方法,MyBatis 会根据相应的接口声明的方法信息,通过动态代理机制生成一个Mapper 实例,我们使用Mapper 接口的某一个方法时,MyBatis 会根据这个方法的方法名和参数类型,确定Statement Id,底层还是通过SqlSession.select("statementId",parameterObject);或者SqlSession.update("statementId",parameterObject); 等等来实现对数据库的操作。

数据处理层

数据处理层是Mybatis 的核心,它主要完成三个功能:

框架支撑层
引导层

引导层是配置和启动MyBatis 配置信息的方式。MyBatis 提供两种方式来引导MyBatis :基于XML配置文件的方式和基于Java API 的方式,我们将在下面介绍spring整合mybatis的配置信息。

2. Mybatis的主要构件及相互关系

mybatis的主要核心部件:

组件 说明
SqlSession 每一个SqlSession实例代表应用程序和数据库的一次连接 ,每次打开一个SqlSession都会绑定一个事务管理实例,执行器实例。
Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
MappedStatement MappedStatement维护了一条<select update delete insert>节点的封装
Configuration MyBatis所有的配置信息都维持在Configuration对象之中。

二、Spring整合mybatis

1. 配置Mybatis

配置文件中的注释对各个节点的作用进行了详细的说明
编写一个测试类生成对应的pojo类和mapper文件

public class Mbg {
public static void main(String[] args) throws Exception {
    List<String> warnings = new ArrayList<>();
    boolean overwrite = true;
    File configFile = new File("E:mbg.xml");
    ConfigurationParser cp = new ConfigurationParser(warnings);
    Configuration configuration = cp.parseConfiguration(configFile);
    //是否覆盖已有的文件
    DefaultShellCallback callback = new DefaultShellCallback(overwrite);
    MyBatisGenerator generator = new MyBatisGenerator(configuration,callback,warnings);
    generator.generate(null);
    Logger logger = LogManager.getLogger("info");
    logger.info("mybatis逆向生成工具完成任务");
    }
}

三、pageHelper分页工具

pagehelper是一款由国人编写的开源免费的mybatis第三方物理插件,我们可以在github上看到它的源码,下面我们介绍一下mybatis的基本使用以及它的实现原理。

1. PageHelper的配置

引入maven依赖

 <!--分页工具-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.0.0</version>
    </dependency>

将pagehelper整合到mybatis中

 <!--配置分页插件-->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
    <!--指定数据库-->
        <property name="dialect" value="mysql" />
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样 -->
<property name="offsetAsPageNum" value="false" />
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true" />

<!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
<!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型) <property name="pageSizeZero" value="true"/> -->

<!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="true" />
<!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
<!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
<!-- 不理解该含义的前提下,不要随便复制该配置 <property name="params" value="pageNum=start;pageSize=limit;"/> -->
    </plugin>
</plugins>

2. PageHelper原理分析

pagehelper通过mybatis的plugin实现了interceptor接口

分页实现过程
实现原理:
pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息
所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句
关于pagehelper的更详细的实现,可以查看这篇博文
上一篇 下一篇

猜你喜欢

热点阅读