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("@Getter@Setter"); 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代碼的不完善之處以及解決方法