由于近日基于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);
}
}
}