- 准备: 创建queryVo类
- queryVo 是sql语句条件的集合, 里面存储了执行sql时需要用到的条件
- sql片段
- 创建
<sql id="query">
select * from t_user
</sql>
- 引用
<include refid="query"/>
- 注意:
- 创建和引用的id要一致
- sql片段相当于是文本的替换, 所以不要加分号(😉
- if
<select id="getUserByCondition" resultType="User" parameterType="User">
select * from t_user where 1=1
<if test="name != null">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
</select>
- test里面写添加即可. 注意: 字段需要和参数对象的属性名一致
- where
<select id="getUserByCondition" resultType="User" parameterType="QueryVo">
select * from t_user
<where>
<if test="user.name != null">
and name = #{user.name}
</if>
<if test="user.age != null">
and age = #{user.age}
</if>
</where>
</select>
- 用where标签包裹之后, 上面的sql语句就不能写where了
- where里面的sql语句的and只能写在前面, 不能写在后面
- set
<update id="modifyUserById" parameterType="cn.ann.bean.User">
update t_user
<set>
<if test="name!=null">
name = #{name},
</if>
<if test="age!=null">
age = #{age},
</if>
</set>
where id = #{id};
</update>
- 用set标签包裹之后, 上面的sql语句就不能写set了
- set里面的sql语句的 "," 只能写在后面, 不能写在前面
- foreach
<select id="getUsersByIdsVo" parameterType="QueryVo" resultType="User">
<include refid="query"/>
<where>
<foreach collection="ids" open="id in (" close=");" separator=", " item="id">
#{id}
</foreach>
</where>
</select>
- 因为传入的是QueryVo, 所以forEach的collection属性的值是属性名即可
- 两个坑
- 当传入的参数是数组时
<select id="getUsersByIds" parameterType="Integer" resultType="User">
<include refid="query"/>
<where>
<foreach collection="array" open="id in (" close=");" separator=", " item="id">
#{id}
</foreach>
</where>
</select>
- 当传入的参数是列表时
<select id="getUsersByIdList" parameterType="Integer" resultType="User">
<include refid="query"/>
<where>
<foreach collection="list" open="id in (" close=");" separator=", " item="id">
#{id}
</foreach>
</where>
</select>
- forEach的collection属性的值必须是list
- choose
<select id="getUserByCondition" resultType="User" parameterType="QueryVo">
select * from t_user
<where>
<choose>
<when test="user.name != null">
name = #{user.name}
</when>
<when test="user.age != null">
age = #{user.age}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</where>
</select>
- choose表示的是选一个, 相当于switch-case
- trim
<select id="getUserByCondition" resultType="User" parameterType="QueryVo">
select * from t_user
<trim prefix="where " prefixOverrides="and" suffix="" suffixOverrides="">
<if test="user.name != null">
and name = #{user.name}
</if>
<if test="user.age != null">
and age = #{user.age}
</if>
</trim>
</select>
- prefix: 前缀. 再结果字符串前面加的东西
- prefixOverrides: 如果编译结果前面有该字符串, 就去掉
- suffix: 后缀. 再结果字符串后面加的东西
- suffixOverrides: 如果编译结果后面有该字符串, 就去掉
- bind
<select id="getUsersByName" parameterType="String" resultType="cn.ann.bean.User">
<bind name="_name" value="'%' + name + '%'"/>
select * from t_user where name like #{_name};
</select>
- bind可以对参数进行处理, 上面代码就是处理成模糊查询