可以帮助生成数据库中的entity,mapper和xmlmapper代码,当数据库字段多的时候,这个非常的方便,同时修改字段也是,只需要执行下代码即可
使用该功能,需要导入两个依赖:
compile group: 'org.mybatis.generator', name: 'mybatis-generator-core', version: '1.3.7' compile group: 'tk.mybatis', name: 'mapper', version: '4.1.5'
xml的配置文件:在test模块的resources包下:创建generator/codeGenerator.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="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<!-- caseSensitive默认false,当数据库表名区分大小写时,可以将该属性设置为true -->
<property name="caseSensitive" value="false"/>
</plugin>
<!--jdbc的连接信息-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/caraliu?serverTimezone=UTC"
userId="root"
password="123456">
</jdbcConnection>
<!--生成entity-->
<javaModelGenerator targetPackage="cn.yishijie.code.entity" targetProject="%s/src/main/java"/>
<!--生成xml文件-->
<sqlMapGenerator targetPackage="cn.yishijie.mybatis.mapper" targetProject="%s/src/main/resources"/>
<!--生成mapper文件-->
<javaClientGenerator targetPackage="cn.yishijie.code.mapper" targetProject="%s/src/main/java" type="MAPPER" />
<!--需要生成代码的数据表-->
<table tableName="animals" >
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
因为我这里是采用编码的方式产生,所以需要编码一部分:
package cn.yishijie.mybatis.mapper;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.*;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class CodeGenerator {
private static Logger logger = LoggerFactory.getLogger(CodeGenerator.class);
public static void main(String[] args) throws Exception{
List<String> warnings = new ArrayList<>();
ConfigurationParser cp = new ConfigurationParser(warnings);
// 读取配置文件
InputStream stream = CodeGenerator.class.getResourceAsStream("/generator/codeGenerator.xml");
Configuration config = cp.parseConfiguration(stream);
List<Context> contexts = config.getContexts();
if(CollectionUtils.isEmpty(contexts)){
logger.info("代码生成器的context为空!");
return;
}
// 设置代码生成路径,modelOnly是否只生生成数据entity和xml
if(!setCodePath(contexts, "false")){
return;
}
// 支持覆盖原来生成的代码
DefaultShellCallback callback = new DefaultShellCallback(Boolean.TRUE);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
// 出发生成代码的动作
myBatisGenerator.generate(null);
if(!warnings.isEmpty()){
for (String warning : warnings) {
logger.warn("代码生成警告信息:{}", warning);
}
}
}
public static boolean setCodePath(List<Context> contexts, String modelOnly){
// 获取项目的根路径
String contextPath = System.getProperty("user.dir");
contextPath = contextPath.replace("\\", "/");
Context context = contexts.get(0);
JavaClientGeneratorConfiguration javaCli = context.getJavaClientGeneratorConfiguration();
JavaModelGeneratorConfiguration javaModelGen = context.getJavaModelGeneratorConfiguration();
SqlMapGeneratorConfiguration sqlMapGen= context.getSqlMapGeneratorConfiguration();
javaCli.setTargetProject(String.format(javaCli.getTargetProject(), contextPath));
sqlMapGen.setTargetProject(String.format(sqlMapGen.getTargetProject(), contextPath));
javaModelGen.setTargetProject(String.format(javaModelGen.getTargetProject(), contextPath));
List<TableConfiguration> tableConfigurations = context.getTableConfigurations();
if(CollectionUtils.isEmpty(tableConfigurations)){
logger.error("没有需要生成的数据表,请指定相应的数据表!");
return Boolean.FALSE;
}
for (TableConfiguration tableConfiguration : tableConfigurations) {
tableConfiguration.addProperty("modelOnly", modelOnly);
}
return Boolean.TRUE;
}
}
上述需要注意的是:
1、如果第一次生成了文件,后续需要修改的时候,如果mapper文件有自定义的一些方法,如果直接执行会被覆盖,所以需要手工改下:modelOnly那个属性改为true;即可。这个时候会只修改entity和xml文件。即:setCodePath(contexts, "true")
2、这里编码的方式,扩展了下生成文件的路径,通过读取当前项目路径的方式,那么多人开发的时候,可以直接生成,而不用根据自己项目的绝对路径来每次修改。