MyBatis-实用扩展

Mybatis-实用扩展

mapper包扫描

在配置mapper.xml时,我们需要在mybatis-config文件夹下使用mappers -> mapper标签配置每一条mapper.xml

<mappers>
    <!-- Mapper注册:指定Mybatis映射文件的具体位置 -->
    <!-- mapper标签:配置一个具体的Mapper映射文件 -->
    <!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 -->
    <!--    对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 -->
    <mapper resource="mapper/EmployeeMapper.xml"/>
</mappers>

我们可以通过包扫描的方式,批量添加mapper.xml文件,但这样做有几个要求:

  • 要求mapper.xml和mapper接口的名字必须相同
  • 要求编译后的mapper.xml和mapper接口在同一个文件夹下
    • 解决这个问题的最好方案就是在resources文件夹下建立相同的文件结构

想要一次性创建多层目录结构,使用分隔符不再是 . 而是 /

mapper包扫描.png

<mappers>
    <package name="com.xiaobai.mapper"/>
</mappers>

PageHelper插件

MyBatis 的插件机制包括以下三个组件:

  • Interceptor(拦截器):定义一个拦截方法 intercept,该方法在执行 SQL 语句、执行查询、查询结果的映射时会被调用

  • Invocation(调用):实际上是对被拦截的方法的封装,封装了 Object targetMethod methodObject[] args 这三个字段

  • InterceptorChain(拦截器链):对所有的拦截器进行管理,包括将所有的 Interceptor 链接成一条链,并在执行 SQL 语句时按顺序调用

我们使用的pagehelper插件在Interceptor之中,拦截sql语句并拼接代码


当时我们前端工程化的微头条项目中用servlet手搓了分页:笔记 -> 前端工程化 -> 微头条项目开发 -> 分页

Mybatis提供了很多Sql追加插件,其中最著名的就是PageHelper插件

pagehelper/Mybatis-PageHelper: Mybatis通用分页插件 (github.com)

分页的limit大概为:

通过pageNum(当前页码数)和pageSize(每页显示数量)来计算limit所需要的参数:

(PageNum() - 1) * PageSize();// limit参数1:从第几条参数(用页码*每页数据量)
PageSize();// limit参数2:返回多少条数据

而PageHelper会接手这个过程,只需要提供pageNum和pageSize,PageHelper会自动生成limit语句并拼接在原有的sql之后


配置环境

在maven中添加pagehelper依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>${pagehelper.version}</version>
</dependency>

在mybatis配置文件(mybatis-config.xml)中添加插件

在配置文件的dtd中,我们可以看到各个标签的先后顺序,plugin标签在environment标签之前

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!--分页插件的拼接方式为mysql-->
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

使用方法

mapper中的sql语句正常书写

注:不要加limit关键字,并且不能以分号结尾

<select id="queryAll" resultType="Employee">
    select *
    from t_emp
</select>

使用时,调用PageHelper.startPage方法将pageNum和pageSize参数传入

注:在startPage和PageInfo中只能有一条查询语句,不能将两条查询sql装载到同一个分页插件中去

查询后,将查询数据封装到PageInfo实体类中

在之前的学习中,我们使用vo对象来接受分页五大件的所有信息,现在我们使用PageInfo实体类来接收

@Test
public void test(){
    EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
    // 配置pageNum和pageSize
    PageHelper.startPage(1,2);
    
    List<Employee> employees = mapper.queryAll();
    // 使用PageInfo实体类封装分页五大件
    PageInfo<Employee> pageInfo = new PageInfo<>(employees);
}

PageHelper的开发者是国人,所以我们直接在idea中下载PageInfo类的源码即可查看其中获取数据的方法和中文注释!!! 😊


逆向工程和MybatisX插件

ORM思维我们在JDBC的学习中曾经提到过,是对象到关系数据库的映射思想

Mybatis就是一个ORM思维的持久性框架,使用面向对象思维进行数据库操作


半自动和全自动

hibernate就是典型的全自动ORM框架,程序员做ORM的配置文件映射,由框架生成sql语句

mybatis就是半自动ORM框架,虽然提供了crud的方法,但需要程序员手写sql语句

时代发展如今,人们期望半自动ORM框架也能实现单表的crud自动生成,这个工程就是逆向工程

在后面回学习mybatis-plus,其中就包含单表crud的mapper

注:无论是mybatis-plus还是逆向工程,都是针对单表的crud


MyBatisX插件
  • 这个插件在idea中安装,且idea默认不带这个插件

  • 安装后用idea连接数据库

  • 选择表右键使用MyBatisX插件逆向工程生成文件

MybatisX.png

MybatisX2.png

至此,单表的增删改查和实体类全部被生成