X

spring boot mybatis的动态SQL

动态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来查询,可以将很多代码集中在一个地方,修改一个公共逻辑的时候就比较方便了。

Categories: Java学习
龙安_任天兵: 不忘初心,方得始终!

View Comments (1)