MBG Mybatis代码生成器

概述

参考《MyBatis从入门到精通》 5.3运行MyBatis Generator
* MBG运行方式,常用的有以下几种
* 1.使用Java编写代码运行 —— 综合来说,推荐使用
* 好处:generatorConfig.xml配置的一些特殊的类(如commentGenerator标签中type属性配置的MyCommentGenerator类)只要在当前项目中,
* 或者在当前项目的classpath中,就可以直接使用。 使用其他方式都需要特别的配置才能在MBG执行过程中找到MyCommentGenerator类并实例化,否则都会由于
* 找不到这个类而抛出异常。
* 不便:和当前项目是绑定在一起的,在Maven多子模块的情况下,可能需要增加编写代码量和配置量,配置多个,管理不方便。
* 2.使用命令提示符运行
* 3.使用Maven Plugin运行
* 4.使用Eclipse插件运行

pom.xml配置

<?xml version=”1.0″ encoding=”UTF-8″?>

<project xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://maven.apache.org/POM/4.0.0″
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
<modelVersion>4.0.0</modelVersion>

<groupId>tk.mybatis</groupId>
<artifactId>code-generator</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>

<name>code-generator</name>
<!– FIXME change it to the project’s website –>
<url>http://www.example.com</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

</dependencies>

<build>

<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>

<pluginManagement><!– lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) –>

<plugins>

<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!– see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging –>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>

</plugins>

</pluginManagement>

  </build>

</project>

generatorConfig.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>

<!–数据库驱动–>
<context id=”DB2Tables” defaultModelType=”flat” targetRuntime=”MyBatis3″>
<property name=”beginningDelimiter” value=”`”></property>
<property name=”endingDelimiter” value=”`”></property>
<property name=”javaFileEncoding” value=”UTF-8″></property>

<commentGenerator>
<!– 禁止生产注释时生成日期 –>
<property name=”suppressDate” value=”true”/>
<!– <property name=”suppressAllComments” value=”true”/> –>
<property name=”addRemarkComments” value=”true”/>
</commentGenerator>

<!–数据库链接地址账号密码–>
<jdbcConnection driverClass=”com.mysql.jdbc.Driver”
connectionURL=”jdbc:mysql://localhost:3306/mybatis?useSSL=false”
userId=”root” password=”forrest”>
</jdbcConnection>

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

<!–生成Model类存放位置–>
<javaModelGenerator targetPackage=”tk.mybatis.web.model” targetProject=”src/main/java”>
<!– constructorBased:true,就会使用构造方法入参。 –>
<property name=”constructorBased” value=”true”></property>
<!– enableSubPackages:true,会根据catalog和schema来生成子包。 –>
<property name=”enableSubPackages” value=”false”/>
<!– rootClass:设置所有实体类的基类。 如果设置了,需要使用类的全限定名称。 并且,MBG能够加载rootClass(通过classPathEntry引入jar包),
或者classpath方式),那么MBG不会覆盖和父类中完全匹配的属性。 –>
<!– trimStrings:是否对数据库查询结果进行trim操作。 –>
<property name=”trimStrings” value=”false”/>
</javaModelGenerator>

<!– 生成Mapper.xml映射文件存放位置 –>
<sqlMapGenerator targetPackage=”tk.mybatis.web.mapper” targetProject=”src/main/resources”>
<property name=”enableSubPackages” value=”false”/>
</sqlMapGenerator>

<!–生成Mapper接口存放位置–>
<!– type:
ANNOTATEDMAPPER:基于注解的Mappper接口
XMLMAPPER:所有的方法都在xml文件中,接口调用依赖XML文件
MIXEDMAPPER:xml和注解的混合形式
–>
<javaClientGenerator type=”XMLMAPPER” targetPackage=”tk.mybatis.web.mapper” targetProject=”src/main/java”>
<property name=”enableSubPackages” value=”true”/>
</javaClientGenerator>

<!–生成对应表及类名–>
<!– 可以使用通配符,例如生成所有的表 <table tableName=”%” /> –>
<!–
alias:如果指定,这个值会用在生成的select查询SQL表的别名和列名上,例如alias_actualColumnName
domainObjectName:对象的名称
enableXXX:是否生成对应的XXX语句
modeType:和context的defaultModelType含义一样
escapeWildcards:表示查询列是否对schema和表名中的SQL通配符进行转意。默认是false.
–>
<table tableName=”sys_user” domainObjectName=”SysUser” enableCountByExample=”true”
enableUpdateByExample=”true” enableDeleteByExample=”true”
enableSelectByExample=”true” selectByExampleQueryId=”true”>
<!– property子标签
constructorBased:和javaModelGenerator中的含义一样
modelOnly:是否只生成实体类。 设置成true,就不会有mapper接口,同时还会覆盖属性中的enableXXX方法,并且不会生成任何CRUD方法。
如果配置了sqlMapGenerator,并且modeOnly为true,那么XML映射文件中只有实体对象的映射标签(resultMap)
rootClass:实体的基类
runtimeCatalog/Schema/TableName:运行时的xxx
selectAllOrderByClause:该属性值会追加到selectAll方法后的SQL中,直接与order by拼接后添加到SQL末尾。
useActualColumnNames:设置成true,MBG会使用从数据库元数据湖区的列名作为实体对象的属性。设置false,MBG将会尝试返回的名称转换成驼峰形式。
–>

<!– generatedKey:指定自动生成主键的属性(identity字段或者sequences序列)。 指定这个表情,MBG将在生成insert 的SQL映射文件
中插入一个selectKey标签。
sqlStatement:返回新值的SQL语句,如果这是一个identity列,则可以使用其中一个预定义的特殊值。
identity:设置成true时,该列会被标记成identity列,并且selectKey标签会被插入在insert后面。 设置成false时,selectKey会插入在insert之前。 默认是false.
type:type=post且identity=true时,生成的selectKey中order=AFTER; 当type=pre时,identity只能是false,生成的selectKey中order=BEFORE.
可以这么理解:自动增长的列只有插入到数据库后才能得到ID,所以是AFTER;使用序列时,只有先获取序列之后才能插入数据库,所以是BEFORE.
–>
<generatedKey column=”id” sqlStatement=”MySQL”/>

<!– columnRenamingRule:在生成列之前队列进行重命名。
<columnRenamingRule searchString=”^CUST_” replaceString=””/>
–>

<!– columnOverride:将默写默认计算的属性值更改为指定的值。
<columnOverride column=”LONG_VARCHAR_FIELD” propertiey=”longVarcharField” javaType=”java.lang.String” jdbcType=”VARCHAR”></columnOverride>
–>
</table>
<table tableName=”sys_role” domainObjectName=”SysRole”>
<generatedKey column=”id” sqlStatement=”MySQL”/>
</table>
<table tableName=”sys_user_role” domainObjectName=”SysUserRole”>
</table>
</context>
</generatorConfiguration>

App Main执行类

package tk.mybatis.codegenerator;

import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

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;

/**
* 参考《MyBatis从入门到精通》 5.3运行MyBatis Generator
* MBG运行方式,常用的有以下几种
* 1.使用Java编写代码运行 —— 综合来说,推荐使用
* 好处:generatorConfig.xml配置的一些特殊的类(如commentGenerator标签中type属性配置的MyCommentGenerator类)只要在当前项目中,
* 或者在当前项目的classpath中,就可以直接使用。 使用其他方式都需要特别的配置才能在MBG执行过程中找到MyCommentGenerator类并实例化,否则都会由于
* 找不到这个类而抛出异常。
* 不便:和当前项目是绑定在一起的,在Maven多子模块的情况下,可能需要增加编写代码量和配置量,配置多个,管理不方便。
* 2.使用命令提示符运行
* 3.使用Maven Plugin运行
* 4.使用Eclipse插件运行
* */
public class App {

public static void main(String[] args) throws Exception {
//(new App()).getCurrentPath();

//static 方法内不能使用this
URL url = Thread.currentThread().getContextClassLoader().getResource(“”);
String basePath = url.getPath();
//String filePath = url.getFile();
System.out.println(basePath);
//System.out.println(filePath);
File configFile = new File(basePath, “generatorConfig.xml”);
System.out.println(configFile.getCanonicalPath());

//MBG执行过程中的警告信息
List<String> warnings = new ArrayList<String>();
//当生成的代码重复时,覆盖原代码
boolean overwrite = true;
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);

DefaultShellCallback callback = new DefaultShellCallback(overwrite);
//创建MBG
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
//执行生成代码
myBatisGenerator.generate(null);
//输出警告信息
for (String warning : warnings) {
System.out.println(warning);
}
}

//https://www.cnblogs.com/faunjoe88/p/8032128.html
public void getCurrentPath() throws URISyntaxException {
URL url1 = this.getClass().getClassLoader().getResource(“”);
System.out.println(url1.toString());
//System.out.println(url1.toURI().toString());

URL url2_1 =this.getClass().getResource(“”);
URL url2_2 =this.getClass().getResource(“/”);
System.out.println(url2_1.toString());
System.out.println(url2_2.toString());

URL url3 = Thread.currentThread().getContextClassLoader().getResource(“”);
System.out.println(url3.toString());
}
}

附件:  code-generator

Posted in IT

Author: ilvzhongqian

寄意寒星荃不察,我以我血荐轩辕

Comments are closed.