Mybatis逆向工程生成代码

1.什么是逆向工程

            mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程可以针对单表自动生成实体类 ,dao方法还有 对应的xml文件

企业实际开发中,常用的逆向工程方式:由数据库的表生成java代码。,一定程度上提高开发效率

2.jar包

        导入mybatis相关jar包 以及 mybatis-generator-core(主要)

         <!-- mybatis-generator-core 反向生成java代码-->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>

        </dependency> 

3.配置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="testTables" targetRuntime="MyBatis3">

        <!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 -->
        <property name="javaFileEncoding" value="UTF-8" />
        
		<!-- JavaBean 实现 序列化 接口 -->
		<plugin type="org.mybatis.generator.plugins.SerializablePlugin">
		</plugin>

		<!-- genenat entity时,生成toString -->
		<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />

		<!-- generate entity时,生成hashcode和equals方法 -->
		<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />

		<!-- 此处是将Example改名为Query -->
		<plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
			<property name="searchString" value="Example$" />
			<!-- 替换后 <property name="replaceString" value="Criteria" /> -->
			<property name="replaceString" value="Query" />
		</plugin>
		<!-- 此处是将UserMapper.xml改名为UserDao.xml ,不建议使用
		<plugin type="org.mybatis.generator.plugins.rename.RenameSqlMapperPlugin">
			<property name="searchString" value="Mapper" />
			<property name="replaceString" value="PlatformUserMysqlDao" />
		</plugin>

		此处是将UserMapper改名为UserDao 接口 
		<plugin type="org.mybatis.generator.plugins.rename.RenameJavaMapperPlugin">
			<property name="searchString" value="Mapper$" />
			<property name="replaceString" value="PlatformUserDao" />
		</plugin>
-->
		<commentGenerator type="genaretor.MyCommentGenerator"> <!--自己重写注释方法,生成中文注释 -->
			<!-- 是否去除自动生成的注释 true:是 : false:否 <property name="suppressAllComments" 
				value="true" /> <property name="suppressDate" value="true"/> -->
		</commentGenerator>

		<!--数据库连接的信息:驱动类、连接地址、用户名、密码 
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://127.0.0.1:3306/platform_web"
			userId="name" password="pwd">
		</jdbcConnection>
		-->
		<jdbcConnection driverClass="oracle.jdbc.OracleDriver" 
		          connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:orcl" 
			      userId="name" password="pwd"> 
			 </jdbcConnection> 


		<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 
			和 NUMERIC 类型解析为java.math.BigDecimal -->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

		<!-- targetProject:生成PO类的位置 -->
		<javaModelGenerator targetPackage="com.test.model"
			targetProject=".\src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
		
		<!-- targetProject:mapper映射文件生成的位置 -->
		<sqlMapGenerator targetPackage="com.test.mapper"
			targetProject=".\src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>
		
		<!-- targetPackage:dao接口生成的位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="com.test.dao" targetProject=".\src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>
		
		
		<!-- 指定数据库表 domainObjectName 生成实体类名称, mapperName:dao方法名称-->
		<table schema="" tableName="sys_user" domainObjectName="PlatformUserDo"  mapperName="PlatfromUserDao"			
		    enableCountByExample="false" enableUpdateByExample="false"
			enableDeleteByExample="false" enableSelectByExample="false"
			selectByExampleQueryId="false"></table>

		<!-- 有些表的字段需要指定java类型  
		<table schema="" tableName="sys_user"> <columnOverride column="" 
			javaType="" jdbcType=""/> </table>
			--> 
	</context>
</generatorConfiguration>

看注释说明自定义配置

4.自己写类调用main方法

public class Generator {

    public void generator() throws Exception{

        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        //指定 逆向工程配置文件
        File configFile = new File("generator.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);

    } 
    public static void main(String[] args) throws Exception {
        try {
            Generator generatorSqlmap = new Generator();
            generatorSqlmap.generator();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}



package genaretor;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

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.*;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.MergeConstants;
import org.mybatis.generator.config.PropertyRegistry;
import org.mybatis.generator.internal.util.StringUtility;

public class MyCommentGenerator implements CommentGenerator {

    private Properties properties;
    private Properties systemPro;
    private boolean suppressDate;
    private boolean suppressAllComments;
    private String currentDateStr;

    public MyCommentGenerator() {
	super();
	properties = new Properties();
	systemPro = System.getProperties();
	suppressDate = false;
	suppressAllComments = false;
	currentDateStr = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date());
    }

    public void addJavaFileComment(CompilationUnit compilationUnit) {
	// add no file level comments by default
	return;
    }

    /** 
     * Adds a suitable comment to warn users that the element was generated, and 
     * when it was generated. 
     */
    public void addComment(XmlElement xmlElement) {
	return;
    }

    public void addRootComment(XmlElement rootElement) {
	// add no document level comments by default
	return;
    }

    public void addConfigurationProperties(Properties properties) {
	this.properties.putAll(properties);

	suppressDate = StringUtility.isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));

	suppressAllComments = StringUtility.isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
    }

    /** 
     * This method adds the custom javadoc tag for. You may do nothing if you do 
     * not wish to include the Javadoc tag - however, if you do not include the 
     * Javadoc tag then the Java merge capability of the eclipse plugin will 
     * break. 
     * 
     * @param javaElement the java element 
     */
    protected void addJavadocTag(JavaElement javaElement, boolean markAsDoNotDelete) {
	javaElement.addJavaDocLine(" *");
	StringBuilder sb = new StringBuilder();
	sb.append(" * ");
	sb.append(MergeConstants.NEW_ELEMENT_TAG);
	if (markAsDoNotDelete) {
	    sb.append(" do_not_delete_during_merge");
	}
	String s = getDateString();
	if (s != null) {
	    sb.append(' ');
	    sb.append(s);
	}
	javaElement.addJavaDocLine(sb.toString());
    }

    /** 
     * This method returns a formated date string to include in the Javadoc tag 
     * and XML comments. You may return null if you do not want the date in 
     * these documentation elements. 
     * 
     * @return a string representing the current timestamp, or null 
     */
    protected String getDateString() {
	String result = null;
	if (!suppressDate) {
	    result = currentDateStr;
	}
	return result;
    }

    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
	    return;
	}
	StringBuilder sb = new StringBuilder();
	innerClass.addJavaDocLine("/**");
	sb.append(" * ");
	sb.append(introspectedTable.getFullyQualifiedTable());
	sb.append(" ");
	sb.append(getDateString());
	innerClass.addJavaDocLine(sb.toString());
	innerClass.addJavaDocLine(" */");
    }

    public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
	    return;
	}

	StringBuilder sb = new StringBuilder();

	innerEnum.addJavaDocLine("/**");
	// addJavadocTag(innerEnum, false);
	sb.append(" * ");
	sb.append(introspectedTable.getFullyQualifiedTable());
	innerEnum.addJavaDocLine(sb.toString());
	innerEnum.addJavaDocLine(" */");
    }

    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
	if (suppressAllComments) {
	    return;
	}

	StringBuilder sb = new StringBuilder();

	field.addJavaDocLine("/**");
	sb.append(" * ");
	sb.append(introspectedColumn.getRemarks());
	field.addJavaDocLine(sb.toString());

	// addJavadocTag(field, false);

	field.addJavaDocLine(" */");
    }

    public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
	    return;
	}

	StringBuilder sb = new StringBuilder();

	field.addJavaDocLine("/**");
	sb.append(" * ");
	sb.append(introspectedTable.getFullyQualifiedTable());
	field.addJavaDocLine(sb.toString());
	field.addJavaDocLine(" */");
    }

    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {

    }

    public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
	    return;
	}
	method.addJavaDocLine("/**");
	//addJavadocTag(method, t);
	method.addJavaDocLine(" */");
    }

//    public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
//	if (suppressAllComments) {
//	    return;
//	}
//
//	method.addJavaDocLine("/**");
//
//	StringBuilder sb = new StringBuilder();
//	sb.append(" * ");
//	sb.append(introspectedColumn.getRemarks());
//	method.addJavaDocLine(sb.toString());
//
//	sb.setLength(0);
//	sb.append(" * @return ");
//	sb.append(introspectedColumn.getActualColumnName());
//	sb.append(" ");
//	sb.append(introspectedColumn.getRemarks());
//	method.addJavaDocLine(sb.toString());
//
//	// addJavadocTag(method, false);
//
//	method.addJavaDocLine(" */");
//    }

//    public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
//	if (suppressAllComments) {
//	    return;
//	}
//
//	method.addJavaDocLine("/**");
//	StringBuilder sb = new StringBuilder();
//	sb.append(" * ");
//	sb.append(introspectedColumn.getRemarks());
//	method.addJavaDocLine(sb.toString());
//
//	Parameter parm = method.getParameters().get(0);
//	sb.setLength(0);
//	sb.append(" * @param ");
//	sb.append(parm.getName());
//	sb.append(" ");
//	sb.append(introspectedColumn.getRemarks());
//	method.addJavaDocLine(sb.toString());
//
//	// addJavadocTag(method, false);
//
//	method.addJavaDocLine(" */");
//    }

    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
	if (suppressAllComments) {
	    return;
	}

	StringBuilder sb = new StringBuilder();

	innerClass.addJavaDocLine("/**");
	sb.append(" * ");
	sb.append(introspectedTable.getFullyQualifiedTable());
	innerClass.addJavaDocLine(sb.toString());

	sb.setLength(0);
	sb.append(" * @author ");
	sb.append(systemPro.getProperty("user.name"));
	sb.append(" ");
	sb.append(currentDateStr);

	addJavadocTag(innerClass, markAsDoNotDelete);

	innerClass.addJavaDocLine(" */");
    }

    @Override
    public void addGetterComment(Method arg0, IntrospectedTable arg1, IntrospectedColumn arg2) {
	// TODO Auto-generated method stub
	
    }

    @Override
    public void addSetterComment(Method arg0, IntrospectedTable arg1, IntrospectedColumn arg2) {
	// TODO Auto-generated method stub
	
    }


}

 
 

5.备注

    逆向工程局限很大,多表关联需自己手动写sql。使用逆向工程最好自己先建一个测试项目,将生成的代码cv大法,以免出错!欢迎留言评论



猜你喜欢

转载自blog.csdn.net/weixin_42184707/article/details/80280301