突然需要用到动态SQL,应为之前我们用的是在Mapper层创建一个接口类,然后通过注解式来查询数据库的:如下
@Select("SELECT user_id " +
" FROM sp_user_relation WHERE up_user_id=#{userId} OR user_id=#{user_id}")
@Results({
@Result(property = "userId", column = "user_id")
})
List<String> getId(String userId);
这样子写死后不之如何才能写成动态,便去网上查询,发现如下写法: 动态SQL(创建一个类生成SQL)
但是发现这样子太麻烦了,便找寻其他方式,功夫不负有心人,真被我找到了,话不多说,上代码:
@Select("<script>SELECT promo_user_id,promoed_name,promoed_phone " +
" FROM sp_promo_his <if test=' name != null or phone!=null'>order by </if> "
+ " <if test='name!=null'> promoed_name </if> "
+ " <if test='phone!=null and name!=null'>,promoed_phone</if> "
+ " <if test='phone!=null and name==null'> promoed_phone</if></script>")
@Results({
@Result(property = "userId", column = "promo_user_id"),
@Result(property = "name", column = "promoed_name"),
@Result(property = "phone", column = "promoed_phone")
})
List<AbcdBean> getAbloud(@Param("name")String name,@Param("phone")String phone);
这段代码也是用了注解式SQL,在其中用script标签包围,然后像xml语法一样书写;
其中动态SQL处使用 If 标签做判断 <if test='判断语句,true则执行标签内语句'>
注:
@Param 标签用于 传入值 用 标签括号里的参数接收,然后在放入sql中运用
测试成功了,可是如果多条数据判断则出现另一个问题,if内要判断多次,并且多参数中的逗号不好确定,这是绝不可取的,然后我又找到一个标签解决了:
代码如下
@Select("<script>SELECT promo_user_id,promoed_name,promoed_phone " +
" FROM sp_promo_his <trim prefix='order by' prefixOverrides=','> "
+ " <if test='name!=null'> ,promoed_name </if><if test='phone!=null'> ,promoed_phone </if> </trim></script>")
@Results({
@Result(property = "userId", column = "promo_user_id"),
@Result(property = "name", column = "promoed_name"),
@Result(property = "phone", column = "promoed_phone")
})
List<AbcdBean> getAbloud(@Param("name")String name,@Param("phone")String phone);
这次使用了<trim>标签,省去了之前很长的判断,
<trim>节点标签:
trim主要功能是可以在Trim包含的内容前加上某些前缀(prefix),也可以在Trim包含的内容之后加上某些后缀(suffix)
还可以把Trim包含内容的首部的某些内容忽略掉(prefixOverrides) ,也可以把Trim包含的内容的尾部的某些内容忽略掉(suffixOverrides),
使用了这个标签后,之前的问题变很轻松的解决了.
注:
<trim prefix='order by' prefixOverrides=','>xxxx</trim>
之前我在这段标签前加一个 if 标签包含这段代吗,应为担心 标签中为空 但SQL 会加 order by 但经测试后发现标签内容为空则presfix值不会自动添加