Mybatis学习日记(六)——Mybatis代码生成器

版权声明:未经本人同意,禁止擅自转载 https://blog.csdn.net/shusheng0516/article/details/82317139

 

在使用Mybatis的过程中,我们知道需要为每个表创建对应的实体类,而一旦表的字段很多的话,实体类的创建就非常麻烦,而且是重复的体力劳动,没有任何营养,所以我们需要利用一些现有的工具来减少这些重复的操作。Mybatis提供了一个很强大的代码生成器——Mybatis Generator,它可以通过用户不同的配置生成不同类型的代码。接下来我们将简单的介绍这个代码生成器的用法。


一.添加Mybatis Generator的jar包

要使用代码生成器,首先需要将其jar包添加到项目中,由于我们创建的是maven项目,所以我们可以直接使用maven的方式引入对应的依赖,在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.4</version>
</dependency>

代码生成器的版本和Mybatis的版本没有直接关系,但是不同代码生成器的版本包含的参数可能会不同,这里我使用的是1.3.4的版本。


二.准备数据库的表

由于使用mybatis代码生成器会覆盖掉原有的代码,所以我们创建一个新的数据库,并在其中添加学生信息表如下:


三.代码生成器配置

我们在此创建一个简单的代码生成器配置,以方便学习。首先在项目src/main/resources中创建一个generator目录,在该目录下创建一个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="MySqlContext" targetRuntime="MyBatis3Simple"
			 defaultModelType="flat">
		<property name="beginningDelimiter" value="`"/>
		<property name="endingDelimiter" value="`"/>
	
		<commentGenerator>
			<property name="suppressDate" value="true"/>
			<property name="addRemarkComments" value="true"/>
		</commentGenerator>
		
		<jdbcConnection driverClass="com.mysql.jdbc.Driver" 
						connectionURL="jdbc:mysql://localhost:3306/mybatis2"
						userId="root"
						password="123456">
		</jdbcConnection>
		
		<javaModelGenerator targetPackage="test.model" 
							targetProject="src\main\java">
			<property name="trimStrings" value="true"/>
		</javaModelGenerator>
		
		<sqlMapGenerator targetPackage="test.dao" targetProject="src\main\java"/>
		
		<table tableName="%">
			<generatedKey column="stu_id" sqlStatement="MySql"/>
		</table>
	</context>
</generatorConfiguration>

简单认识一下配置文件中的各个标签:

1.context标签:该标签用于指定生成一组对象的环境,至少配置一个,也可以配置多个。它只有一个必选属性id,用来确定该标签,还有defalutModelType,targetRuntime,introspectedColumnImpl等属性。其中defaultModelType属性定义了如何生成实体类,有3个选项conditional、flat、hierarchical分别指的是如果一个表的主键只有一个字段,那么会将该字段合并到基本实体类中(conditional);为每张表生成一各实体类(flat);如果表有主键,那么会产生一个单独的主键实体类(hierarchical)。targetRuntime属性指定生成的代码的运行时环境,有两个选项MyBatis3和MyBatis3Simple两个选项,后者不会生成与Example相关的方法。

2.property标签:该标签是context的子标签,该标签可以配置数据库的分隔符和java文件的编码,在该例子中主要使用它的前后分隔符属性,因为mysql中的分隔符是`,所以将其前后分隔符都设置成`。

3.commentGenerator标签:该标签是context的子标签,用来配置如何生成注释信息,最多可配置1个。该标签有一个可选属性type可以指定用户自己创建的注释生成类。提供了3个可选属性suppressAllComments,suppressDate,addRemarkComments分别用来阻止生成注释、阻止生成的注释包含时间戳、注释是否添加数据库表中的备注信息。

4.jdbcConnection标签:该标签配置了连接的数据库信息。

5.javaModelGenerator标签:该标签用来控制生成的实体类,必须配置一个。该标签中有两个必选属性targetPackage和targetProject,前者用来生成实体类存放的包名,后者用来指定目标项目路径。

6.sqlMapGenerator标签:该标签用来配置SQL映射生成器(Mapper.xml文件)的属性,其两个必选属性与javaModelGenerator标签的两个必须属性一致

7.javaClientGenerator标签:该标签用于配置Mapper接口的属性,如果不设置该标签,就不会生成Mapper接口。其中两个必选属性与上两个标签一致,还有一个type属性用来设置Mapper接口的生成器。

8.table标签:该标签很重要,用于配置需要通过内省数据库的表,只有在该标签中配置,才能生成最终的代码,至少要配置一个。该标签只有一个必选属性tableName指定要生成的表名,可以匹配多个表,如果要生成全部的表,使用%进行配置。table标签下的子标签众多,在这里就不一一赘述,感兴趣的伙伴可以去研究一下。只简单说明一下上例中的generatedKey标签用来指定自动生成主键的属性。


四.运行代码生成器

MyBatis Generator提供了很多种运行方式如java编写代码运行、命令行运行、使用maven Plugin运行、使用eclipse插件运行。在这里我们只介绍使用java代码运行,我们在项目中添加tk.mybatis.generator包,创建Generator.java类如下:

package tk.mybaits.generator;

import java.io.InputStream;
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;

/*
 * 读取代码生成器配置自动生成代码
 * */
public class Generator {

	public static void main(String[] args) throws Exception{
		//执行过程中的警告信息
		List<String> warnings = new ArrayList<String>();
		//生成的代码重复时,覆盖原代码
		boolean overwrite = true;
		//读取配置文件
		InputStream is = Generator.class.getResourceAsStream("/generator/generatorConfig.xml");
		ConfigurationParser cp = new ConfigurationParser(warnings);
		Configuration config = cp.parseConfiguration(is);
		is.close();
		
		DefaultShellCallback callback = new DefaultShellCallback(overwrite);
		//创建代码生成器
		MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback,warnings);
		//执行生成代码
		myBatisGenerator.generate(null);
		//输出警告信息
		for(String warning : warnings) System.out.println(warning);
	}
}

运行之后,系统会自动生成相应的代码。

 

 

 

 


五.其他

如果对系统自动生成的注释不满意,可以自己实现一个注释生成器类如下:

package tk.mybaits.generator;

import java.util.Properties;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.config.PropertyRegistry;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;

/*
 * 注释生成器
 * */
public class MyCommentGenerator extends DefaultCommentGenerator{

	//重新定义一遍子类参数,因为默认类中没有可以访问这些参数的方法
	private boolean suppressAllComments;
	private boolean addRemarkComments;
	
	//设置用户配置的参数
	public void addConfigurationProperties(Properties properties){
		//调用父类方法
		super.addConfigurationProperties(properties);
		//获取suppressAllComments参数值
		suppressAllComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
		addRemarkComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS));
	}

	//添加注释信息
	public void addFieldComment(Field field,
								IntrospectedTable introspectedTable,
								IntrospectedColumn introspectedColumn) {
		//阻止生成所有注释、直接返回
		if (suppressAllComments) {
			return;
		}
		
		field.addJavaDocLine("/**");
		//获取数据库中字段的备注信息
		String remarks = introspectedColumn.getRemarks();
		//根据参数和备注信息判断是否添加备注信息
		if (addRemarkComments && StringUtility.stringHasValue(remarks))
		{
			String[] remarkLines = remarks.split(System.getProperty("line. separatpr"));
			for (String remarkLine : remarkLines){
				field.addJavaDocLine(" * " + remarkLine);
			}
		}
		
		field.addJavaDocLine(" * " + introspectedColumn.getActualColumnName());
		field.addJavaDocLine(" */");
	}
	
	private boolean isTrue(String property) {
		// TODO Auto-generated method stub
		if (property.equals(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS)) return true;
		if (property.equals(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS)) return false;
		return false;
	}
	
}

然后在commentGenerator标签中加上type属性即可。


上一篇:Mybatis学习日记(五)——动态SQL第二部分

猜你喜欢

转载自blog.csdn.net/shusheng0516/article/details/82317139