在使用Mybatis的过程中,我们知道需要为每个表创建对应的实体类,而一旦表的字段很多的话,实体类的创建就非常麻烦,而且是重复的体力劳动,没有任何营养,所以我们需要利用一些现有的工具来减少这些重复的操作。Mybatis提供了一个很强大的代码生成器——Mybatis Generator,它可以通过用户不同的配置生成不同类型的代码。接下来我们将简单的介绍这个代码生成器的用法。
要使用代码生成器,首先需要将其jar包添加到项目中,由于我们创建的是maven项目,所以我们可以直接使用maven的方式引入对应的依赖,在pom.xml文件中添加如下依赖:
org.mybatis.generator
mybatis-generator-core
1.3.4
代码生成器的版本和Mybatis的版本没有直接关系,但是不同代码生成器的版本包含的参数可能会不同,这里我使用的是1.3.4的版本。
由于使用mybatis代码生成器会覆盖掉原有的代码,所以我们创建一个新的数据库,并在其中添加学生信息表如下:
我们在此创建一个简单的代码生成器配置,以方便学习。首先在项目src/main/resources中创建一个generator目录,在该目录下创建一个generatorConfig.xml文件如下:
简单认识一下配置文件中的各个标签:
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 warnings = new ArrayList();
//生成的代码重复时,覆盖原代码
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第二部分