前两篇文章我们讲了如何获取源代码即创建工程、修改源代码为dao(mapper)层添加一个方法,那么这一篇,我们来讲如何在xml添加这个方法所需要sql
3、实现XML文件添加Dao(Mapper)层的实现
前面有讲过,下图中的两个包,分别是管理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了,
那么我们的目的就达到了,欢迎留言共同探讨