在使用mybatis時總是要生成實體類,mapper以及常用的mapper.xml文件,手寫既沒有技術含量還浪費時間,所以使用generator生成器會很方便。
pom.xml配置:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
generator.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" defaultModelType="flat">
<property name="autoDelimitKeywords" value="true" />
<property name="beginningDelimiter" value="`" />
<property name="endingDelimiter" value="`" />
<plugin type="com.weiqu.video.dao.generator.PaginationPlugin"></plugin>
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<plugin type="com.weiqu.video.dao.generator.DeleteByExampleMysqlBugFixedPlugin"></plugin>
<!--覆蓋生成XML文件-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/longvideo?autoReconnect=true&failOverReadOnly=false&characterEncoding=UTF-8"
userId="root" password="root" />
<javaModelGenerator targetPackage="com.dao.model.test" targetProject="../model/src/main/java" />
<sqlMapGenerator targetPackage="mapper.test" targetProject="../model/src/main/resources" />
<javaClientGenerator targetPackage="com.dao.mapper.video" targetProject="../dao/src/main/java" type="XMLMAPPER" />
<table tableName="wx_test" domainObjectName="WxTest" alias=""></table>
</context>
</generatorConfiguration>
DeleteByExampleMysqlBugFixedPlugin.java
package com.weiqu.video.dao.generator;
import java.util.Iterator;
import java.util.List;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.xml.Element;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;
public class DeleteByExampleMysqlBugFixedPlugin extends PluginAdapter {
public boolean validate(List<String> warnings) {
return true;
}
@Override
public boolean sqlMapDeleteByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
List<Element> elements = element.getElements();
Iterator<Element> it = elements.iterator();
while (it.hasNext()) {
Element e = it.next();
if (e instanceof TextElement) {
String content = ((TextElement) e).getContent();
if (content.contains("delete from")) {
it.remove();
break;
}
}
}
StringBuilder sb = new StringBuilder();
sb.append("delete from "); //$NON-NLS-1$
sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());
element.addElement(elements.size() - 1, new TextElement(sb.toString()));
return true;
}
}
PaginationPlugin.java
package com.weiqu.video.dao.generator;
import java.util.List;
import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.JavaVisibility;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;
public class PaginationPlugin extends PluginAdapter {
@Override
public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
addPage(topLevelClass, introspectedTable, "page");
return super.modelExampleClassGenerated(topLevelClass, introspectedTable);
}
@Override
public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
IntrospectedTable introspectedTable) {
XmlElement page = new XmlElement("if");
page.addAttribute(new Attribute("test", "page != null"));
page.addElement(new TextElement("limit #{page.offset} , #{page.pageSize}"));
element.addElement(page);
return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable);
}
@Override
public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element,
IntrospectedTable introspectedTable) {
XmlElement page = new XmlElement("if");
page.addAttribute(new Attribute("test", "page != null"));
page.addElement(new TextElement("limit #{page.offset} , #{page.pageSize}"));
element.addElement(page);
return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable);
}
/**
* @param topLevelClass
* @param introspectedTable
* @param name
*/
private void addPage(TopLevelClass topLevelClass, IntrospectedTable introspectedTable, String name) {
topLevelClass.addImportedType(new FullyQualifiedJavaType("com.weiqu.video.common.util.Page"));
CommentGenerator commentGenerator = context.getCommentGenerator();
Field field = new Field();
field.setVisibility(JavaVisibility.PROTECTED);
field.setType(new FullyQualifiedJavaType("com.weiqu.video.common.util.Page"));
field.setName(name);
commentGenerator.addFieldComment(field, introspectedTable);
topLevelClass.addField(field);
char c = name.charAt(0);
String camel = Character.toUpperCase(c) + name.substring(1);
Method method = new Method();
method.setVisibility(JavaVisibility.PUBLIC);
method.setName("set" + camel);
method.addParameter(new Parameter(new FullyQualifiedJavaType("com.weiqu.video.common.util.Page"), name));
method.addBodyLine("this." + name + "=" + name + ";");
commentGenerator.addGeneralMethodComment(method, introspectedTable);
topLevelClass.addMethod(method);
method = new Method();
method.setVisibility(JavaVisibility.PUBLIC);
method.setReturnType(new FullyQualifiedJavaType("com.weiqu.video.common.util.Page"));
method.setName("get" + camel);
method.addBodyLine("return " + name + ";");
commentGenerator.addGeneralMethodComment(method, introspectedTable);
topLevelClass.addMethod(method);
}
public boolean validate(List<String> arg0) {
return true;
}
}
MybatisGeneratorMain.java
package com.weiqu.video.dao.generator;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
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.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
public class MybatisGeneratorMain {
public static void main(String[] args)
throws SQLException, IOException, InterruptedException, InvalidConfigurationException, XMLParserException {
List<String> warnings = new ArrayList<String>();
/**
* 這裏千萬要注意!!哪些分表生成的XML,一般不要動!帶生成後,把表名改成邏輯名,並且遷移到 mapper的shard目錄下
*/
boolean overwrite = true;
// 視頻模塊
File configFile = new File(MybatisGeneratorMain.class.getResource("/generator/generator.xml").getFile());
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);
System.out.println("genreate finish");
}
}
每次運行MybatisGeneratorMain中的main方法就能重新生成實體類,mapper和xml文件,這也是需要注意的地方,千萬不要在自動生成的mapper.xml中手寫sql,要不在重新運行時覆蓋掉你寫的sql。所以在需要寫新sql時需要重新自己寫一個mapper和xml類,然後使用extends繼承自動生成BaseResultMap,這樣在有字段新增時就不用維護兩個xml了:
<resultMap id="BaseWxUserVideoResultMap" type="com.weiqu.video.dao.model.video.WxVideo"
extends="com.weiqu.video.dao.mapper.video.WxVideoMapper.BaseResultMap">
</resultMap>