• 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());
    
        }
    
    }

    总结:

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

  • 相关阅读:
    ci中使用smarty
    php curl用法
    百万级访问网站前期的技术准备
    enctype="multipart/formdata" 文件上传
    【转】lnmp配置记录
    ActionScript实现两直线相交弧跨越算法
    Adobe Flex迷你教程 — ActionScript实现二维向量运算
    U盘启动安装Linux(转)
    Adobe Flex迷你教程 — 实现类似新浪微博评论消息容器
    Adobe Flex迷你教程 — 让Graphics的线响应事件。
  • 原文地址:https://www.cnblogs.com/a2b1/p/11255035.html
Copyright © 2020-2023  润新知