mybatis通用Mapper 生成器使用方式

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

此方式可以保证使用相同的类加载器从而不报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值