欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis Generator Example.Criteria 查询条件复制

程序员文章站 2022-08-22 09:16:25
MyBatis Generator Example.Criteria 查询条件复制 ......

背景:

    我们在开发中使用mybatis generator生成的 xxxexample查询时,咋添加 or 查询时候,可能两个 example.criteria 对象的条件存在交集,即多个查询条件是相同的。每个查询条件的添加可能需要进行多种逻辑判断,这样多个 example.criteria 就要判断多次,造成代码的大量重复及效率的浪费。

实现:

    有没有一种方法可以将 example.criteria a的查询条件复制到 example.criteria b的方法呢,不多讲了看下面代码实现。

/**
 * 拷贝查询条件工具
 * 
 * @author zqc
 * @version 1.0 2018-11-29
 * 
 */
public class criteriatools
{
    /**
     * 拷贝查询条件;仅将原criteria中的condition复制到目标criteria,不会覆盖目标criteria已有condition
     * 
     * @param source 原criteria
     * @param target 目标criteria
     */
    @suppresswarnings({ "unchecked", "rawtypes" })
    public static <t> void copycondition(t source, t target)
    {
        if (null != source && null != target)
        {
            try
            {
                field field = source.getclass().getsuperclass().getdeclaredfield("criteria");
                field.setaccessible(true);

                list sourcecriteria = (list) field.get(source);
                list targetcriteria = (list) field.get(target);

                targetcriteria.addall(sourcecriteria);

            } catch (exception e)
            {
                e.printstacktrace();
            }
        }
    }

    // 使用方法
    public static void main(string[] args)
    {
        userexample example = new userexample();
        userexample.criteria c1 = example.createcriteria();
        c1.andidequalto("abc").andusernameequalto("123");// c1添加两个条件

        userexample.criteria c2 = example.or();
        c2.andidlike("1");// c2增加一个条件

        criteriatools.copycondition(c1, c2);// 拷贝条件

        c1.andpasswordequalto("555").andpasswordisnull();// c1添加两个条件

        system.out.println("c1 " + c1.getallcriteria().size());
        system.out.println("c2:" + c2.getallcriteria().size());

    }

}

 

总结:

    这里主要使用了反射、泛型等技术,没有什么高深的技术,但工具类确实能给开发人员带来极大方便,及程序效率上的提升。