Mybatis-generator修改源代码实现自定义方法,返回List对象(三)

前两篇文章我们讲了如何获取源代码即创建工程、修改源代码为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了,
那么我们的目的就达到了,欢迎留言共同探讨

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值