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