目录
参考资料
什么是 MyBatis Generator ?
MyBatis Generator 是 MyBatis 代码生成工具。
运行 MyBatis Generator 方式
- 命令行
- ant
- maven 运行
- java 代码运行
- eclipse 插件
maven plugin 方式
- pom.xml - build 域引入
<build>
...
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<!-- 需要自行引入 jdbc 驱动依赖 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
- src/main/resources 增加 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>
<!-- mybatis code generator 配置文件 -->
<!-- xml 配置参考地址:https://mybatis.org/generator/configreference/xmlconfig.html -->
<!-- properties : 加载 properties 文件,其他地方可通过 ${property} 引用文件中的属性配置
<properties resource="com/myproject/generatorConfig.properties"></properties>
<properties url="file:///C:/myfolder/generatorConfig.properties"></properties>
-->
<!-- classPathEntry : 指定 jar包位置,例如 jdbc驱动包
<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
-->
<!-- context。targetRuntime:指定代码模板,这里指定 MyBatis3 -->
<context id="context1" targetRuntime="MyBatis3">
<!-- javaFileEncoding: 指定生成的 java 文件编码 -->
<property name="javaFileEncoding" value="UTF-8"></property>
<property name="projectPath" value="C:\work\code\gitee\demo\mybatis\generator"></property>
<!-- jdbcConnection : 定义数据库连接信息 -->
<jdbcConnection
connectionURL="jdbc:mysql://localhost:3306/psychometricsdev"
driverClass="com.mysql.cj.jdbc.Driver"
password="black"
userId="black"/>
<javaTypeResolver>
<!-- forceBigDecimals: 是否数据库类型为数值时强制使用 BigDecimal -->
<property name="forceBigDecimals" value="false" />
<!-- useJSR310Types : 是否使用 JSR-310 标准的日期类型 -->
<property name="useJSR310Types" value="false" />
</javaTypeResolver>
<!--
targetProject: java 模型代码存放于哪个项目
targetPackage: java 模型代码存放于哪个包下
-->
<javaModelGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\java" targetPackage="study.lihw.demo.mybatis.model" >
<!-- constructorBased: 是否生成全惨构造器 -->
<property name="constructorBased" value="false" />
<!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.mybatis.model.blackdb.*Mapper.java -->
<property name="enableSubPackages" value="false" />
<!-- immutable: 生成的 java class 是不可变对象,即没有 setter 方法并且所有参数只能从构造器传入 -->
<property name="immutable" value="false" />
<!-- rootClass: java model 对象的父类
<property name="rootClass" value="com.mycompany.MyRootClass" />
-->
<!-- trimStrings: 对数据库返回的 CHAR 进行 trim 操作 -->
<property name="trimStrings" value="false" />
<!-- exampleTargetPackage,exampleTargetProject : 示例代码是否需要和 model 分离,单独存放
<property name="exampleTargetPackage" value="false" />
<property name="exampleTargetProject" value="false" />
-->
</javaModelGenerator>
<!-- sqlMapGenerator : 生成 mapper.xml 文件 -->
<sqlMapGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\resources" targetPackage="mapper" >
<!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.demo.mybatis.model.blackdb.*Mapper.xml -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- javaClientGenerator : 生成 MessageMapper 接口类
javaClientGenerator.type: 当 targetRuntime=MyBatis3 时,可选值 ANNOTATEDMAPPER( mybatis 3.0.4+)、MIXEDMAPPER、XMLMAPPER
-->
<javaClientGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\java" targetPackage="study.lihw.demo.mybatis.mapper" type="XMLMAPPER">
<!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.demo.mybatis.model.blackdb.*Interface.java -->
<property name="enableSubPackages" value="false" />
<!-- rootInterface:为生成的接口类生成一个父类(需自行定义编写父类)
<property name="rootInterface" value="study.lihw.demo.mybatis.MyRootInterface"/>
-->
</javaClientGenerator>
<!-- table; 表信息-->
<table schema="psychometricsdev" tableName="message"
domainObjectName="Message"
mapperName="MessageMapper"
enableInsert="true"
enableSelectByPrimaryKey="true"
enableUpdateByPrimaryKey="true"
enableDeleteByPrimaryKey="true"
enableSelectByExample="false"
enableDeleteByExample="false"
enableCountByExample="false"
enableUpdateByExample="false"
modelType="flat"
escapeWildcards="false"
delimitIdentifiers="false"
delimitAllColumns="false">
<!-- constructorBased: 是否生成全惨构造器 -->
<property name="constructorBased" value="false" />
<property name="ignoreQualifiersAtRuntime" value="false" />
<property name="immutable" value="false" />
<!-- modelOnly: 仅生成 java model 文件,不生成 sql mapper xml 文件-->
<property name="modelOnly" value="false" />
<!-- 在生成 mapper xml 文件时,使用 run*设置的数据库、表名名组织 SQL 语句
<property name="runtimeCatalog" value="false" />
<property name="runtimeSchema" value="false" />
<property name="runtimeTableName" value="false" />
-->
<!-- useActualColumnNames: 使用列名,不进行小驼峰转换 -->
<property name="useActualColumnNames" value="false" />
<property name="useCompoundPropertyNames" value="false" />
<!-- generatedKey : 在 insert 语句中插入 <selectKey>
<generatedKey column ="" sqlStatement="MySql" identity="false"></generatedKey>
-->
<!--
domainObjectRenamingRule : 实体类名重命名规则,一般上可用于去掉前缀
<domainObjectRenamingRule searchString="正则表达式" replaceString="替换后的字符串"></domainObjectRenamingRule>
-->
<!-- columnRenamingRule : 列名重命名规则,一般上可用于去掉前缀
<columnRenamingRule searchString="正则表达式" replaceString="替换后的字符串"></columnRenamingRule>
-->
<!--
<columnOverride column="列名"
property="domain 属性名的重命名" javaType="全限定名" jdbcType="JDBC使用的数据类型" typeHandler="实现 TypeHandler 接口的实现类"
isGeneratedAlways = "false">
forceJavaTypeIntoMapping : 增加 java 类型到映射中
<property name="forceJavaTypeIntoMapping" value="false" />
trimStrings: 对数据库返回的 CHAR 进行 trim 操作
<property name="trimStrings" value="false" />
</columnOverride>
-->
<!-- ignoreColumn : 忽略某些列,不进行生成
<ignoreColumn column="列名"></ignoreColumn>
-->
</table>
</context>
</generatorConfiguration>
- 运行
配置 maven 运行:
选择项目,并输入运行命令:
-Dmybatis.generator.overwrite=true mybatis-generator:generate -f pom.xml
点击【OK】,配置完成。然后,点击运行
- 运行结果:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------< study.lihw:generator >------------------------
[INFO] Building generator 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- mybatis-generator-maven-plugin:1.4.2:generate (default-cli) @ generator ---
[WARNING] Existing file C:\work\code\gitee\demo\mybatis\generator\src\main\java\study\lihw\demo\mybatis\model\Message.java was overwritten
[WARNING] Existing file C:\work\code\gitee\demo\mybatis\generator\src\main\java\study\lihw\demo\mybatis\mapper\MessageMapper.java was overwritten
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.681 s
[INFO] Finished at: 2023-08-09T14:23:06+08:00
[INFO] ------------------------------------------------------------------------
Process finished with exit code 0
java代码方式
- 引入jar
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
- 添加 src/main/resources/generatorConfig.xml
点击查看 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>
<!-- mybatis code generator 配置文件 -->
<!-- xml 配置参考地址:https://mybatis.org/generator/configreference/xmlconfig.html -->
<!-- properties : 加载 properties 文件,其他地方可通过 ${property} 引用文件中的属性配置
<properties resource="com/myproject/generatorConfig.properties"></properties>
<properties url="file:///C:/myfolder/generatorConfig.properties"></properties>
-->
<!-- classPathEntry : 指定 jar包位置,例如 jdbc驱动包
<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
-->
<!-- context。targetRuntime:指定代码模板,这里指定 MyBatis3 -->
<context id="context1" targetRuntime="MyBatis3">
<!-- javaFileEncoding: 指定生成的 java 文件编码 -->
<property name="javaFileEncoding" value="UTF-8"></property>
<property name="projectPath" value="C:\work\code\gitee\demo\mybatis\generator"></property>
<!-- jdbcConnection : 定义数据库连接信息 -->
<jdbcConnection
connectionURL="jdbc:mysql://localhost:3306/psychometricsdev"
driverClass="com.mysql.cj.jdbc.Driver"
password="black"
userId="black"/>
<javaTypeResolver>
<!-- forceBigDecimals: 是否数据库类型为数值时强制使用 BigDecimal -->
<property name="forceBigDecimals" value="false" />
<!-- useJSR310Types : 是否使用 JSR-310 标准的日期类型 -->
<property name="useJSR310Types" value="false" />
</javaTypeResolver>
<!--
targetProject: java 模型代码存放于哪个项目
targetPackage: java 模型代码存放于哪个包下
-->
<javaModelGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\java" targetPackage="study.lihw.demo.mybatis.model" >
<!-- constructorBased: 是否生成全惨构造器 -->
<property name="constructorBased" value="false" />
<!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.mybatis.model.blackdb.*Mapper.java -->
<property name="enableSubPackages" value="false" />
<!-- immutable: 生成的 java class 是不可变对象,即没有 setter 方法并且所有参数只能从构造器传入 -->
<property name="immutable" value="false" />
<!-- rootClass: java model 对象的父类
<property name="rootClass" value="com.mycompany.MyRootClass" />
-->
<!-- trimStrings: 对数据库返回的 CHAR 进行 trim 操作 -->
<property name="trimStrings" value="false" />
<!-- exampleTargetPackage,exampleTargetProject : 示例代码是否需要和 model 分离,单独存放
<property name="exampleTargetPackage" value="false" />
<property name="exampleTargetProject" value="false" />
-->
</javaModelGenerator>
<!-- sqlMapGenerator : 生成 mapper.xml 文件 -->
<sqlMapGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\resources" targetPackage="mapper" >
<!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.demo.mybatis.model.blackdb.*Mapper.xml -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- javaClientGenerator : 生成 MessageMapper 接口类
javaClientGenerator.type: 当 targetRuntime=MyBatis3 时,可选值 ANNOTATEDMAPPER( mybatis 3.0.4+)、MIXEDMAPPER、XMLMAPPER
-->
<javaClientGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\java" targetPackage="study.lihw.demo.mybatis.mapper" type="XMLMAPPER">
<!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.demo.mybatis.model.blackdb.*Interface.java -->
<property name="enableSubPackages" value="false" />
<!-- rootInterface:为生成的接口类生成一个父类(需自行定义编写父类)
<property name="rootInterface" value="study.lihw.demo.mybatis.MyRootInterface"/>
-->
</javaClientGenerator>
<!-- table; 表信息-->
<table schema="psychometricsdev" tableName="message"
domainObjectName="Message"
mapperName="MessageMapper"
enableInsert="true"
enableSelectByPrimaryKey="true"
enableUpdateByPrimaryKey="true"
enableDeleteByPrimaryKey="true"
enableSelectByExample="false"
enableDeleteByExample="false"
enableCountByExample="false"
enableUpdateByExample="false"
modelType="flat"
escapeWildcards="false"
delimitIdentifiers="false"
delimitAllColumns="false">
<!-- constructorBased: 是否生成全惨构造器 -->
<property name="constructorBased" value="false" />
<property name="ignoreQualifiersAtRuntime" value="false" />
<property name="immutable" value="false" />
<!-- modelOnly: 仅生成 java model 文件,不生成 sql mapper xml 文件-->
<property name="modelOnly" value="false" />
<!-- 在生成 mapper xml 文件时,使用 run*设置的数据库、表名名组织 SQL 语句
<property name="runtimeCatalog" value="false" />
<property name="runtimeSchema" value="false" />
<property name="runtimeTableName" value="false" />
-->
<!-- useActualColumnNames: 使用列名,不进行小驼峰转换 -->
<property name="useActualColumnNames" value="false" />
<property name="useCompoundPropertyNames" value="false" />
<!-- generatedKey : 在 insert 语句中插入 <selectKey>
<generatedKey column ="" sqlStatement="MySql" identity="false"></generatedKey>
-->
<!--
domainObjectRenamingRule : 实体类名重命名规则,一般上可用于去掉前缀
<domainObjectRenamingRule searchString="正则表达式" replaceString="替换后的字符串"></domainObjectRenamingRule>
-->
<!-- columnRenamingRule : 列名重命名规则,一般上可用于去掉前缀
<columnRenamingRule searchString="正则表达式" replaceString="替换后的字符串"></columnRenamingRule>
-->
<!--
<columnOverride column="列名"
property="domain 属性名的重命名" javaType="全限定名" jdbcType="JDBC使用的数据类型" typeHandler="实现 TypeHandler 接口的实现类"
isGeneratedAlways = "false">
forceJavaTypeIntoMapping : 增加 java 类型到映射中
<property name="forceJavaTypeIntoMapping" value="false" />
trimStrings: 对数据库返回的 CHAR 进行 trim 操作
<property name="trimStrings" value="false" />
</columnOverride>
-->
<!-- ignoreColumn : 忽略某些列,不进行生成
<ignoreColumn column="列名"></ignoreColumn>
-->
</table>
</context>
</generatorConfiguration>
- 创建 study.lihw.demo.mybatis.generator.Generator.java
package study.lihw.demo.mybatis.generator;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* 通过 java code 配置 generator
* @author limo
* @date 2023-08-06 12:56
* @since 1.0.0
*/
public class Generator {
/**
* 使用 xml 文件配置,生成代码
* @param configFilePath
* @throws XMLParserException
* @throws IOException
* @throws InvalidConfigurationException
* @throws SQLException
* @throws InterruptedException
*/
public void generate(String configFilePath) throws XMLParserException, IOException, InvalidConfigurationException, SQLException, InterruptedException {
if(configFilePath.startsWith("classpath:")){
ClassLoader clazzLoader = Generator.class.getClassLoader();
String path = configFilePath.replace("classpath:","");
InputStream stream = clazzLoader.getResourceAsStream(path);
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(stream);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}else{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(new File(configFilePath));
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
}
- 创建 study.lihw.demo.mybatis.GeneratorTest.java
package study.lihw.demo.mybatis;
import org.junit.Test;
import study.lihw.demo.mybatis.generator.Generator;
/**
* @author limo
* @date 2023-08-07 23:20
* @since
*/
public class GeneratorTest {
@Test
public void testGenerator(){
Generator generator = new Generator();
String configFilePath = "classpath:generatorConfig.xml";
try {
generator.generate(configFilePath);
}catch (Throwable ex){
ex.printStackTrace();
}
}
}
- 运行 testGenerator 方法即可。