MyBatis(十):逆向工程和分页插件

MyBatis 生态成熟,支持很多实用插件,大大提高了开发效率,下面将介绍其中常用的逆向工程和分页插件。

逆向工程(MyBatis Generator)

  • 正向工程:先创建 Java 实体类,由框架负责根据实体类生成数据库表,Hibernate 就支持这种正向工程。

  • 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:

    • Java 实体类
    • Mapper 接口
    • Mapper 映射文件

逆向工程实际是一种代码生成器,能减少程序员的工作量。

  1. 引入依赖

    <!-- 控制Maven在构建过程中相关配置 -->
    <build>
        <!-- 构建过程中用到的插件 -->
        <plugins>
            <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.0</version>
                <!-- 插件的依赖 -->
                <dependencies>
                    <!-- 逆向工程的核心依赖 -->
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.2</version>
                    </dependency>
                    <!-- MySQL驱动 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.16</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    
  2. 创建 mybatis 的核心配置文件

  3. 创建逆向工程的核心配置文件,文件名必须是 generatorConfig.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        <!--
        targetRuntime: 执行生成的逆向工程的版本
        MyBatis3Simple: 生成基本的CRUD(清新简洁版)
        MyBatis3: 生成带条件的CRUD(奢华尊享版)
        -->
        <context id="DB2Tables" targetRuntime="MyBatis3Simple">
            <!-- 数据库的连接信息 -->
            <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                            connectionURL="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"
                            userId="root"
                            password="root">
            </jdbcConnection>
            <!-- javaBean的生成策略-->
            <javaModelGenerator targetPackage="site.penghao.mybatis.mbg.pojo"
                                targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
            <!-- SQL映射文件的生成策略 -->
            <sqlMapGenerator targetPackage="site.penghao.mybatis.mbg.mapper"
                             targetProject=".\src\main\resources">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
            <!-- Mapper接口的生成策略 -->
            <javaClientGenerator type="XMLMAPPER"
                                 targetPackage="site.penghao.mybatis.mbg.mapper" targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true"/>
            </javaClientGenerator>
            <!-- 逆向分析的表 -->
            <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
            <!-- domainObjectName属性指定生成出来的实体类的类名 -->
            <table tableName="t_emp" domainObjectName="Emp"/>
            <table tableName="t_user" domainObjectName="User"/>
        </context>
    </generatorConfiguration>
    
  4. 在 Maven 窗口选择运行 MyBatis Generator

    image-20230417175716012

分页插件

SQL 查询常常需要实现分页:select ... limit index, pageSize。通过 MyBatis 插件可以方便地实现分页功能。

  1. 添加依赖

    <!--分页插件-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.3.2</version>
    </dependency>
    
  2. 设置分页插件

    在 MyBatis 的核心配置文件中配置插件。

    <plugins>
        <!--分页插件,interceptor 意为「拦截器」-->
        <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
    </plugins>
    
  3. 测试分页插件

    public void testPage() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Page<Object> page = PageHelper.startPage(1, 4);
        mapper.selectByExample(null);
        System.out.println(page); // Page 继承了 ArrayList 类,在查询得到结果时,插件会将结果赋到 Page
    }
    
    Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=5, pages=2, reasonable=false, pageSizeZero=false}[site.penghao.mybatis.mbg.pojo.Emp@5e3a39cd, site.penghao.mybatis.mbg.pojo.Emp@21f9277b, site.penghao.mybatis.mbg.pojo.Emp@201aa8c1, site.penghao.mybatis.mbg.pojo.Emp@5d58c727]
    

    可以看到,page 对象除了包含查询到的对象,还有分页的各种信息。另外,还可以通过 PageInfo 类进一步地获取导航栏相关信息:

    PageInfo<Object> pageInfo = new PageInfo<>(page); // 这里传入的
    System.out.println(pageInfo);
    
    PageInfo{pageNum=1, pageSize=4, size=4, startRow=1, endRow=4, total=5, pages=2, list=Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=5, pages=2, reasonable=false, pageSizeZero=false}[site.penghao.mybatis.mbg.pojo.Emp@5e3a39cd, site.penghao.mybatis.mbg.pojo.Emp@21f9277b, site.penghao.mybatis.mbg.pojo.Emp@201aa8c1, site.penghao.mybatis.mbg.pojo.Emp@5d58c727], prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=8, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]}
    

小结

  • MyBatis 逆向工程能根据数据库表字段自动生成 bean 实体类和对应的 mapper 类、mapper 配置类。
  • 分页插件大大简化了分页功能的开发,它通过拦截器实现。