用JAVA执行MyBatis Generator

前言

MyBatis官方提供了MyBatis Generator插件用来生成model、mapper和xml,但是如果在生成代码的时候想加入一些自定义的内容,也就是plugin,就要把自定义的内容打成包,再把配置放到MyBatis Generator插件里才行,这样相当麻烦。于是采用JAVA执行MyBatis Generator的方法就不需要再打成包了。

开始配置

generatorConfig.xml

JSR303Plugin是自定义的内容

<?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>
    <!-- 引入配置文件 -->
    <properties resource="generatorConfig.properties"/> 
    <!-- 数据库驱动  -->
    <!--classPathEntry location="${classPath}"/--> 
    <!-- 数据库驱动  -->
    <classPathEntry location="${db.oracle.kf.classPath}"/> 
    
    <!-- oralce -->
    <context id="oracle" targetRuntime="MyBatis3" defaultModelType="flat">
        <property name="javaFileEncoding" value="UTF-8"/>
        
        <!-- This plugin is only valid for MyBatis3 target runtime -->
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin" /> 
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>   
        <plugin type="com.asiainfo.aigov.fdapp.common.JSR303Plugin" />
        
        <!-- 数据库连接 -->
        <jdbcConnection 
            driverClass="${db.oracle.kf.driverClass}" 
            connectionURL="${db.oracle.kf.jdbcUrl}" 
            userId="${db.oracle.kf.user}" 
            password="${db.oracle.kf.password}">
            <!-- 针对oracle数据库 -->
            <property name="remarksReporting" value="true"></property>
            <!-- 针对mysql数据库 -->
            <property name="useInformationSchema" value="true"></property>  
        </jdbcConnection>
            
        <!-- model -->
        <javaModelGenerator 
            targetPackage="${targetPackage}.model" 
            targetProject="${targetProject}" />
            
        <!-- mapper.xml -->
        <sqlMapGenerator 
            targetPackage="${targetPackage}.dao.mapper.oracle" 
            targetProject="${targetProject}" />
            
        <!-- dao或mapper接口 -->
        <javaClientGenerator 
            targetPackage="${targetPackage}.dao"
            targetProject="${targetProject}" 
            type="XMLMAPPER" />
            
        <!-- 表配置 -->        
        <table tableName="FD_ATTENTION" domainObjectName="" />

    </context> 
    
</generatorConfiguration>

generatorConfig.properties

#oralce
db.oracle.kf.driverClass=oracle.jdbc.driver.OracleDriver
db.oracle.kf.jdbcUrl=数据库链接
db.oracle.kf.user=用户名
db.oracle.kf.password=密码
db.oracle.kf.classPath=/Users/pany/.m2/repository/com/oracle/ojdbc14/10.2.0.4.0/ojdbc14-10.2.0.4.0.jar

#这里要用全路径
targetProject=/Users/pany/Documents/workspace/aigov/familydoctor-webapp/src/main/java
targetPackage=com.asiainfo.aigov.familydoctor

JSR303Plugin

package com.asiainfo.aigov.fdapp.common;

import java.util.List;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.TopLevelClass;

/**
 * 功能描述:jsr303 代码生成插件
 */
public class JSR303Plugin extends PluginAdapter {
    
    @Override
    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass,
            IntrospectedTable introspectedTable) {
        // 增加类注解
        topLevelClass.addImportedType("io.swagger.annotations.ApiModel");
        topLevelClass.addAnnotation("@ApiModel");       
        return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable);
    }
    
    @Override
    public boolean modelFieldGenerated(Field field,
                                       TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,
                                       IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        if (false == introspectedColumn.isNullable()) {
            if (false == introspectedColumn.isIdentity()) {
                boolean isPrimarkKey = false;//是否为主键
                for(IntrospectedColumn column : introspectedTable.getPrimaryKeyColumns()) {
                    if(introspectedColumn==column) {
                        isPrimarkKey = true;
                    }
                }
                if(!isPrimarkKey) {
                    topLevelClass.addImportedType("javax.validation.constraints.NotNull");
                    field.addAnnotation("@NotNull");
                }
            }
        }
     
        if (introspectedColumn.isStringColumn()) {
                topLevelClass.addImportedType("io.swagger.annotations.ApiModelProperty");
                field.addAnnotation("@ApiModelProperty(\"" + introspectedColumn.getRemarks() + "\")");
            topLevelClass.addImportedType("javax.validation.constraints.Size");
            field.addAnnotation("@Size(min = 0, max = " + introspectedColumn.getLength() + " , message = \"长度必须在{min}和{max}之间\")");
        } else if ("DECIMAL".equals(introspectedColumn.getJdbcTypeName())) {
                topLevelClass.addImportedType("io.swagger.annotations.ApiModelProperty");
                field.addAnnotation("@ApiModelProperty(value=\"" + introspectedColumn.getRemarks() + "\", example=\"0\")");
        }
        return super.modelFieldGenerated(field, topLevelClass, introspectedColumn,
                introspectedTable, modelClassType);
    }
    
    @Override
    public boolean validate(List<String> warnings) {
        return true;
    }

}

MyBatisGenTest

右键执行单元测试即可

package com.asiainfo.aigov;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.api.ProgressCallback;
import org.mybatis.generator.api.VerboseProgressCallback;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyBatisGenTest {

    @Test
    public void gen() {
        //读取文件
        File configFile = new File(this.getClass().getClassLoader().getResource("generatorConfig.xml").getFile());
        List<String> warnings = new ArrayList<String>();
        ConfigurationParser cp = new ConfigurationParser(warnings);
        //true:覆盖生成
        DefaultShellCallback callback = new DefaultShellCallback(true);
        try {
            Configuration config = cp.parseConfiguration(configFile);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            ProgressCallback progressCallback = new VerboseProgressCallback();
            myBatisGenerator.generate(progressCallback);
            System.out.println("代码成功生成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

结后语

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 体验入: 通过各店家人们分享上月的业绩汇报,使我找到再次提升业绩的核心! 找核心: 1团队——放下个人利益,全身心...
    宇宙之爱黄昊贵阅读 502评论 0 0
  • 这个五叶片的红花我很喜欢,但不知道叫什么名字,有人说是茶花的一种,我喜欢它是觉得她什么都刚刚好,一棵一米左右的小树...
    朵朵颐阅读 256评论 0 0
  • 外面狂风暴雨伴随着阵阵雷声,深夜的A市街头空无一人,一辆急救车鸣叫着快速的驶进了市立医院。 叮玲玲、叮玲玲,一阵急...
    心灵静思阅读 360评论 0 0