mybatis generator自动生成sqlmap代码的不完善之处以及解决方法
Posted 太白的技术博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis generator自动生成sqlmap代码的不完善之处以及解决方法相关的知识,希望对你有一定的参考价值。
a) 建表时,字段名称建议用"_"分隔多个单词,比如:AWB_NO、REC_ID...,这样生成的entity,属性名称就会变成漂亮的驼峰命名,即:awbNo、recId
b)oracle中,数值形的字段,如果指定精度,比如Number(12,2),默认生成entity属性是BigDecimal型 ,如果不指定精度,比如:Number(9),指默认生成的是Long型
如果不指定精度,比如number,会生成Short类型,此时要生成Integer,只能修改源代码org.mybatis.generator.internal.db.DatabaseIntrospector.getColumns(TableConfiguration) 624行,如下:
// zjhua add for oracle, 默认情况下precision,scale都为0, 生成Short类型是不正确的 if (rs.getInt("COLUMN_SIZE") == 0) { // scale>0;length>18:使用BigDecimal; // scale=0;length[10,18]:使用Long; // scale=0;length[5,9]:使用Integer; // scale=0;length<5:使用Short; // 所以随便选个8就好了 introspectedColumn.setLength(8); } else { introspectedColumn.setLength(rs.getInt("COLUMN_SIZE")); //$NON-NLS-1$ }
c)oracle中的nvarchar/nvarchar2,mybatis-generator会识别成Object型,建议不要用nvarchar2,改用varchar2
d) 如果要生成继承基础类的mapper,比如:
package com.hundsun.ta.base; import java.util.List; import org.apache.ibatis.annotations.Param; public interface BaseMapper<T, E, PK> { T selectByPrimaryKey(PK pk); List<T> selectByExample(E example); int insert(T record); int insertSelective(T record); int updateByPrimaryKeySelective(T record); int updateByExampleSelective(@Param("record") T record, @Param("example") E example); int deleteByPrimaryKey(PK pk); int deleteByExample(E example); default int insertBatch(List<T> record) { throw new UnsupportedOperationException();}; int truncate(); }
也需要修改源代码org.mybatis.generator.codegen.mybatis3.javamapper.JavaMapperGenerator.getCompilationUnits() 85行开始,如下:
// zjhua add start String pojoName = interfaze.getType().getShortName().replaceAll("Mapper", ""); String pkType = ""; if (introspectedTable.getPrimaryKeyColumns().size()>1) { pkType = introspectedTable.getPrimaryKeyType().substring(introspectedTable.getPrimaryKeyType().lastIndexOf(‘.‘)+1); } else { pkType = introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType().getShortName(); } rootInterface = "BaseMapper<" + pojoName + "," + pojoName + "Example," + pkType + ">"; // zjhua add end if (stringHasValue(rootInterface)) { FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType( rootInterface); interfaze.addSuperInterface(fqjt); interfaze.addImportedType(fqjt); // zjhua add start System.out.println(fqjt); interfaze.addImportedType(new FullyQualifiedJavaType("com.hundsun.ta.base.BaseMapper")); // zjhua add end } // addCountByExampleMethod(interfaze); addDeleteByExampleMethod(interfaze); addDeleteByPrimaryKeyMethod(interfaze); addInsertMethod(interfaze); addInsertSelectiveMethod(interfaze); addSelectByExampleWithBLOBsMethod(interfaze); addSelectByExampleWithoutBLOBsMethod(interfaze); addSelectByPrimaryKeyMethod(interfaze); addUpdateByExampleSelectiveMethod(interfaze); addUpdateByExampleWithBLOBsMethod(interfaze); addUpdateByExampleWithoutBLOBsMethod(interfaze); addUpdateByPrimaryKeySelectiveMethod(interfaze); addUpdateByPrimaryKeyWithBLOBsMethod(interfaze); addUpdateByPrimaryKeyWithoutBLOBsMethod(interfaze); List<CompilationUnit> answer = new ArrayList<CompilationUnit>(); if (context.getPlugins().clientGenerated(interfaze, null, introspectedTable)) { // zjhua 新增开始 interfaze.getMethods().clear(); interfaze.getOriginalImportedTypes().remove(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Param")); interfaze.getOriginalImportedTypes().remove(new FullyQualifiedJavaType("java.util.List")); // 新增结束 answer.add(interfaze); }
这样就可以按需满足了。
最后,pojo应该使用lombok的Getter和Setter。这可以通过增加一个自定义插件实现,如下:
package cn.wolfcode.mybatis.plugins; import java.util.List; 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.Method; import org.mybatis.generator.api.dom.java.TopLevelClass; public class IngoreSetterAndGetterPlugin extends PluginAdapter { @Override public boolean validate(List<String> warnings) { return true; } @Override public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { //该代码表示在生成class的时候,向topLevelClass添加一个@Setter和@Getter注解 topLevelClass.addAnnotation("@[email protected]"); return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable); } //该方法在生成每一个属性的getter方法时候调用,如果我们不想生成getter,直接返回false即可; @Override public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { return false; } //该方法在生成每一个属性的setter方法时候调用,如果我们不想生成setter,直接返回false即可; @Override public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { return false; } }
然后修改org.mybatis.generator.api.dom.java.TopLevelClass构造器,引入lombok.Getter和lombok.Setter,如下:
public TopLevelClass(FullyQualifiedJavaType type) { super(type); importedTypes = new TreeSet<FullyQualifiedJavaType>(); // zjhua add importedTypes.add(new FullyQualifiedJavaType("lombok.Getter")); importedTypes.add(new FullyQualifiedJavaType("lombok.Setter")); // zjhua add end fileCommentLines = new ArrayList<String>(); staticImports = new TreeSet<String>(); }
最后,在generatorConfig-oracle.xml加上插件,如下:
<plugin type="cn.wolfcode.mybatis.plugins.IngoreSetterAndGetterPlugin" />
这样就符合我们的要求了。
Mybatis generator 接口增加自定义方法和sql配置可以参考:https://blog.csdn.net/limclg/article/details/80816923
以上是关于mybatis generator自动生成sqlmap代码的不完善之处以及解决方法的主要内容,如果未能解决你的问题,请参考以下文章
使用Mybatis-Generator自动生成DaoModelMapping
使用Mybatis Generator自动生成Mybatis相关代码