MyBatis Generator Example.Criteria 查詢條件複製

背景:工具

    咱們在開發中使用MyBatis Generator生成的 XxxExample查詢時,咋添加 or 查詢時候,可能兩個 Example.Criteria 對象的條件存在交集,即多個查詢條件是相同的。每一個查詢條件的添加可能須要進行多種邏輯判斷,這樣多個 Example.Criteria 就要判斷屢次,形成代碼的大量重複及效率的浪費。spa

實現:code

    有沒有一種方法能夠將 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());

    }

}

 

總結:blog

    這裏主要使用了反射、泛型等技術,沒有什麼高深的技術,但工具類確實能給開發人員帶來極大方便,及程序效率上的提高。開發

相關文章
相關標籤/搜索