Mybatis/tk-Mybatis/Mybatis-plus 中generator(代码生成器)的使用

1.简介

mybatis-generator (MBG) 是mybatis 提供的代码生成器,通过配置一个数据库连接,按照通用的代码规则生成各个数据库表对应的POJO实体类/Mapper接口/mapper.xml sql映射文件,建立Object 和db - relation 映射关系,最终生成的这些java类和xml文件就足够我们在开发中访问到数据库的表。
如何快速入门mybatis-generator,最直接有效的方式就是查阅mybatis官方提供的入门指南 .
如果你的时间比较紧,急于使用该构件完成代码的自动生成,可以耐心看完这篇博文。我将介绍在mybatis源生及其衍生框架tk-mybatis和mybatis-plus如何快速搭建一个行之有效的generator。

2.使用

本文默认使用maven管理我们的项目和所需依赖。同时,mybatis-generator默认采用xml文件进行配置。

2.1 使用流程

我们可以通过一个简单的使用流程来说明清楚集成mybatis-generator需要进行的工作。
这里列出必要的组件:

  1. 入口(可以是maven-plugins或者一个java类)
  2. generator-config.xml 文件
  3. 数据库表

你需要完成的工作按顺序分别是:

  1. 设计你的数据库表
  2. 在项目中引入mabatis-generator依赖包
  3. 编写xml配置文件
  4. 配置解析运行xml配置文件的入口

最终结构展示
在这里插入图片描述

2.2 maven依赖

		<dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <!--这里使用的1.4版本,可以到maven仓库查阅你需要的版本 -->
            <version>1.4.0</version>
        </dependency>
		
		<!--数据库驱动,这里是mysql -->
		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
            <scope>runtime</scope>
        </dependency>

2.3 Xml配置文件

下面是一个简单的xml配置文件,适用于源生的mybatis-generator。你也可以从上文中官网指南中获取该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>

	<!--配置你的数据库驱动文件的完全限定路径,以用户主机的存储位置为准 -->
    <classPathEntry location="D:\repository\mysql\mysql-connector-java\8.0.21\mysql-connector-java-8.0.21.jar" />
	
	<!--<context>元素用于指定生成一组对象的环境。
	子元素用于指定要连接的数据库,要生成的对象的类型以及要进行内省的表。
	可以在<generatorConfiguration> 元素内列出多个<context>元素, 
	以允许在MyBatis Generator(MBG)的同一运行中从不同的数据库
	或具有不同的生成参数生成对象。 -->
	
	<!-- 官方的说明很清楚了,随便起一个ID,targetRuntime指定Mybatis3!-->
    <context id="MysqlDb" targetRuntime="MyBatis3">
    	<!--配置你的数据库连接参数,url需要指定时区,否则将导致异常 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis-gen-demo?serverTimezone=UTC"
                        userId="root"
                        password="root">
        </jdbcConnection>
		
		<!--字段类型解析的一些配置,如果有需要,可以查阅官方文档 -->
        <javaTypeResolver >
        	<!--forceBigDecimals 当该属性为true时,
        	如果数据库列的类型为DECIMAL或NUMERIC,
        	则Java类型解析器将始终使用java.math.BigDecimal 
        	-->
            <property name="forceBigDecimals" value="true" />
        </javaTypeResolver>

		<!--pojo实体类生成目录的配置 targetProject + targetPackage-->
        <javaModelGenerator targetPackage="cn.kerninventory.mybatis.gen.origin.pojo" targetProject="gen-origin/src/main/java"/>
       	<!-- XML文件生成目录的配置-->
        <sqlMapGenerator targetPackage="mapper"  targetProject="gen-origin/src/main/resources"/>
        <!-- Mapper接口生成目录的配置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.kerninventory.mybatis.gen.origin.mapper"  targetProject="gen-origin/src/main/java"/>
         
         <!--要生成的表,可以有多个
		tableName对应数据库中的表名,
		domainObjectName对应类名前缀
		example domainObjectName="User"
		pojo : User / UserExample
		mapper : UserMapper
		xml : UserMapper.xml
		 -->
        <table tableName="test" domainObjectName="Test" />
    </context>
</generatorConfiguration>

需要注意的是,你需要预先把javaModelGenerator 、sqlMapGenerator 、javaClientGenerator 中配置的包和目录创建好,以方便后续的生成。

2.4 入口

mybatis-generator 提供了多种运行代码生成器的入口,包括

  • 命令行
  • antTask
  • maven-plugins
  • java代码

等,这里仅介绍常用的maven-pluginsjava代码两种方式。(注意:两种方式在配置文件中有一个极小的差异,后面将会介绍)

2.4.1 使用java代码运行

你需要创建一个包含main方法的简单java类,如下:

package cn.xxx

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>一句话描述</p>
 *
 * @author Kern
 */
public class MyBatisGeneratorRunner {

    public static void main(String[] args) {
        try {
            //如下三行代码是获取到配置文件的输入流,只要获取到配置文件的File实例或者输入流即可,方式任选
            ClassLoader classLoader = MyBatisGeneratorRunner.class.getClassLoader();
            URL url = classLoader.getResource("generator-config.xml");
            InputStream configInputStream = url.openStream();
            //warnings字符串集合用于存放生成过程中的警告信息,并非异常信息,所以可以按需输出
            List<String> warnings = new ArrayList<String>();
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(configInputStream);
            //默认的shell命令回调,主要用于配置文件已存在时是否覆盖
            DefaultShellCallback callback = new DefaultShellCallback(true);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            myBatisGenerator.generate(null);
            if (!warnings.isEmpty()) {
                String error = warnings.stream().collect(Collectors.joining(System.lineSeparator()));
                throw new IllegalArgumentException("代码生成警告:" + error);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

点击运行即可完成代码的生成,如下示意图
在这里插入图片描述

2.4.2 使用maven插件运行

找到你的项目的pom文件,在build块中做如下配置

 <build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.0</version>
                <configuration>
                	<!--配置你的xml配置文件的路径 -->
                	<configurationFile>${pom.basedir}/src/main/resources/maven-plugins-generator-config.xml</configurationFile>
                	<!--配置覆盖写入模式 -->
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>
    </build>

运行该插件,即可。
在这里插入图片描述
运行结果如下,这里我前面已经使用java代码生成了,因此有warning消息显示已经存在这些文件,并且已经执行覆盖了
在这里插入图片描述

2.4.3 两种入口的路径差异

配置文件中javaModelGenerator 、sqlMapGenerator 、javaClientGenerator三个元素的targetProject中路径配置在使用不同入口解析时是由差异的,因此需要注意。
先给出结论

  • 当使用java运行代码时:
    目标目录 = System.getProperty(“user.dir”) + targetProject配置的值
  • 当使用Maven插件运行时:
    目标目录 = ${pom.basedir} + targetProject配置的值

听起来好像是一样的,的确在某些项目中是一样的,这要取决于你的项目结构和入口配置的位置。
例如我的项目结构如下

-- parent
			-- moduleA
							-- GeneratorRunner.java(代码生成java入口类)
							-- pom.xml(mybatis-generator-maven-plugin:maven插件)
			-- moduleB

此时 System.getProperty(“user.dir”) = parent的根目录
而 ${pom.basedir} = moduleA的根目录,就不一样了。

又如果我的项目结构如下

-- project
			-- GeneratorRunner.java(代码生成java入口类)
			-- pom.xml(mybatis-generator-maven-plugin:maven插件)

此时 System.getProperty(“user.dir”) 和 ${pom.basedir} 都等于project的根目录。
因此我们在配置时要准确配置targetProject的路径

结果展示如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.mybatis-generator 与基于Mybatis的通用接口设计框架的集成

无论是tk-mybatis 或者 mybatis-plus都是基于mybatis的通用mapper设计,设计了一系列通用的持久层CURD方法,并以所有mapper接口超类的方式提供给用户。例如常用的selectByExample,selectByPrimaryKey,save,updateByExample,deleteByExample等等。

此外,tk-mybatis对mybatis-generator提供了直接的支持,和源生一样,都使用xml进行配置,但mybatis-plus是通过java代码进行配置的,且mybatis-plus提供了更多的功能,可以生成service层和controller层的代码。

下面将分别介绍tk-mybatis和mybatis-plus的代码生成。

3.1 tk-mybatis下使用mybatis-generator

3.1.1 maven依赖

tk-mybatis采用和mybatis相同的设计思路,提供了基于springboot的starter包,并把用于generator的类放在另外一个包下。
首先是主包的依赖添加

		<!--tk-mybatis -->
		<dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>
        <!--mybatis -->
		<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
		<!--mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

然后用于生成器的依赖

		<!--tk-mybatis -->
		<dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.1.5</version>
            <optional>true</optional>
        </dependency>
        <!--mybatis -->
		<dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
            <optional>true</optional>
        </dependency>

我们同源生依赖进行简单比较后很容易看到,只要在源生的依赖下添加tk-mybatis的对应依赖支持即可。

3.1.2 xml配置文件

3.1.2.1 Mapper接口超类的设计

xml配置文件与源生的基本无差异,唯一一点差异在于通用mapper接口的超类,我们知道tk-mybatis提供了一系列通用的持久层方法,并以接口的形式供我们继承使用,查看 tk.mybatis.mapper.common 包下可以看到如下的一系列接口,
在这里插入图片描述
其中例如 InsertSelectiveMapper 封装了新增的方法,因为是国内的程序员设计的,因此我们可以看到其中的中文注解,说明的很清楚。

@RegisterMapper
public interface InsertSelectiveMapper<T> {

    /**
     * 保存一个实体,null的属性不会保存,会使用数据库默认值
     *
     * @param record
     * @return
     */
    @InsertProvider(type = BaseInsertProvider.class, method = "dynamicSQL")
    int insertSelective(T record);

}

因此,我们可以根据tk-mybatis提供的这些接口,设计一个我们需要的mapper接口超类,并在xml配置中说明所有生成的mapper接口都需要继承这个超类。
例如设计如下的这样一个接口。

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * <p>
 *     Parent interface of mappers.
 * </p>
 *
 * @author Kern
 */
public interface MyMapper <T> extends Mapper<T>, MySqlMapper<T> {

}

3.1.2.2 xml文件配置tk-mybatis插件

我们在设计完超类,需要在xml中声明要使用这个超类, 下面的xml仅展示差异部分,其余部分可参考上文所述源生的generator内容。

<generatorConfiguration>
	<context id="MysqlDb" targetRuntime="MyBatis3">
			<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
	            <property name="mappers" value="cn.kerninventory.mybatis.gen.tkmybatis.gen.MyMapper"/>
	        </plugin>
	</context>
</generatorConfiguration>

可以看到,tk-mybatis以源生插件的形式提供了支持。

3.1.3 入口

java形式与源生无差异,插件形式仅需要在源生插件中依赖tk.mybatis:mapper即可,如下

<plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <configurationFile>${pom.basedir}/src/main/resources/maven-plugins-generator-config.xml</configurationFile>
                    <overwrite>true</overwrite>
                </configuration>
                <!--添加tk-mybatis依赖支持 -->
                <dependencies>
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.1.5</version>
                    </dependency>
                </dependencies>
            </plugin>

结果展示如下
在这里插入图片描述
在这里插入图片描述

此外,无论是哪种形式,都要注意版本兼容问题,笔者使用的1.3.7 和 4.1.5是可以兼容的,但是如果使用mybatis-generator的1.4.0版本则与tk.mybatis:mapper:4.1.5 不兼容,会导致运行失败。

同时,tk-mybatis对一些二进制大对象的数据类型的支持不够,在生成WithBLOBs的pojo类时有一些限制,由于不是我们常用的数据类型,因此这里不加以讨论,感兴趣的同学可以去查阅相关文档。

使用后记: tk-mybatis在生成的mapper接口和xml文件中存在了一些其他的问题,将重复生成已声明的接口,需要手动去删除,非常的不方便。推测可能是版本不兼容导致的,由于作者花了一些时间没有找到具体原因,目前已经弃用tk-mybatis。特反馈给广大的读者朋友们。

3.2.强大的mybatis-plus-generator

在我看来,tk-mybatis和mybatis-plus的最大差异在于,mybatis-plus提供了详细而全面的用户手册 -> Mybatis-plus官网

而 tk-mybatis 甚至都找不到官方网站。对于一个初学者而言,缺乏文档支持也就基本失去了竞争力。

话不多说,与源生和tk-mybatis不同的是,mybatis-plus仅支持java代码配置的形式,
在这里插入图片描述
官网中有完整的教学和演示文档。因此笔者仅演示一下我的使用过程。

3.2.1 maven依赖

		<!--默认的模板引擎依赖,必须添加一个模板引擎的依赖 -->
		<dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
		<!--mp-generator依赖 -->
		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.0</version>
        </dependency>
		<!--mp依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

3.2.2 编写java配置文件

package cn.kerninventory.mybatis.gen.mybatisplus.gen;

import cn.kerninventory.mybatis.gen.mybatisplus.pojo.BaseEntity;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * <p>一句话描述</p>
 *
 * @author Kern
 */
public class MybatisPlusGeneratorRunner {

    public static void main(String[] args) {
        AutoGenerator generator = new AutoGenerator();
        //配置数据库连接参数
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/mybatis-gen-demo?serverTimezone=UTC");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("root");
        generator.setDataSource(dataSourceConfig);

        //配置文件生成路径参数
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("cn.kerninventory.mybatis.gen.mybatisplus");
        packageConfig.setEntity("pojo");
        packageConfig.setMapper("mapper");
        packageConfig.setXml("xml");
        generator.setPackageInfo(packageConfig);

        //策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        //pojo类超类
        strategyConfig.setSuperEntityClass(BaseEntity.class);
        //表名转驼峰
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        //字段驼峰命名
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
        //set方法builder模式
        strategyConfig.setChainModel(true);
        //使用lombok注解
        //strategyConfig.setEntityLombokModel(true);
        //不生成serial version uuid
        //strategyConfig.setEntitySerialVersionUID(false);
        //要生成的表名
        strategyConfig.setInclude("test");
        generator.setStrategy(strategyConfig);

        //全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        //输出目录
        globalConfig.setOutputDir(System.getProperty("user.dir") + "/gen-mybatisplus/src/main/java");
        globalConfig.setAuthor("MPG");
        generator.setGlobalConfig(globalConfig);
        generator.execute();
    }
}

输出结果展示
框架结构
在这里插入图片描述

pojo类
在这里插入图片描述
mapper接口
在这里插入图片描述
以上,是mybatis-plus的代码生成器使用演示,官网的文档还是比较详尽的,可以直接去官网参考。以上内容仅供参考。

全文结束,希望对大家有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值