准备工作
eclipse配置好maven。
项目地址:https://github.com/mybatis/generator/
下载zip,解压,然后导入maven项目,只需要使用mybatis-generator-core项目,其他用不上。
然后右键选择项目,maven>Update Project
然后在mybatis-generator-core项目根目录下新建一个myGeneratorConfig.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="mysqlCcontext" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- 生成Equals和HashCode方法 -->
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
<!-- 生成Serializable静态属性 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<!-- 自定义注释生成器 -->
<commentGenerator type="org.mybatis.generator.api.MyCommentGenerator">
<!-- 是否去除自动生成的注释 -->
<property name="suppressAllComments" value="true" />
<!-- 是否去除自动生成的日期 -->
<property name="suppressDate" value="true" />
</commentGenerator>
<!-- useUnicode=true&characterEncoding=utf8 解决中文注释乱码问题 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/xxbs?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull" userId="root">
<!-- oracle获取表注释 <property name="remarksReporting" value="true"></property> -->
<!-- mysql获取表注释 -->
<property name="useInformationSchema" value="true"></property>
</jdbcConnection>
<!-- 指定vo类生成目录 -->
<javaModelGenerator targetPackage="tang.model" targetProject="E:\mybatis\auto\xxbs">
<!-- 不清楚啥意思,大概是去掉字段名和表名中的空格符 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 指定xml生成目录 -->
<sqlMapGenerator targetPackage="tang.xml" targetProject="E:\mybatis\auto\xxbs">
</sqlMapGenerator>
<!-- 指定dao类生成目录 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="tang.mapper" targetProject="E:\mybatis\auto\xxbs">
</javaClientGenerator>
<!-- 下面五个false是为了不生成 Example类 -->
<table tableName="%" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
然后新建一个java类org.mybatis.generator.api.MyCommentGenerator.java,,代码如下:
package org.mybatis.generator.api;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Set;
import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.InnerClass;
import org.mybatis.generator.api.dom.java.InnerEnum;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.XmlElement;
/**
* 自定义注释生成器
* @author tang
* @since 2019/6/23
*/
public class MyCommentGenerator implements CommentGenerator {
// 添加实体类类注释
@Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
topLevelClass.addJavaDocLine("/**");
if(introspectedTable.getRemarks()!=null&&!introspectedTable.getRemarks().trim().isEmpty()) {
topLevelClass.addJavaDocLine(" * "+introspectedTable.getRemarks() + (introspectedTable.getRemarks().endsWith("表") ? "" : "表") + "[" + introspectedTable.getFullyQualifiedTable() + "]实体类");
}else {
topLevelClass.addJavaDocLine(" * [" + introspectedTable.getFullyQualifiedTable() + "]实体类");
}
topLevelClass.addJavaDocLine(" * @author "+System.getProperty("user.name"));
topLevelClass.addJavaDocLine(" * @since "+(new SimpleDateFormat("yyyy-MM-dd")).format(new Date()));
topLevelClass.addJavaDocLine(" */");
}
// 添加实体类属性注释
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if(introspectedColumn.getRemarks()!=null&&!introspectedColumn.getRemarks().trim().isEmpty()) {
field.addJavaDocLine("/**");
field.addJavaDocLine(" * "+introspectedColumn.getRemarks());
field.addJavaDocLine(" */");
}
}
@Override
public void addConfigurationProperties(Properties properties) {
}
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
}
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
}
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
}
@Override
public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
}
@Override
public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
@Override
public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
@Override
public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
}
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
}
@Override
public void addComment(XmlElement xmlElement) {
}
@Override
public void addRootComment(XmlElement rootElement) {
}
@Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> imports) {
}
@Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> imports) {
}
@Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> imports) {
}
@Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> imports) {
}
@Override
public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> imports) {
}
}
然后修改ShellRunner.java,下面是已经改好的org.mybatis.generator.api.ShellRunner.java:
/**
* Copyright ${license.git.copyrightYears} the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mybatis.generator.api;
import static org.mybatis.generator.internal.util.messages.Messages.getString;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.Context;
import org.mybatis.generator.config.JavaModelGeneratorConfiguration;
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 org.mybatis.generator.logging.LogFactory;
/**
* This class allows the code generator to be run from the command line.
*
* @author Jeff Butler
*/
public class ShellRunner {
private static final String CONFIG_FILE = "-configfile"; //$NON-NLS-1$
private static final String OVERWRITE = "-overwrite"; //$NON-NLS-1$
private static final String CONTEXT_IDS = "-contextids"; //$NON-NLS-1$
private static final String TABLES = "-tables"; //$NON-NLS-1$
private static final String VERBOSE = "-verbose"; //$NON-NLS-1$
private static final String FORCE_JAVA_LOGGING = "-forceJavaLogging"; //$NON-NLS-1$
private static final String HELP_1 = "-?"; //$NON-NLS-1$
private static final String HELP_2 = "-h"; //$NON-NLS-1$
public static void main(String[] args) {
if (args.length == 0) {
usage();
System.exit(0);
return; // only to satisfy compiler, never returns
}
Map<String, String> arguments = parseCommandLine(args);
if (arguments.containsKey(HELP_1)) {
usage();
System.exit(0);
return; // only to satisfy compiler, never returns
}
if (!arguments.containsKey(CONFIG_FILE)) {
writeLine(getString("RuntimeError.0")); //$NON-NLS-1$
return;
}
List<String> warnings = new ArrayList<>();
String configfile = arguments.get(CONFIG_FILE);
File configurationFile = new File(configfile);
if (!configurationFile.exists()) {
writeLine(getString("RuntimeError.1", configfile)); //$NON-NLS-1$
return;
}
Set<String> fullyqualifiedTables = new HashSet<>();
if (arguments.containsKey(TABLES)) {
StringTokenizer st = new StringTokenizer(arguments.get(TABLES), ","); //$NON-NLS-1$
while (st.hasMoreTokens()) {
String s = st.nextToken().trim();
if (s.length() > 0) {
fullyqualifiedTables.add(s);
}
}
}
Set<String> contexts = new HashSet<>();
if (arguments.containsKey(CONTEXT_IDS)) {
StringTokenizer st = new StringTokenizer(
arguments.get(CONTEXT_IDS), ","); //$NON-NLS-1$
while (st.hasMoreTokens()) {
String s = st.nextToken().trim();
if (s.length() > 0) {
contexts.add(s);
}
}
}
try {
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configurationFile);
List<Context> myContexts= config.getContexts();
for (Context context : myContexts) {
JavaModelGeneratorConfiguration configuration = context.getJavaModelGeneratorConfiguration();
String property = configuration.getTargetProject();
System.err.println("每次运行先清空目录,不然会生成重复的1、2、3、4这种文件>>>>>>>>>>>>>>>>>>>>>>>"+property);
deleteFile(new File(property));
new File(property).mkdirs();
}
DefaultShellCallback shellCallback = new DefaultShellCallback(
arguments.containsKey(OVERWRITE));
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings);
ProgressCallback progressCallback = arguments.containsKey(VERBOSE) ? new VerboseProgressCallback()
: null;
myBatisGenerator.generate(progressCallback, contexts, fullyqualifiedTables);
} catch (XMLParserException e) {
writeLine(getString("Progress.3")); //$NON-NLS-1$
writeLine();
for (String error : e.getErrors()) {
writeLine(error);
}
return;
} catch (SQLException e) {
e.printStackTrace();
return;
} catch (IOException e) {
e.printStackTrace();
return;
} catch (InvalidConfigurationException e) {
writeLine(getString("Progress.16")); //$NON-NLS-1$
for (String error : e.getErrors()) {
writeLine(error);
}
return;
} catch (InterruptedException e) {
// ignore (will never happen with the DefaultShellCallback)
}
for (String warning : warnings) {
writeLine(warning);
}
if (warnings.size() == 0) {
writeLine(getString("Progress.4")); //$NON-NLS-1$
} else {
writeLine();
writeLine(getString("Progress.5")); //$NON-NLS-1$
}
}
private static boolean exists(File file) {
return file != null && file.exists();
}
private static void deleteFile(File file) {
if (!exists(file)) {
return;
}
if (file.isDirectory()) {
File[] listFiles = file.listFiles();
for (int i = 0; i < listFiles.length; i++) {
deleteFile(listFiles[i]);
}
// Files.delete(file.toPath());
file.delete();// 删除空目录
} else {
file.delete();// 删除文件
}
}
private static void usage() {
String lines = getString("Usage.Lines"); //$NON-NLS-1$
int intLines = Integer.parseInt(lines);
for (int i = 0; i < intLines; i++) {
String key = "Usage." + i; //$NON-NLS-1$
writeLine(getString(key));
}
}
private static void writeLine(String message) {
System.out.println(message);
}
private static void writeLine() {
System.out.println();
}
private static Map<String, String> parseCommandLine(String[] args) {
List<String> errors = new ArrayList<>();
Map<String, String> arguments = new HashMap<>();
for (int i = 0; i < args.length; i++) {
if (CONFIG_FILE.equalsIgnoreCase(args[i])) {
if ((i + 1) < args.length) {
arguments.put(CONFIG_FILE, args[i + 1]);
} else {
errors.add(getString(
"RuntimeError.19", CONFIG_FILE)); //$NON-NLS-1$
}
i++;
} else if (OVERWRITE.equalsIgnoreCase(args[i])) {
arguments.put(OVERWRITE, "Y"); //$NON-NLS-1$
} else if (VERBOSE.equalsIgnoreCase(args[i])) {
arguments.put(VERBOSE, "Y"); //$NON-NLS-1$
} else if (HELP_1.equalsIgnoreCase(args[i])) {
arguments.put(HELP_1, "Y"); //$NON-NLS-1$
} else if (HELP_2.equalsIgnoreCase(args[i])) {
// put HELP_1 in the map here too - so we only
// have to check for one entry in the mainline
arguments.put(HELP_1, "Y"); //$NON-NLS-1$
} else if (FORCE_JAVA_LOGGING.equalsIgnoreCase(args[i])) {
LogFactory.forceJavaLogging();
} else if (CONTEXT_IDS.equalsIgnoreCase(args[i])) {
if ((i + 1) < args.length) {
arguments.put(CONTEXT_IDS, args[i + 1]);
} else {
errors.add(getString(
"RuntimeError.19", CONTEXT_IDS)); //$NON-NLS-1$
}
i++;
} else if (TABLES.equalsIgnoreCase(args[i])) {
if ((i + 1) < args.length) {
arguments.put(TABLES, args[i + 1]);
} else {
errors.add(getString("RuntimeError.19", TABLES)); //$NON-NLS-1$
}
i++;
} else {
errors.add(getString("RuntimeError.20", args[i])); //$NON-NLS-1$
}
}
if (!errors.isEmpty()) {
for (String error : errors) {
writeLine(error);
}
System.exit(-1);
}
return arguments;
}
}
然后在eclipse运行项目:
右键选中项目,run as>maven build
或者点eclipse顶部的运行按钮右侧的小箭头,run configurations>选中maven build右键>new configuration。
base directory 点击workspace选mybatis-generator-core项目
goals填入:exec:java -Dexec.mainClass="org.mybatis.generator.api.ShellRunner" -Dexec.args="-configfile E:\workspace\eclipse\MyBatisGenerator\mybatis-generator-core\myGeneratorConfig.xml"
然后点run按钮即可