由于近日基于Mybatis开发,而Mybatis-generator生成的查询接口又缺少针对其它属性关联查询的办法(或许是我没找到),也没找到相关添加的教程!无奈只好花点时间自己增加一个selectByCdt接口。写出来以便别人有类似需求时可以自行添加。 附近部分是根据本文需求已经改好的Jar包!可以直接下载试用!
为了方便查找改动的相关,我在局部修改的地方加入了//@Nothing-add
改后的源码发布到了 https://code.google.com/p/mybatis-generator-custom/ 需要的自行检出!
下面直接贴出修改的相关类。注意路径前M:修改 A:添加此方法!
M | org/mybatis/generator/api/IntrospectedTable.java
protected enum InternalAttribute { ATTR_DAO_IMPLEMENTATION_TYPE, ATTR_DAO_INTERFACE_TYPE, ATTR_PRIMARY_KEY_TYPE, ATTR_BASE_RECORD_TYPE, ATTR_RECORD_WITH_BLOBS_TYPE, ATTR_EXAMPLE_TYPE, ATTR_IBATIS2_SQL_MAP_PACKAGE, ATTR_IBATIS2_SQL_MAP_FILE_NAME, ATTR_IBATIS2_SQL_MAP_NAMESPACE, ATTR_MYBATIS3_XML_MAPPER_PACKAGE, ATTR_MYBATIS3_XML_MAPPER_FILE_NAME, /** also used as XML Mapper namespace if a Java mapper is generated */ ATTR_MYBATIS3_JAVA_MAPPER_TYPE, /** used as XML Mapper namespace if no client is generated */ ATTR_MYBATIS3_FALLBACK_SQL_MAP_NAMESPACE, ATTR_FULLY_QUALIFIED_TABLE_NAME_AT_RUNTIME, ATTR_ALIASED_FULLY_QUALIFIED_TABLE_NAME_AT_RUNTIME, ATTR_COUNT_BY_EXAMPLE_STATEMENT_ID, ATTR_DELETE_BY_EXAMPLE_STATEMENT_ID, ATTR_DELETE_BY_PRIMARY_KEY_STATEMENT_ID, ATTR_INSERT_STATEMENT_ID, ATTR_INSERT_SELECTIVE_STATEMENT_ID, ATTR_SELECT_ALL_STATEMENT_ID, ATTR_SELECT_BY_EXAMPLE_STATEMENT_ID, ATTR_SELECT_BY_EXAMPLE_WITH_BLOBS_STATEMENT_ID, ATTR_SELECT_BY_PRIMARY_KEY_STATEMENT_ID, ATTR_UPDATE_BY_EXAMPLE_STATEMENT_ID, ATTR_UPDATE_BY_EXAMPLE_SELECTIVE_STATEMENT_ID, ATTR_UPDATE_BY_EXAMPLE_WITH_BLOBS_STATEMENT_ID, ATTR_UPDATE_BY_PRIMARY_KEY_STATEMENT_ID, ATTR_UPDATE_BY_PRIMARY_KEY_SELECTIVE_STATEMENT_ID, ATTR_UPDATE_BY_PRIMARY_KEY_WITH_BLOBS_STATEMENT_ID, ATTR_BASE_RESULT_MAP_ID, ATTR_RESULT_MAP_WITH_BLOBS_ID, ATTR_EXAMPLE_WHERE_CLAUSE_ID, ATTR_BASE_COLUMN_LIST_ID, ATTR_BLOB_COLUMN_LIST_ID, ATTR_MYBATIS3_UPDATE_BY_EXAMPLE_WHERE_CLAUSE_ID, ATTR_MYBATIS3_SQL_PROVIDER_TYPE, //@Nothing-add ATTR_SELECT_BY_CDT_STATEMENT_ID }
M | org/mybatis/generator/codegen/mybatis3/javamapper/JavaMapperGenerator.java
@Override public List<CompilationUnit> getCompilationUnits() { progressCallback.startTask(getString("Progress.17", //$NON-NLS-1$ introspectedTable.getFullyQualifiedTable().toString())); CommentGenerator commentGenerator = context.getCommentGenerator(); FullyQualifiedJavaType type = new FullyQualifiedJavaType( introspectedTable.getMyBatis3JavaMapperType()); Interface interfaze = new Interface(type); interfaze.setVisibility(JavaVisibility.PUBLIC); commentGenerator.addJavaFileComment(interfaze); String rootInterface = introspectedTable .getTableConfigurationProperty(PropertyRegistry.ANY_ROOT_INTERFACE); if (!stringHasValue(rootInterface)) { rootInterface = context.getJavaClientGeneratorConfiguration() .getProperty(PropertyRegistry.ANY_ROOT_INTERFACE); } if (stringHasValue(rootInterface)) { FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType( rootInterface); interfaze.addSuperInterface(fqjt); interfaze.addImportedType(fqjt); } addCountByExampleMethod(interfaze); addDeleteByExampleMethod(interfaze); addDeleteByPrimaryKeyMethod(interfaze); addInsertMethod(interfaze); addInsertSelectiveMethod(interfaze); addSelectByExampleWithBLOBsMethod(interfaze); addSelectByExampleWithoutBLOBsMethod(interfaze); addSelectByPrimaryKeyMethod(interfaze); //@Nothing-Add addSelectByCdtMethod(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)) { answer.add(interfaze); } List<CompilationUnit> extraCompilationUnits = getExtraCompilationUnits(); if (extraCompilationUnits != null) { answer.addAll(extraCompilationUnits); } return answer; }
//@Nothing-Add protected void addSelectByCdtMethod(Interface interfaze) { //这里我就直接和主键生成绑定吧!懒的写了! if (introspectedTable.getRules().generateSelectByPrimaryKey()) { AbstractJavaMapperMethodGenerator methodGenerator = new SelectByCdtMethodGenerator(false); initializeAndExecuteGenerator(methodGenerator, interfaze); } }
A | org/mybatis/generator/codegen/mybatis3/javamapper/elements/SelectByCdtMethodGenerator.java
public class SelectByCdtMethodGenerator extends AbstractJavaMapperMethodGenerator { private boolean isSimple; public SelectByCdtMethodGenerator(boolean isSimple) { super(); this.isSimple = isSimple; } @Override public void addInterfaceElements(Interface interfaze) { Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>(); Method method = new Method(); method.setVisibility(JavaVisibility.PUBLIC); FullyQualifiedJavaType parameterType = introspectedTable.getRules() .calculateAllFieldsClass(); FullyQualifiedJavaType returnType = FullyQualifiedJavaType.getNewListInstance().getNewListInstance(); returnType.addTypeArgument(parameterType); method.setReturnType(FullyQualifiedJavaType.getNewListInstance()); importedTypes.add(returnType); importedTypes.add(parameterType); method.setName(introspectedTable.getSelectByCdtStatementId()); method.addParameter(new Parameter(parameterType, "record")); //$NON-NLS-1$ addMapperAnnotations(interfaze, method); context.getCommentGenerator().addGeneralMethodComment(method, introspectedTable); if (context.getPlugins().clientSelectByPrimaryKeyMethodGenerated( method, interfaze, introspectedTable)) { interfaze.addImportedTypes(importedTypes); interfaze.addMethod(method); } } public void addMapperAnnotations(Interface interfaze, Method method) { return; } }
M | org/mybatis/generator/codegen/mybatis3/xmlmapper/XMLMapperGenerator.java
protected XmlElement getSqlMapElement() { FullyQualifiedTable table = introspectedTable.getFullyQualifiedTable(); progressCallback.startTask(getString( "Progress.12", table.toString())); //$NON-NLS-1$ XmlElement answer = new XmlElement("mapper"); //$NON-NLS-1$ String namespace = introspectedTable.getMyBatis3SqlMapNamespace(); answer.addAttribute(new Attribute("namespace", //$NON-NLS-1$ namespace)); context.getCommentGenerator().addRootComment(answer); addResultMapWithoutBLOBsElement(answer); addResultMapWithBLOBsElement(answer); addExampleWhereClauseElement(answer); addMyBatis3UpdateByExampleWhereClauseElement(answer); addBaseColumnListElement(answer); addBlobColumnListElement(answer); addSelectByExampleWithBLOBsElement(answer); addSelectByExampleWithoutBLOBsElement(answer); addSelectByPrimaryKeyElement(answer); //@Nothing-add addSelectByCdtElement(answer); addDeleteByPrimaryKeyElement(answer); addDeleteByExampleElement(answer); addInsertElement(answer); addInsertSelectiveElement(answer); addCountByExampleElement(answer); addUpdateByExampleSelectiveElement(answer); addUpdateByExampleWithBLOBsElement(answer); addUpdateByExampleWithoutBLOBsElement(answer); addUpdateByPrimaryKeySelectiveElement(answer); addUpdateByPrimaryKeyWithBLOBsElement(answer); addUpdateByPrimaryKeyWithoutBLOBsElement(answer); return answer; }
A | org/mybatis/generator/codegen/mybatis3/xmlmapper/elements/SelectByCdtElementGenerator.java
public class SelectByCdtElementGenerator extends AbstractXmlElementGenerator { public SelectByCdtElementGenerator() { super(); } @Override public void addElements(XmlElement parentElement) { XmlElement answer = new XmlElement("select"); //$NON-NLS-1$ answer.addAttribute(new Attribute( "id", introspectedTable.getSelectByCdtStatementId())); //$NON-NLS-1$ if (introspectedTable.getRules().generateResultMapWithBLOBs()) { answer.addAttribute(new Attribute("resultMap", //$NON-NLS-1$ introspectedTable.getResultMapWithBLOBsId())); } else { answer.addAttribute(new Attribute("resultMap", //$NON-NLS-1$ introspectedTable.getBaseResultMapId())); } String parameterType = introspectedTable.getRules().calculateAllFieldsClass().getFullyQualifiedName(); answer.addAttribute(new Attribute("parameterType", //$NON-NLS-1$ parameterType)); context.getCommentGenerator().addComment(answer); StringBuilder sb = new StringBuilder(); sb.append("select "); //$NON-NLS-1$ if (stringHasValue(introspectedTable .getSelectByPrimaryKeyQueryId())) { sb.append('\''); sb.append(introspectedTable.getSelectByPrimaryKeyQueryId()); sb.append("' as QUERYID,"); //$NON-NLS-1$ } answer.addElement(new TextElement(sb.toString())); answer.addElement(getBaseColumnListElement()); if (introspectedTable.hasBLOBColumns()) { answer.addElement(new TextElement(",")); //$NON-NLS-1$ answer.addElement(getBlobColumnListElement()); } sb.setLength(0); sb.append("from "); //$NON-NLS-1$ sb.append(introspectedTable .getAliasedFullyQualifiedTableNameAtRuntime()); answer.addElement(new TextElement(sb.toString())); XmlElement dynamicElement = new XmlElement("where"); //$NON-NLS-1$ answer.addElement(dynamicElement); for (IntrospectedColumn introspectedColumn : introspectedTable.getBaseColumns()) { XmlElement isNotNullElement = new XmlElement("if"); //$NON-NLS-1$ sb.setLength(0); sb.append(introspectedColumn.getJavaProperty()); //$NON-NLS-1$ sb.append(" != null"); //$NON-NLS-1$ isNotNullElement.addAttribute(new Attribute("test", sb.toString())); //$NON-NLS-1$ dynamicElement.addElement(isNotNullElement); sb.setLength(0); sb.append("and "); sb.append(MyBatis3FormattingUtilities .getAliasedEscapedColumnName(introspectedColumn)); sb.append(" = "); //$NON-NLS-1$ sb.append(MyBatis3FormattingUtilities.getParameterClause( introspectedColumn)); //$NON-NLS-1$ // sb.append(','); isNotNullElement.addElement(new TextElement(sb.toString())); } if (context.getPlugins() .sqlMapSelectByPrimaryKeyElementGenerated(answer, introspectedTable)) { parentElement.addElement(answer); } } }