Mybatis generator 插件会生成一堆Example类,之前一直没有在意,直到最近写generator的插件时,才去探了一下究竟。然后发现,其用编程式实现SQL 的动态拼接,很是方便,比自己一直去在SqlMap中写sql方便太多了。
生成的文件中,包含了Example类和SqlMap中的Example_Where_Clause。
生成的Example类图如上。大体理解下,Example将其看成一个查询的Where条件集合(List
需要注意的地方:
Example类中的Criteri*的关系
一次查询只有一个oredCriteria,一个oredCriteria中含有多个Criteria,多个Criteria之间全是用OR连接。一个Criteria中含有多个Criterion,多个Criterion之间用AND连接。
<sql id="Example_Where_Clause">
<where>
<foreach collection="oredCriteria" item="criteria" separator="or">
<if test="criteria.valid">
<trim prefix="(" prefixOverrides="and" suffix=")">
<foreach collection="criteria.criteria" item="criterion">
<choose>
<when test="criterion.noValue">
and ${criterion.condition}
</when>
<when test="criterion.singleValue">
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue">
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue">
and ${criterion.condition}
<foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
对照着上边的Example相关类解析,可以看出oredCriteria
中多个Criteria中用OR分割,然后如果isValid(Criteria中有多个Criterion),则遍历Criterion,并且用And拼接。
下面总共三个例子,基本能说明所有问题了。
SELECT * FROM order_extra_fee WHERE id > 3 AND id < 10 AND fee_code = 502;
SELECT * FROM order_extra_fee WHERE (id >3 AND id < 10) OR (add_time > '2017-02-10 18:42:27' AND add_time < '2017-02-12 18:42:27');
SELECT * FROM order_extra_fee WHERE ((id >3 AND id < 10) OR (add_time > '2017-02-10 18:42:27' AND add_time < '2017-02-12 18:42:27')) AND fee_amount > 0;
SELECT * FROM order_extra_fee WHERE ((id >3 AND id < 10 AND fee_amount > 0) OR (add_time > '2017-02-10 18:42:27' AND add_time < '2017-02-12 18:42:27')AND fee_amount > 0);
下面是java实现,注意我的Example类的命名都改了,改成Query了。
OrderExtraFeeQuery query = new OrderExtraFeeQuery();
// 第一种
query.createCriteria().andIdGreaterThan(3).andIdLessThan(10);
// 第二种,or用来拼接另一个Criteria
query.or().andAddTimeGreaterThan(new Date(1486723347000l)).andAddTimeLessThan(new Date(1486896147000l));
// 第三种,没法实现啊,( ̄︶ ̄)> ,换种思路,也即第四种
query.clear();
query.createCriteria().andIdGreaterThan(3).andIdLessThan(10).andFeeAmountGreaterThan(new BigDecimal("0"));
query.or().andAddTimeGreaterThan(new Date(1486723347000l)).andAddTimeLessThan(new Date(1486896147000l)).andFeeAmountGreaterThan(new BigDecimal("0"));
前台增删改查想必是每个偏业务程序员的痛,JQGrid插件功能还是很强大的,基本可以实现增删改查的所有功能,样式也可以选择多种的,那么通过支撑其的增删改查,考虑到我们前台参数统一封装也可以借鉴其思路。