Bootstrap

MyBatis三剑客


 

mybatis三剑客

  • MyBatis Generator  mybatis逆向工程,根据数据表自动生成实体类、mapper接口、xml映射文件
  • MyBatis-Plugin  IDEA插件,可以实现mapper接口方法、xml映射文件元素之间的快速跳转
  • MyBatis-PageHelper  mybatis的分页组件

 

MyBatis Generator(MBG 代码生成器)

方式一 maven插件(推荐)

1、pom.xml中添加mbg的maven插件

<build>
    <plugins>
    
    	<!-- mbg的插件 -->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
            <configuration>
                <!-- 覆盖同名文件 -->
                <overwrite>true</overwrite>
            </configuration>
        </plugin>
        
    </plugins>
</build>

 
2、resources下新建mbg的配置文件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>
    <!--  数据库驱动的jar包 -->
    <classPathEntry location="F:/maven/repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar" />

    <!-- context配置环境 -->
    <context id="myMBG" targetRuntime="MyBatis3">

        <!-- xml文件不追加。配置同名文件覆盖时,默认只覆盖mapper接口、实体类,xml映射文件会以追加方式写入 -->
        <!-- 使用此插件后,不管生成多少次,同名xml映射文件都是直接覆盖 -->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"></plugin>

        <!--配置生成的注释-->
        <commentGenerator>
            <!-- 去掉方法注释,默认会生成大量的方法说明注释,很不友好  -->
            <property name="suppressAllComments" value="true"/>
            <!-- 去掉注释中的时间戳 -->
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!-- 数据库连接信息 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/db_user?serverTimezone=UTC"
                        userId="chy"
                        password="abcd">
        </jdbcConnection>

        <!-- 配置表字段、java之间的类型转换-->
        <javaTypeResolver >
            <!-- 是否将Numeric、Decimal全部转换为BigDecimal类型,设置为false,会根据表字段的长度转换响应的类型,Short  <5,Integer 5~9,Long 10~18,BigDecimal  >18  -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- 配置pojo类的生成规则,主要配置实体类存放的包、该包的位置 -->
        <!-- mapper、实体类这些包、文件夹不需要我们手动创建,会自动创建 -->
        <javaModelGenerator targetPackage="com.chy.mall.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <!-- 是否去掉String两端的空格,这个可要可不要,缺省时默认为false -->
            <!--<property name="trimStrings" value="true" />-->
        </javaModelGenerator>

        <!-- 配置xml映射文件的生成规则 -->
        <sqlMapGenerator targetPackage="mapper"  targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- 配置mapper接口的生成规则 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.chy.mall.dao"  targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!-- 配置要使用的数据表,需要配置mapper接口、映射文件名以及实体类名,不然tb_user生成的默认是TbUserMapper、TbUser -->
        <!-- 默认会生成大量的example相关的东西,不需要,禁用所有的example选项 -->
        <!-- 字段会自动完成映射,比如user_id会自动映射为userId -->
        <table tableName="tb_user" mapperName="UserMapper" domainObjectName="User" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false" selectByExampleQueryId="false" />
        <table tableName="tb_permission" mapperName="PermissionMapper" domainObjectName="Permission" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false" selectByExampleQueryId="false" />

    </context>
</generatorConfiguration>

执行插件时默认加载资源根目录下的generatorConfig.xml,文件名不能是其它的。

数据库驱动添加到classpath中都不行,必须要在配置文件中指定路径。
 

3、执行maven插件mybatis-generator,生成文件

 

方式二 maven依赖

1、pom.xml中添加mbg的依赖(需要数据库驱动、mybatis依赖)

<!-- 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.19</version>
</dependency>

<!-- mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.4</version>
</dependency>

<!-- mbg -->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.6</version>
</dependency>

 

2、resources下新建mbg的配置文件generatorConfig.xml

  • 文件名任意,因为是在java代码中指定mbg配置文件的位置。
  • 配置文件内容和方式一的相同,只是不需要指定数据库驱动的路径。
<!--  数据库驱动的jar包 -->
<!--<classPathEntry location="F:/maven/repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar" />-->

 
3、新建并执行主类,生成代码

package test;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class Test {
    
    public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
        List<String> warnings = new ArrayList<String>();
        //生成文件时如果已存在同名文件,会覆盖
        boolean overwrite = true;
        //指定mbg配置文件的位置
        InputStream configFile = Test.class.getResourceAsStream("/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }

}

 

MyBatis-Plugin mapper接口、xml映射文件之间的跳转

IDEA的一个插件,可以实现mapper接口中的方法、xml映射文件中相应元素之间的快速定位。

直接搜索 mybatis plugin ,安装下载次数最多的那个,目前该插件全名是 Free MyBatis plugin。

 

MyBatis-PageHelper 分页

国人开源的mybatis分页组件,方便易用,兼容多种主流数据库,实现了分页查询的数据库无关性。
 

pom.xml

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version>
</dependency>

<!--springboot项目也可以使用下面的依赖-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.3</version>
</dependency>

 
service

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 分页查询
     *
     * @param pageNum  页码
     * @param pageSize 每页条数
     * @param userQo 查询条件
     * @return 分页数据
     */
    public Page<UserPo> page(int pageNum, int pageSize, UserQo userQo) {
        Page<UserPo> page = PageMethod.startPage(pageNum, pageSize);
        //执行查询,数据会自动回填到page中
        userMapper.listByQo(userQo);
        return page;
    }

}
//页码、每页记录数
int pageNum = page.getPageNum();
int pageSize = page.getPageSize();

//符合条件的总记录数、总页数
long total = page.getTotal();
int pages = page.getPages();

//当前页的结果集
List<JpAvPo> userPos = page.getResult();


//可以指定是否开启分页统计,开启才统计 total、pages,默认true
PageMethod.startPage(pageNum, pageSize, true);
//可以指定排序方式,排序方式可以是 null、空串
PageMethod.startPage(pageNum, pageSize, "id asc");

原理:调用dao层查询方法时进行拦截

  • select count(...) from t_xxx where... 查询满足条件的记录数,得到total、pages信息。如果false关闭分页统计则不进行这一步
  • 然后在目标sql末尾根据数据库类型拼接 limit、top之类的分页参数进行分页查询。注意:目标sql末尾不要加分号,PageHelper是直接拼接在sql末尾的,不会自动去除目标sql末尾的分号。
;