当前位置: 代码迷 >> 综合 >> MyBatis中的动态SQL<if><choose><where><foreach><bind>
  详细解决方案

MyBatis中的动态SQL<if><choose><where><foreach><bind>

热度:110   发布时间:2023-10-21 08:01:47.0

MyBatis中的动态SQL<if><choose><where><foreach><bind>

 使用<if>元素对username和jobs进行非空判断,并动态组装SQL

select * from t_customer where 1=1 <if test="username !=null and username !=''">and username like concat('%',#{username}, '%')</if><if test="jobs !=null and jobs !=''">and jobs= #{jobs}</if>

使用<choose>及其子元素依次对条件进行非空判断,并动态组装SQL

      select * from t_customer where 1=1<choose><when test="username !=null and username !=''">and username like concat('%',#{username}, '%')</when><when test="jobs !=null and jobs !=''">and jobs= #{jobs}</when><otherwise>and phone is not null</otherwise></choose>

加入了条件“1=1”后,既保证了where后面的条件成立,又避免了where后面第一个词是and或者or之类的关键词。

 针对上述情况中“where 1=1”,在MyBatis的SQL中就可以使用<where>或<trim>元素进行动态处理。

select * from t_customer<trim prefix="where" prefixOverrides="and"><if test="username !=null and username !=''">and username like concat('%',#{username}, '%')</if><if test="jobs !=null and jobs !=''">and jobs= #{jobs}</if></trim>
select*from t_customer
<where><if test="username !=null and username !=''">and username like concat('%',#{username},'%')</if><if test="jobs !=null and jobs !=''">and jobs= #{jobs}</if>
</where>

使用<set>和<if>元素对username和jobs进行更新判断,并动态组装SQL。这样就只需要传入想要更新的字段即可

<update id="updateCustomer"  parameterType="com.itheima.po.Customer">update t_customer <set><if test="username !=null and username !=''">username=#{username},</if><if test="jobs !=null and jobs !=''">jobs=#{jobs},</if></set>where id=#{id}
</update>

使用<set>和<if>结合的方式来组装update语句。<set>(进行更新字段时,要确保更新的字段不能为空)元素会动态前置 SET关键字,同时也会消除多余的‘,’。

使用MyBatis中动态SQL的<foreach>元素进行处理。

     <select id="findCustomerByIds" parameterType="List"resultType="com.itheima.po.Customer">select * from t_customer where id in<foreach item="id" index="index" collection="list" open="(" separator="," close=")">#{id}</foreach></select>

 

item:配置的是循环中当前的元素。

index:配置的是当前元素在集合的位置下标。

collection:配置的list是传递过来的参数类型(首字母小写),它可以是一个array、list(或collection)、Map集合的键、POJO包装类中数组或集合类型的属性名等。

open和close:配置的是以什么符号将这些集合元素包装起来。

separator:配置的是各个元素的间隔符。

MyBatis中的动态SQL<if><choose><where><foreach><bind>

 

模糊查询的SQL

         select * from t_customer where username like '%${value}%'

如果使用“${}”进行字符串拼接,则无法防止SQL注入问题;

如果改用concat函数进行拼接,则只针对MySQL数据库有效;

如果改用“||”进行字符串拼接,则只针对Oracle数据库有效。

使用MyBatis的<bind>元素来解决这一问题。

     <select id="findCustomerByName" parameterType="com.itheima.po.Customer"resultType="com.itheima.po.Customer"><bind name="pattern_username" value="'%'+_parameter.getUsername()+'%'" />select * from t_customer where username like #{pattern_username}</select>

_parameter.getUsername()表示传递进来的参数(也可以直接写成对应的参数变量名,如username)

需要的地方直接引用<bind>元素的name属性值即可

  相关解决方案