修改mybatis-generator源码(二)增加“or连接的多列模糊查询”

此篇文章是修改mybatis-generator源码(一) 增加分页功能的延续。
在前段时间,我用mybatis-generator生成的mapper.xml查询数据库,一直没找到如何使用多列或条件查询,如果要用or连接的话,最外层只能全用or,比如:

where A=1 or B=2;

当时我就修改了example文件,使得mapper.xml文件能够动态生成多列或模糊查询的语句
,例如:

where A = 1 
	  and (B like '%张%' or C like '%李%' or D like '%王%' )
	  and E > 12

再后来我觉得有必要修改下mybatis-generator的源码,废话不多说,直接上步骤。(由于详细步骤已在修改mybatis-generator源码(一) 增加分页功能中介绍,本篇只介绍大致步骤。)

1.进入 mybatis-generator-core\src\main\java\org.mybatis.generator\codegen\mybatis3\model目录,打开ExampleGenerator类。

2.搜索“getSetNotLikeMethod”,定位到此方法,然后在该方法下添加如下代码:

    //    生成 multiseriateOrLike() 方法的方法
    private Method getMultiseriateOrLike() {
//        设置方法名
        StringBuilder sb = new StringBuilder();
        sb.append("andMultiseriateOrLike");

        Method method = new Method(sb.toString());
//        设置方法的访问级别
        method.setVisibility(JavaVisibility.PUBLIC);
//        设置方法的参数,参数类型为 hashMap,参数名为 map
        method.addParameter(new Parameter(new FullyQualifiedJavaType("java.util.HashMap<String, String>"), "map")); //$NON-NLS-1$
//        设置方法的返回类型
        method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());

//        清空sb;
        sb.setLength(0);

        method.addBodyLine("if(map.isEmpty()) return (Criteria) this;");
        method.addBodyLine("StringBuilder sb = new StringBuilder();");
        method.addBodyLine("sb.append(\"(\");");
        method.addBodyLine("java.util.Set<String> keySet = map.keySet();");
        method.addBodyLine("for (String str : keySet) {");
        method.addBodyLine("sb.append(\" or \"+str+\" like '%%\"+map.get(str)+\"%%'\");");
        method.addBodyLine("}");
        method.addBodyLine("sb.append(\")\");");
        method.addBodyLine("int index = sb.indexOf(\"or\");");
        method.addBodyLine("sb.delete(index, index+2);");
        method.addBodyLine("addCriterion(sb.toString());");
        method.addBodyLine("return (Criteria) this;");

        return method;
    }

代码修改到此结束,仅仅只需要修改一处代码。

3.使用。

接下来用maven打包,使用后自动生成的example文件将会增加一个andMultiseriateOrLike() 方法,
此方法接收一个HashMap<String,String>类型的参数,
里面的key值为要查询的字段名,
对应的value即为模糊查询的条件。

使用此方法与使用example其他方法一样:

		NeedExample example = new NeedExample();
        NeedExample.Criteria criteria = example.createCriteria();

            criteria.andMultiseriateOrLike(map);

            criteria.andUseridEqualTo(need.getUserid());

            criteria.andStatusEqualTo(need.getStatus());
	
			needMapper.selectByExample(example );

虽说我只增加了or连接的多列模糊查询功能,但其实不止模糊查询,诸如==、>、<之类的条件都是可以实现的,只不过当时没用到,就没做。

贴上增强版mybatis-generator-jar:mybatis-generator-core-1.4.0-mysql-page-like.jar(提取码:6ahc)
github修改后的源码:https://github.com/BaiMaGod/generator

最后总结:
虽说修改的仅仅只是一个细枝末节的功能,但其中过程却是不易的,尤其是看mybatis-generator源码。
在看之前,我没想到mybatis-generator源码会有那么多东西,心想不就是连接数据库,把对应的表给获取到,根据字段生成java和xml文件吗?
但实际上要考虑的问题很多,虽说mybatis-generator源码有很多地方看不懂,但最终还是完成了任务,也锻炼了代码阅读能力,哈哈哈。

猜你喜欢

转载自blog.csdn.net/weixin_42486795/article/details/91533775