动态sql的用途
如果你的sql语句需要一些逻辑。例如 if (a) { order by status} else {order by id}等情况。 如果没有动态sql的做法是,把if和else的逻辑写到业务逻辑层,然后在你的mapper里写两个方法,分别是getxxxOrderByStatus(); getxxxOrderById(); 这两个方法除了order不一样,其他都是相同的,这就导致了代码重复,维护起来也比较困难。
mybatis里的动态sql
在mybatis中,xml的动态sql写法如下,具体的章节参考 [文档](http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html)
<select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if> </select>
对应的在注解上,我们使用provider来产生动态sql,可以使用的provider有以下几种
@InsertProvider
@UpdateProvider
@DeleteProvider
@SelectProvider
分别对应相应的查询操作。
在mapper上写明要使用的provider
@Results({ @Result(property = "gmtCreate", column = "gmt_create"), @Result(property = "gmtModified", column = "gmt_modified"), @Result(property = "finishTime", column = "finish_time"), @Result(property = "startTime", column = "start_time"), @Result(property = "type", column = "type", typeHandler = com.alibaba.TypeEnumHandler.class), }) @SelectProvider(type = ResultProvider.class, method = "getResult") List getResult(ResultDO query); class ResultDO { private Date gmtModified; private Date gmtCreate; private String finishTime; private Sting startTime; private ResultType type; /**** 省略 各种 getter 和 setter *****/ }
然后在你的provier中实现拼写sql的逻辑
public class ResultProvider { public String getResult(ResultDO query) { final long id = query.getId(); final ResultType type = query.getType(); return new SQL() {{ SELECT("*"); FROM("xxx"); if (id >0) { WHERE(" id = #{experimentDetailId}"); } if (type != null) { WHERE(" type=#{type, typeHandler=com.alibaba.TypeEnumHandler}"); } if (status != null) { WHERE(" status = #{status, typeHandler=com.alibaba.ResultStatusEnumHandler}"); } if (id > 0) { WHERE(" id = #{id}"); } ORDER_BY("gmt_create desc"); }}.toString(); } }
这样我们就实现了用一个接口,既可以通过id查,也能通过type查,还能通过status来查询,可以将很多代码集中在一个地方,修改一个公共逻辑的时候就比较方便了。
#h1
just test