前言
《Mybatis概述》给我们提供了ORM解决方案,MyBatis Generator 是MyBatis的快速代码生成辅助工具。每个公司可以根据自己的代码规范,统一生成基础代码。
快速入门
通过以下demo可以直接java方式运行
String genCfg = "mbgConfiguration.xml";
File configFile = new File(GenMain.class.getResource(genCfg).getFile());
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = null;
myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
依赖
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
配置
核心配置文件
<?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>
<!-- <context id="sqlserverTables" targetRuntime="IntrospectedTableMyBatis3CustomIpl">-->
<context id="sqlserverTables" targetRuntime="MyBatis3Simple">
<!-- 生成的pojo,将implements Serializable-->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<!-- <plugin type="com.myproject.mbg.CustomPlugin" />-->
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!-- 数据库链接URL、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://ip/库名"
userId="***"
password="***">
<property name="useInformationSchema" value="true"/>
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!--
默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer
true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal
-->
<javaTypeResolver type="com.myproject.mbg.CustomJavaTypeResolver">
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--
生成model模型,对应的包路径,以及文件存放路径(targetProject),targetProject可以指定具体的路径,如./src/main/java,
也可以使用“MAVEN”来自动生成,这样生成的代码会在target/generatord-source目录下
-->
<javaModelGenerator targetPackage="com.myproject.entity" targetProject="myproject/src/main/java">
<property name="enableSubPackages" value="true"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 对应的Mapper接口类文件 -->
<javaClientGenerator targetPackage="com.myproject.dao.mapper" targetProject="myproject/src/main/java" type="ANNOTATEDMAPPER">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<table tableName="mbg_test" domainObjectName="MbgTest" enableSelectByExample="true" modelType="flat">
<property name="useActualColumnNames" value="false"/>
<generatedKey column ="id" sqlStatement ="MYSQL" identity="true"/>
<!-- <columnOverride column="id" isGeneratedAlways="true"/>-->
<ignoreColumn column="test_ignore" />
<columnOverride column="status" javaType="com.myproject.entity.enums.MbgTestStatus" typeHandler="com.myproject.core.mybatis.typehandler.IntEnumTypeHandler" />
<columnOverride column="another_status" javaType="com.myproject.entity.enums.AnotherStatus" typeHandler="com.myproject.core.mybatis.typehandler.IntEnumTypeHandler" />
</table>
</context>
</generatorConfiguration>
XML配置介绍
<context>
一个context可以看作一个数据库环境。 可以在 元素内列出多个元素, 以允许在MyBatis Generator的同一运行中从不同的数据库或具有不同的生成参数生成对象。
<connectionFactory> 或者 <jdbcConnection>
设置数据库连接。
<javaClientGenerator>
生成crud,可以设置生成的文件放在哪个包
<javaModelGenerator>
生成entity,可以设置生成的文件放在哪个包 一些主要功能
是否生成全字段构造函数
是否immutable,将决定是否生成set方法
set方法是否自动trim
<sqlMapGenerator>
用于定义SQL映射生成器的属性,当选择的javaClientGenerator需要XML时,此元素才是元素的必需子元素
<javaTypeResolver>
用于定义 Java 类型解析器的属性。Java 类型解析器决定了 数据库列 与 Java类型的对应关系
<commentGenerator>
定义注释生成器的属性
<domainObjectRenamingRule>
设置entity类名生成规则
比如当库中的所有表都有一个公共前缀,但是我们的entity名字里面不想要这个前缀
<table>
指定表,为该表生成代码(entity, crud方法, mapper)
一些主要配置项:
1. entity的名字
2. 是否使用真实列名作为属性名(否则就用驼峰)
3. 是否生成根据主键的select|delete|update
4. 是否生成插入语句
5. 是否允许主键查询
6. 是否immutable,将决定是否生成set方法
- <generatedKey>
用于指定自动生成的字段(比如自增id)
如果指定此元素,则MyBatis Generator(MBG)将在SQL映射的生成的元素内生成一个适当的 元素(根据sqlStatement不同而不同),insert的时候会把这个值赋值到对象中。
MySql -> SELECT LAST_INSERT_ID()
- <columnOverride>
property设置java属性名(一般不需要在columnOverride这个标签里面设置,可以在table标签统一设置成驼峰)
制定列与属性的映射关系
isGeneratedAlways=true 生成的insert update方法就不会去设置这个字段的值。
typeHandler当默认的类型转换不能满足要求的时候可以自定义类型转换
<columnOverride column="sku_name" property="skuName" javaType="java.lang.String" jdbcType="VARCHAR"
isGeneratedAlways="false" typeHandler="com.***.***TypeHandler"/>
- <ignoreColumn>
忽略某列,所有生成的代码里面都不会包含这列。 - <ignoreColumnsByRegex>
根据正则忽略列,可以指定except,这样正则就可以写得更加简单了。
<table tableName="Foo">
<ignoreColumnsByRegex pattern="(?i)col.*">
<except column="col01"/>
<except column="col13"/>
</ignoreColumnsByRegex>
</table>
- <columnRenamingRule>
设置entity中属性名生成规则
比如当表中的所有列都有一个公共前缀,但是我们的entity里面不想要这个前缀。
自定义改造
- 乐观锁支持(version字段)
- 逻辑删除(deleted字段)
- BLOB字段支持
- 批量操作
- 自增主键
请移步github《自定义Generator Demo》作者写的简单。
主要参考
《定制MyBatis Generator减少mybatis的使用负担》
《官方文档》
《Mybatis详解系列(五)–Mybatis Generator和全注解风格的MyBatis3DynamicSql》