mybatisGenerator 按照自己项目规范生成代码,节省时间,一劳永逸

mybatisGenerator,代码生成

官方文档 仔细看下官方的文档,这些功能都很好实现

公司的代码有自己的一套规范,每次新增个表挺麻烦,然后根据公司的规范改的代码生成项目。需要对源码进行调整。

  • 类和类属性的注释
  • 类上的@setter和@getter,去掉get和set
  • 修改xml生成的sql和id,新增自定义的sql

前戏

  1. 创建maven项目,引入pom
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
</dependency>
  1. 新增个入口类Generator,新增main方法
    在这里插入图片描述
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 这行改下
InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
  1. resources下新增 generatorConfig.xml,下面试官方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="/Program Files/IBM/SQLLIB/java/db2java.zip" />

  <context id="DB2Tables" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
        connectionURL="jdbc:db2:TEST"
        userId="db2admin"
        password="db2admin">
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <sqlMapGenerator targetPackage="test.xml"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
      <property name="useActualColumnNames" value="true"/>
      <generatedKey column="ID" sqlStatement="DB2" identity="true" />
      <columnOverride column="DATE_FIELD" property="startDate" />
      <ignoreColumn column="FRED" />
      <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
    </table>

  </context>
</generatorConfiguration>

正戏

  1. 禁止生成get、set 方法
public class MyFluentBuilderMethodsPlugin extends PluginAdapter {
    public MyFluentBuilderMethodsPlugin() {
    }

    @Override
    public boolean validate(List<String> warnings) {
        return true;
    }
    @Override
    public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        return false;
    }

    @Override
    public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        return false;
    }
}

放在generatorConfig.xml

<context ...>
<plugin type="com.generator.MyFluentBuilderMethodsPlugin"/>
</context>

效果图…就是没有get和set方法了

  1. 给字段和类加注释,取自数据库

先看效果吧

在这里插入图片描述

实现

  1. 添加类和类属性的注释

新增类CommentGenerator 继承 DefaultCommentGenerator,重写两个方法

/**
  * 给字段添加注释
  */
 @Override
 public void addFieldComment(Field field, IntrospectedTable introspectedTable,
                             IntrospectedColumn introspectedColumn) {
     field.addJavaDocLine("/**");
     String remarks = introspectedColumn.getRemarks();
     if (this.addRemarkComments && StringUtility.stringHasValue(remarks)) {
         String[] remarkLines = remarks.split(System.getProperty("line.separator"));
         String[] var6 = remarkLines;
         int var7 = remarkLines.length;

         for (int var8 = 0; var8 < var7; ++var8) {
             String remarkLine = var6[var8];
             field.addJavaDocLine(" * " + remarkLine);
         }
     }
     field.addJavaDocLine(" */");
     
@Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
      topLevelClass.addJavaDocLine("/**");
      String remarks = introspectedTable.getRemarks();
      if (this.addRemarkComments && StringUtility.stringHasValue(remarks)) {
          String[] remarkLines = remarks.split(System.getProperty("line.separator"));
          String[] var5 = remarkLines;
          int var6 = remarkLines.length;

          for (int var7 = 0; var7 < var6; ++var7) {
              String remarkLine = var5[var7];
              topLevelClass.addJavaDocLine(" * " + remarkLine);
          }
      }
      topLevelClass.addJavaDocLine(" */");

      if (this.hasLombok) {
          addLombok(topLevelClass, introspectedTable);
      }
  }

generatorConfig.xml 配置

  <commentGenerator type="com.xxxxxxxx.CommentGenerator">
      <!-- 是否去除自动生成的注释 -->
      <property name="suppressAllComments" value="true"/>
      <property name="suppressDate" value="true"/>
      <property name="addRemarkComments" value="true"/>
  </commentGenerator>
  1. xml中新增自己公司规范的方法

效果

在这里插入图片描述

实现,覆盖类org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator,路径一样即可覆盖

在这里插入图片描述
在这里插入图片描述


public class UpdateDelFlagElementGenerator extends
        AbstractXmlElementGenerator {

    public UpdateDelFlagElementGenerator() {
        super();
    }

    @Override
    public void addElements(XmlElement parentElement) {
        XmlElement answer = new XmlElement("update"); //$NON-NLS-1$

        answer.addAttribute(new Attribute(
                "id", "deleteByLogic")); //$NON-NLS-1$

        String parameterType = "java.lang.String";

        answer.addAttribute(new Attribute("parameterType", //$NON-NLS-1$
                parameterType));

        context.getCommentGenerator().addComment(answer);

        StringBuilder sb = new StringBuilder();

        sb.append("update "); //$NON-NLS-1$
        sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());
        sb.append(" set DEL_FLAG ='${@com.xxx.xxx.xxx.xxx@YES.getValue()}' ");
        answer.addElement(new TextElement(sb.toString()));

        boolean and = false;
        for (IntrospectedColumn introspectedColumn : introspectedTable
                .getPrimaryKeyColumns()) {
            sb.setLength(0);
            if (and) {
                sb.append("  and "); //$NON-NLS-1$
            } else {
                sb.append("where "); //$NON-NLS-1$
                and = true;
            }

            sb.append(MyBatis3FormattingUtilities
                    .getEscapedColumnName(introspectedColumn));
            sb.append(" = "); //$NON-NLS-1$
            sb.append(MyBatis3FormattingUtilities
                    .getParameterClause(introspectedColumn));
            answer.addElement(new TextElement(sb.toString()));
        }

        if (context.getPlugins()
                .sqlMapUpdateByPrimaryKeySelectiveElementGenerated(answer,
                        introspectedTable)) {
            parentElement.addElement(answer);
        }
    }
}

拼这个其实挺简单的,里面很多例子,参考下就写出来了,如果定了别名别忘了使用别名

  1. 修改sql id,比如原名叫deleteByPrimary 改为 delete,覆盖 org.mybatis.generator.api.IntrospectedTable

找到方法calculateXmlAttributes
在这里插入图片描述
就是这个样子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值