如何在注解式sql中写入动态的SQL语句

今天springboot项目中,突然需要用到动态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值不会自动添加 


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值