设为首页 收藏本站
查看: 987|回复: 0

[经验分享] mybatis代码生成器避免生成Example类的配置参数

[复制链接]

尚未签到

发表于 2016-11-28 06:11:39 | 显示全部楼层 |阅读模式
<?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>
<classPathEntry location="d://java//sqljdbc4.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3">
<property name="suppressTypeWarnings" value="true" />
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin" />
<plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
<property name="searchString" value="Example$" />
<property name="replaceString" value="Criteria" />
</plugin>
<plugin type="com.shinowit.mybatis.plugin.SelectByPagePlugin" />
<plugin type="com.shinowit.mybatis.plugin.Struts2ActionPlugin" />
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
connectionURL="jdbc:sqlserver://localhost:1433;databaseName=OSS;"
userId="sa" password="sasa">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="com.shinowit.model"
targetProject="src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.shinowit.dao.mapper"
targetProject="src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.shinowit.dao.mapper" targetProject="src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>

<table tableName="TBa_MemberInfo">
<generatedKey column="ID" sqlStatement="SqlServer"
identity="true" />
</table>
<table tableName="TBa_SupplyRecordInfo">
<generatedKey column="ID" sqlStatement="SqlServer"
identity="true" />
</table>
</context>
</generatorConfiguration>


  其实想要mybaits代码生成器生成Example类换个名字,是通过插件实现的,即下面的这个插件配置参数很关键。

<plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
<property name="searchString" value="Example$" />
<property name="replaceString" value="Criteria" />
</plugin>

  如果不喜欢生成的代码中带有代理的mybatis代码生成器的注解信息,可以配置下面的配置参数关闭注解信息的生成:

<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>

  上面示例中的分页代码自动生成插件是我自己写的,用于自动生成数据库物理分页的代码。
  该插件的源码如下:

package com.shinowit.mybatis.plugin;
import static org.mybatis.generator.internal.util.messages.Messages.getString;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.mybatis.generator.api.IntrospectedColumn;
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.Interface;
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.Document;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
public class SelectByPagePlugin extends PluginAdapter {
@Override
public boolean validate(List<String> warnings) {
return true;
}
private void addField(String fieldName, FullyQualifiedJavaType fieldType,
TopLevelClass topLevelClass) {
Field tmpField = new Field(fieldName, fieldType);
tmpField.setVisibility(JavaVisibility.PRIVATE);
topLevelClass.addField(tmpField);
Method setMethod = new Method();
setMethod.setName("set" + fieldName.toUpperCase().substring(0, 1)
+ fieldName.substring(1));
Parameter param = new Parameter(fieldType, fieldName);
setMethod.addParameter(param);
setMethod.setVisibility(JavaVisibility.PUBLIC);
setMethod.addBodyLine("this." + fieldName + "=" + fieldName + ";");
topLevelClass.addMethod(setMethod);
Method getMethod = new Method();
getMethod.setName("get" + fieldName.toUpperCase().substring(0, 1)
+ fieldName.substring(1));
getMethod.setReturnType(fieldType);
getMethod.setVisibility(JavaVisibility.PUBLIC);
getMethod.addBodyLine("return this." + fieldName + ";");
topLevelClass.addMethod(getMethod);
}
@Override
public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
IntrospectedTable introspectedTable) {
FullyQualifiedJavaType intType = FullyQualifiedJavaType
.getIntInstance();
addField("pageIndex", intType, topLevelClass);
addField("pageSize", intType, topLevelClass);
Method getSkipCountMethod = new Method();
getSkipCountMethod.setName("getSkipRecordCount");
getSkipCountMethod.setReturnType(intType);
getSkipCountMethod.setVisibility(JavaVisibility.PUBLIC);
getSkipCountMethod
.addBodyLine("return (this.pageIndex-1)*this.pageSize;");
topLevelClass.addMethod(getSkipCountMethod);
Method getEndRecordIndexMethod = new Method();
getEndRecordIndexMethod.setName("getEndRecordCount");
getEndRecordIndexMethod.setReturnType(intType);
getEndRecordIndexMethod.setVisibility(JavaVisibility.PUBLIC);
getEndRecordIndexMethod
.addBodyLine("return this.pageIndex*this.pageSize;");
topLevelClass.addMethod(getEndRecordIndexMethod);

Method newConstructorMethod = new Method();
newConstructorMethod.setConstructor(true);
newConstructorMethod.addParameter(new Parameter(intType, "pageSize"));
newConstructorMethod.addParameter(new Parameter(intType, "pageIndex"));
newConstructorMethod.addBodyLine("this();");
newConstructorMethod.addBodyLine("this.pageSize=pageSize;");
newConstructorMethod.addBodyLine("this.pageIndex=pageIndex;");
newConstructorMethod.setVisibility(JavaVisibility.PUBLIC);
newConstructorMethod.setName(topLevelClass.getType().getShortName());
topLevelClass.addMethod(newConstructorMethod);
return true;
}
@Override
public boolean clientGenerated(Interface interfaze,
TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();
FullyQualifiedJavaType type = new FullyQualifiedJavaType(
introspectedTable.getExampleType());
importedTypes.add(type);
importedTypes.add(FullyQualifiedJavaType.getNewListInstance());
Method method = new Method();
method.setVisibility(JavaVisibility.PUBLIC);
FullyQualifiedJavaType returnType = FullyQualifiedJavaType
.getNewListInstance();
FullyQualifiedJavaType listType;
if (introspectedTable.getRules().generateBaseRecordClass()) {
listType = new FullyQualifiedJavaType(introspectedTable
.getBaseRecordType());
} else if (introspectedTable.getRules().generatePrimaryKeyClass()) {
listType = new FullyQualifiedJavaType(introspectedTable
.getPrimaryKeyType());
} else {
throw new RuntimeException(getString("RuntimeError.12")); //$NON-NLS-1$
}
importedTypes.add(listType);
returnType.addTypeArgument(listType);
method.setReturnType(returnType);
method.setName("selectPage");
method.addParameter(new Parameter(type, "example")); //$NON-NLS-1$
interfaze.addImportedTypes(importedTypes);
interfaze.addMethod(method);
return true;
}
@Override
public boolean sqlMapDocumentGenerated(Document document,
IntrospectedTable introspectedTable) {
XmlElement parentElement = document.getRootElement();
XmlElement newResultMapElement = new XmlElement("resultMap");
newResultMapElement
.addAttribute(new Attribute("id", "selectPageResult"));
newResultMapElement.addAttribute(new Attribute("extends",
"BaseResultMap"));
String returnType;
if (introspectedTable.getRules().generateBaseRecordClass()) {
returnType = introspectedTable.getBaseRecordType();
} else {
returnType = introspectedTable.getPrimaryKeyType();
}
newResultMapElement.addAttribute(new Attribute("type",
returnType));
newResultMapElement
.addElement(new TextElement(
"<!--\r\n<association property=\"\" column=\"\" javaType=\"\">\r\n"
+ "   <id column=\"\" property=\"\" jdbcType=\"\" />\r\n"
+ "   <result column=\"\" property=\"\" jdbcType=\"\" />\r\n"
+ " </association>\r\n-->"));
parentElement.addElement(newResultMapElement);

//以下代码用于生成支持分页的sql片段
/**
*注意千万不要随意删除代码中的空格 !
*do not remove spaces
*/
XmlElement outter_where_sql=new XmlElement("sql");
outter_where_sql.addAttribute(new Attribute("id", "select_by_page_outter_where_sql"));
StringBuilder sb = new StringBuilder();
sb.append("  <if test=\"oredCriteria.size>0\">");
sb.append("     <if test=\"_parameter != null\" > <include refid=\"Example_Where_Clause\"/> </if>");
sb.append("    and ");
sb.append("  </if>");
sb.append("  <if test=\"oredCriteria.size==0\"> ");
sb.append("    where ");
sb.append("  </if> ");
outter_where_sql.addElement(new TextElement(sb.toString()));
parentElement.addElement(outter_where_sql);
XmlElement inner_where_sql=new XmlElement("sql");
inner_where_sql.addAttribute(new Attribute("id", "select_by_page_inner_where_and_orderby_sql"));
sb.setLength(0);
sb.append("  <if test=\"oredCriteria.size>0\">");
sb.append("     <if test=\"_parameter != null\" > <include refid=\"Example_Where_Clause\"/> </if>");
sb.append("  </if>");
sb.append("   <if test=\"orderByClause != null\">");
sb.append("    order by ${orderByClause} ");
sb.append("  </if> ");
inner_where_sql.addElement(new TextElement(sb.toString()));
parentElement.addElement(inner_where_sql);

XmlElement outter_orderby_sql=new XmlElement("sql");
outter_orderby_sql.addAttribute(new Attribute("id", "select_by_page_outter_orderby_sql"));
sb.setLength(0);
sb.append("   <if test=\"orderByClause != null\">");
sb.append("    order by ${orderByClause} ");
sb.append("  </if> ");
outter_orderby_sql.addElement(new TextElement(sb.toString()));
parentElement.addElement(outter_orderby_sql);
//以上代码用于生成支持分页的sql片段
String fqjt = introspectedTable.getExampleType();
XmlElement answer = new XmlElement("select"); //$NON-NLS-1$
answer.addAttribute(new Attribute("id", //$NON-NLS-1$
"selectPage"));
answer.addAttribute(new Attribute(
"resultMap","selectPageResult")); //$NON-NLS-1$
answer.addAttribute(new Attribute("parameterType", fqjt)); //$NON-NLS-1$

sb.setLength(0);
sb.append("select a.* from ");
sb.append(introspectedTable
.getAliasedFullyQualifiedTableNameAtRuntime());
sb.append(" a where a.");
List<IntrospectedColumn> pks=introspectedTable.getPrimaryKeyColumns();
if (pks.size()==1){
sb.append(MyBatis3FormattingUtilities.getAliasedEscapedColumnName(pks.get(0)));
}else{
sb.append(" #your_primary_key_name ");
}
sb.append(" in \r\n (select top ${pageSize} ");
if (pks.size()==1){
sb.append(MyBatis3FormattingUtilities.getAliasedEscapedColumnName(pks.get(0)));
}else{
sb.append(" #your_primary_key_name ");
}
sb.append(" from "+introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()+" ");
sb.append("\r\n<include refid=\"select_by_page_outter_where_sql\"/> \r\n");
if (pks.size()==1){
sb.append(MyBatis3FormattingUtilities.getAliasedEscapedColumnName(pks.get(0)));
}else{
sb.append(" #your_primary_key_name ");
}
sb.append(" not in (select top ${skipRecordCount} " );
if (pks.size()==1){
sb.append(MyBatis3FormattingUtilities.getAliasedEscapedColumnName(pks.get(0)));
}else{
sb.append(" #your_primary_key_name ");
}
sb.append(" from "+introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()+" ");
sb.append(" \r\n<include refid=\"select_by_page_inner_where_and_orderby_sql\"/> \r\n");
sb.append(" )");
sb.append(" \r\n<include refid=\"select_by_page_outter_orderby_sql\"/> \r\n");
sb.append(" )");

answer.addElement(new TextElement(sb.toString()));
parentElement.addElement(answer);
return true;
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-306266-1-1.html 上篇帖子: (转)Spring集成MyBatis进行项目开发(二) 下篇帖子: mybatis如何实现注解sql的简单例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表