使用<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:配置的是各个元素的间隔符。
模糊查询的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属性值即可