前两篇文章我们讲了如何获取源代码即创建工程、修改源代码为dao(mapper)层添加一个方法,那么这一篇,我们来讲如何在xml添加这个方法所需要sql
前面有讲过,下图中的两个包,分别是管理dao(Mapper)文件和xml文件的, 之前我们已经介绍了javamapper这个包了,而且在dao层添加了方法,那么我们现在来讲xmlmapper这个包,跟前面的很像,这个包下面有个XMLMapperGenerator类,里头有个getSqlMapElement方法,它也有很多的addxxx的方法, 而这些方法里头调用的,是org.mybatis.generator.codegen.mybatis3.xmlmapper.elements包下面类的对象
如果第二篇的对象你已经完成了,那么这里要做的,其实和第二篇差不多了, 我们先在elements包里,用SelectByPrimaryKeyElementGenerator类复制出来一个,类名叫SelectByObjectElementGenerator,这个类里的内容,我们等会儿再来修改, 先去XMLMapperGenerator类添加一个方法
//自定义方法 protected void addSelectByObject(XmlElement parentElement) { if (introspectedTable.getRules().generateSelectByPrimaryKey()) { AbstractXmlElementGenerator elementGenerator = new SelectByObjectElementGenerator(); initializeAndExecuteGenerator(elementGenerator, parentElement); } }然后在该类的getSqlMapElement方法中调用这个方法
那么这样做完以后,理论上新生成的xml文件,就会多出一个了,但是里头面的sql依然是SelectByPrimaryKey方法的sql,接下去,我们就去修改SelectByObjectElementGenerator类的addElements方法,将其改为我们所需要的sql。
@Override public void addElements(XmlElement parentElement) { //先创建一个select标签 XmlElement answer = new XmlElement("select"); //$NON-NLS-1$ //设置该select标签的id,正式第二篇里在枚举中设置的值 answer.addAttribute(new Attribute("id", introspectedTable.getSelectByObject())); //添加parameterType String parameterType; if (introspectedTable.getRules().generateRecordWithBLOBsClass()) { parameterType = introspectedTable.getRecordWithBLOBsType(); } else { parameterType = introspectedTable.getBaseRecordType(); } answer.addAttribute(new Attribute("parameterType", parameterType)); //设置resultMap为BaseResultMap answer.addAttribute(new Attribute("resultMap",introspectedTable.getBaseResultMapId())); context.getCommentGenerator().addComment(answer); //接下去是拼接我们的sql StringBuilder sb = new StringBuilder(); sb.append("select "); Iterator<IntrospectedColumn> iter = introspectedTable.getAllColumns().iterator(); //循环插入字段名称 while (iter.hasNext()) { sb.append(MyBatis3FormattingUtilities.getSelectListPhrase(iter.next())); if (iter.hasNext()) { sb.append(", "); } if (sb.length() > 80) { answer.addElement(new TextElement(sb.toString())); sb.setLength(0); } } if (sb.length() > 0) { answer.addElement((new TextElement(sb.toString()))); } sb.setLength(0); sb.append("from "); sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()); answer.addElement(new TextElement(sb.toString())); //在这里添加where条件 XmlElement selectTrimElement = new XmlElement("trim"); //设置trim标签 selectTrimElement.addAttribute(new Attribute("prefix", "where")); selectTrimElement.addAttribute(new Attribute("prefixOverrides", "and")); //添加where和and answer.addElement(selectTrimElement); //循环所有的列 for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) { XmlElement selectNotNullElement = new XmlElement("if"); //$NON-NLS-1$ sb.setLength(0); sb.append(introspectedColumn.getJavaProperty()); sb.append(" != null "); selectNotNullElement.addAttribute(new Attribute("test", sb.toString())); sb.setLength(0); sb.append(" and "); //添加and sb.append(MyBatis3FormattingUtilities .getEscapedColumnName(introspectedColumn)); sb.append(" = "); //添加等号 sb.append(MyBatis3FormattingUtilities .getParameterClause(introspectedColumn)); selectNotNullElement.addElement(new TextElement(sb.toString())); selectTrimElement.addElement(selectNotNullElement); } // String orderByClause = introspectedTable.getTableConfigurationProperty(PropertyRegistry.TABLE_SELECT_ALL_ORDER_BY_CLAUSE); boolean hasOrderBy = StringUtility.stringHasValue(orderByClause); if (hasOrderBy) { sb.setLength(0); sb.append("order by "); //$NON-NLS-1$ sb.append(orderByClause); answer.addElement(new TextElement(sb.toString())); } if (context.getPlugins().sqlMapSelectAllElementGenerated( answer, introspectedTable)) { parentElement.addElement(answer); } }修改完成以后,保存,执行MyTestRun,再查看xml文件,就会看到
这样,我们在使用dao(Mapper)层的SelectByObject方法的时候,就会调用这条sql了, 那么我们的目的就达到了,欢迎留言共同探讨