MyBatis 的动态 SQL 元素与 JSTL 或 XML 文本处理器相似,
常用 <if>、<choose>、<when>、<otherwise>、<trim>、<where>、<set>、<foreach> 和 <bind> 等元素。
一、if标签:条件判断
MyBatis 中 <if> 元素是最常用的元素,它类似于 Java 中的 if 语句。具体过程如下:
在 com.mybatis 包的 UserMapper.xml 文件中添加如下 SQL 映射语句:
<!--使用 if 元素根据条件动态查询用户信息--> <select id="selectUserByIf" resultType="com.po.MyUser" parameterType="com.po.MyUser"> select * from user where 1=1 <if test="uname!=null and uname!=''"> and uname like concat('%',#{uname},'%') </if > <if test="usex !=null and usex !=''"> and usex=#{usex} </if > </select>
测试:
// 使用 if 元素查询用户信息 MyUser ifmu=new MyUser(); ifmu.setUname ("张"); ifmu.setUsex ("女"); List<MyUser> listByif=userDao.selectUserByIf(ifmu); System.out.println ("if元素================"); for (MyUser myUser:listByif) { System.out.println(myUser); }
<select id="findByConditionWithIf" resultType="com.ykq.entity.Account"> select * from account <where> <if test="name!=null and name!=''"> and name like concat('%',#{name},'%') </if> <if test="isdeleted!=null"> and isdeleted=#{isdeleted} </if> </where> </select>
二、
有些时候不想用到所有的条件语句,而只想从中择取一二,针对这种情况,MyBatis 提供了 <choose> 元素,它有点像 Java 中的 switch 语句。具体过程如下:
<!--使用choose、when、otherwise元素根据条件动态查询用户信息--> <select id="findByConditionWithChoose" resultType="com.ykq.entity.Account"> select * from account <where> <choose> <when test="name!=null and name!=''"> and name like concat('%',#{name},'%') </when> <when test="isdeleted!=null"> and isdeleted=#{isdeleted} </when> <otherwise> <![CDATA[and money <1000 ]]> </otherwise> </choose> </where> </select>
三、<trim>元素
<trim> 元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是 prefix 和 suffix。
可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是 prefixOverrides 和 suffixOverrides。正因为 <trim> 元素有这样的功能,所以也可以非常简单地利用 <trim> 来代替 <where> 元素的功能。
<select id="findByConditionWithChoose" resultType="com.ykq.entity.Account"> select * from account <trim prefix="where" prefixOverrides="or|and" > <choose> <when test="name!=null and name!=''"> and name like concat('%',#{name},'%') </when> <when test="isdeleted!=null"> and isdeleted=#{isdeleted} </when> <otherwise> <![CDATA[or money <1000 ]]> </otherwise> </choose> </trim> </select>
四、foreach标签
<foreach> 元素主要用在构建 in 条件中,它可以在 SQL 语句中迭代一个集合。
<foreach> 元素的属性主要有 item、index、collection、open、separator、close。
- item 表示集合中每一个元素进行迭代时的别名。
- index 指定一个名字,用于表示在迭代过程中每次迭代到的位置。
- open 表示该语句以什么开始。
- separator 表示在每次进行迭代之间以什么符号作为分隔符。
- close 表示以什么结束。
在使用 <foreach> 元素时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:
- 如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。
- 如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。
- 如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。
<select id="findByConditionWithFor" resultType="com.ykq.entity.Account"> select * from account <where> <if test="ids!=null and ids.length>0"> id in <foreach collection="ids" open="(" close=")" separator="," item="id"> #{id} </foreach> </if> </where> </select>