1 pom依赖
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
<!-- 通用 Mapper -->
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
<!-- 网上大多使用的是版本4.0.0,此版本官网上说会与 devtools 热部署 发生冲突
故,改用最新版 4.0.3 ,
虽然我测试了一下4.0.0发现并没有报错 ,但是用新版本总归没有错的是吧 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.3</version>
</dependency>
此外 还应有 mybatis 及 spring或者springboot等依赖
需要注意的是
在 spring中 mapperScan配置 应该使用
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="扫描包名"/> </bean>
而不是普通的版本
而在 spring boot中 @Mapper 或者 @MapperScan 也应该使用 tk 包下的,而不是原生的
//官网上 集成 springboot 的操作感觉漏了一部分, 需要单独配置 plugin , 不然就找不到 mybatisGenerator 类 , 挺麻烦的就是了。
2 generatorConfig.xml配置
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 与普通逆向工程的区别之 1 普通的为 MyBatis3 加个 simple可以取消掉Example类的生成-->
<context id="Mysql" targetRuntime="MyBatis3Simple"
defaultModelType="flat">
<property name="javaFileEncoding" value="UTF-8" />
<!-- 是否生成 注解 @Id @Column 啥的 默认为 true -->
<property name="useMapperCommentGenerator" value="true" />
<!-- -这个插件是为了 去除 逆向工程 的bug 而使用的-->
<plugin type="OverIsMergeablePlugin" />
<!-- 与普通逆向工程区别之 2 普通版本无此类配置 毕竟不用继承mapper类-->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<!-- 这种用法是官网上实例的用法 ,但是这样子生成的mapper 就只会继承一个 Mapper<T> 接口 ,没有批量插入的方法 因而修改成为下面那种-->
<!-- <property name="mappers"
value="tk.mybatis.mapper.common.Mapper" /> -->
<!-- 继承额外的 mysqlMapper 有批量插入方法,也可以自己写个mapper接口继承对应mapper 然后修改这里的value -->
<property name="mappers"
value="tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.MySqlMapper" />
<property name="caseSensitive" value="true" />
<property name="forceAnnotation" value="true" />
<property name="beginningDelimiter" value="`" />
<property name="endingDelimiter" value="`" />
</plugin>
<!--去掉生成的pojo类中让人厌烦的注释 -->
<commentGenerator>
<property name="suppressDate" value="true" />
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- datasource-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test1?serverTimezone=UTC"
userId="root" password="admin">
</jdbcConnection>
<!-- 实体类 -->
<javaModelGenerator targetPackage="com.blog.pojo"
targetProject="src/main/java" />
<!-- mapper xml位置-->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackage" value="true" />
</sqlMapGenerator>
<!-- mapper 对应的 接口-->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.blog.mapper" targetProject="src/main/java">
<property name="enableSubPackage" value="true" />
</javaClientGenerator>
<!-- 配置数据库中的表-->
<table tableName="test">
<!-- 自增长键 一般不用配置-->
<property name="my.isgen.usekeys" value="true" />
<generatedKey column="id" sqlStatement="JDBC" />
</table>
</context>
</generatorConfiguration>
3 mybatisGenerator 启动类
package com.email.email.common;
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.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MybatisGenerator {
public static InputStream getResourceAsStream(String path) {
return Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
}
public static void main(String[] args) throws Exception {
String today = "2019-03-22";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date now = sdf.parse(today);
Date d = new Date();
if (d.getTime() > now.getTime() + 1000 * 60 * 60 * 24) {
System.err.println("——————未成成功运行——————");
System.err.println("——————未成成功运行——————");
System.err.println("本程序具有破坏作用,应该只运行一次,如果必须要再运行,需要修改today变量为今天,如:" + sdf.format(new Date()));
return;
}
if (false)
return;
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(getResourceAsStream("generatorConfig.xml"));
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
for (String warning : warnings) {
System.out.println(warning);
}
}
}
4 mybatisGenerator 去bug插件(需要在generatorConfig.xml中配置)
OverIsMergeablePlugin.java
import java.lang.reflect.Field;
import java.util.List;
import org.mybatis.generator.api.GeneratedXmlFile;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
public class OverIsMergeablePlugin extends PluginAdapter{
@Override
public boolean validate(List<String> warnings) {
return true;
}
@Override
public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) {
try {
Field field = sqlMap.getClass().getDeclaredField("isMergeable");
field.setAccessible(true);
field.setBoolean(sqlMap, false);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
没有此插件 多次执行 启动类的话 会在mapper.xml已经生成的基础上再次生成
如
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.blog.mapper.CategoryMapper">
<resultMap id="BaseResultMap" type="com.blog.pojo.Category">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="test" jdbcType="LONGVARCHAR" property="test" />
</resultMap>
<resultMap id="BaseResultMap" type="com.blog.pojo.Category">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="test" jdbcType="LONGVARCHAR" property="test" />
</resultMap>
<resultMap id="BaseResultMap" type="com.blog.pojo.Category">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="test" jdbcType="LONGVARCHAR" property="test" />
</resultMap>
</mapper>
故,使用此插件
5 通用mapper 使用
用法 基本和 普通版本一致
值得注意的是 example 类 的变化
Example example = new Example(Country.class);
example.setForUpdate(true);
example.createCriteria().andGreaterThan("id", 100).andLessThan("id",151);
example.or().andLessThan("id", 41);
List<Country> countries = mapper.selectByExample(example);
嘛,毕竟通用Mapper 没有对应example类 只能通过反射来用了;
6 个人有过的疑惑及解答
在原生mbg 中 如果有Text型数据 需要有特定的insertWithBlob 方法 不然就插入不进去 ,在通用Mapper 里呢?
答 :通用Mapper中 直接insert 就行了,不区分是否为Text类型
自动生成的@Table("‘category’")的双引号中的单引号删除有影响吗?
答:没有
如果类与表中成员变量名字不一致 example 怎么写
答:表中send_time
类中 sendTime
应当使用类中名字,否则就会报错找不到变量;
Example example = new Example(Email.class);
example.createCriteria().andEqualTo("sendTime","time");
List<Email> list = emailMapper.selectByExample(example);
return list;
通用mapper devtools冲突
官网上说 通用mapper 4.0.3 不会有冲突了 ,然而实测还是出了问题
报错说找不到对应类 的表
解决
1.在resources目录下新建 META-INF 文件夹
2.在此文件夹下新建spring-devtools.properties文件
3.在配置文件中复制
restart.include.mapper = /mapper-[\\w-\\.]+jar
restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar
此方式可以保证使用相同的类加载器从而不报错