Mybatis笔记 (7)

情景:对用户可以有通过name 或 gender的搜索,如果没有if动态逻辑,则是要定义多个<select>

<select parameterType="User" resultType="User"> SELECT id,name,gender,regist_time FROM t_user WHERE <if test="name != null and name!=''"> name=#{name} </if> <if test="gender != null"> AND gender=#{gender} </if> </select> <!-- 如上如果gender为null,name不为null,则sql为: SELECT id,name,gender,regist_time FROM t_user WHERE name=#{name} --> <!-- 如上如果gender不为null,name不为null,则sql为: SELECT id,name,gender,regist_time FROM t_user WHERE name=#{name} AND gender=#{gender} --> <!-- 补充:比较的其他用法 --> <select parameterType="User" resultType="User"> SELECT id,name,gender,regist_time FROM t_user WHERE <if test="name == null or name=='zhj'"> name=#{name} </if> <if test="id>=1"> AND id>#{id} </if> <if test="gender == false"> AND gender=#{gender} </if> </select> 2. Choose

如果在多个判断中,只会有一个是可以成立的,可以使用Choose标签

<!-- 如果id不为空就按id查询。如果id为空但name不为空就按name查询。如果都为空,就查询所有男性用户。 --> <select parameterType="User" resultType="User"> SELECT id,name,gender,regist_time FROM t_user WHERE <choose> <!-- 从上到下,有任何一个when标签,判断成功则停止判断 --> <when test="id != null"> <!-- 判断 --> id > #{id} </when> <when test="name !=null"> <!-- 判断 --> name = #{name} </when> <otherwise> <!-- 以上判断都不成立时,执行 --> gender = '1' </otherwise> </choose> </select>

注意,在sql中的判断,本意不在于判断,而在于将sql动态的适应不同场景,简化开发。

3. Where

动态sql在使用中,存在一些问题:

<select parameterType="User" resultType="User"> SELECT id,name,gender,regist_time FROM t_user WHERE <if test="name != null"> name=#{name} </if> <if test="id>=1"> AND id>#{id} </if> </select> <!-- 如果 name=null,id=3,则sql变为: SELECT id,name,gender,regist_time FROM t_user WHERE AND id>#{id} --> <!-- 如果 name=null,id=0,则sql变为: SELECT id,name,gender,regist_time FROM t_user WHERE -->

<where> 标签中如果没有成立的条件,则不会拼接where语句;

<where> 标签中如果以 and 或 or开头,会去将其去除。

<select parameterType="User" resultType="User"> SELECT id,name,gender,regist_time FROM t_user <where> <if test="name == null"> name=#{name} </if> <if test="id>=1"> AND id>#{id} </if> </where> </select> <!-- 如果 name=null,id=3,则sql变为: SELECT id,name,gender,regist_time FROM t_user WHERE id>#{id} --> <!-- 如果 name=null,id=0,则sql变为: SELECT id,name,gender,regist_time FROM t_user --> 4. Set

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyywd.html