背景:工具
咱們在開發中使用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
這裏主要使用了反射、泛型等技術,沒有什麼高深的技術,但工具類確實能給開發人員帶來極大方便,及程序效率上的提高。開發