Mybaits动态Sql(三)
什么是动态sql?
mybatis的强大之处便是它的动态sql,如果你使用jdbc那么在根据不同条件查询时,拼接sql语句是多么的痛苦。 比如查询一个学生信息,可以根据学生的姓名,性别,班级,年龄,学历等信息来查询,并且多个条件可以任意组合。 而mybatis中集成了非常强大的 ognl表达式,可以帮助我们解决这个问题。
if标签
if标签作为mybatis动态sql中的条件判断,它可以判断你是否传入某个字段的值以决定你是否执行这条sql语句。
<select id="selectif" parametertype="map" resultmap="employee"> select * from tal_employee where 1=1 <if test="lastname!=null and lastname!=''"> and last_name=#{lastname}, </if> <if test="email!=null and email!=''"> and email=#{email}, </if> <if test="gender!=null and gender!=''"> and gender=#{gender}, </if>
</select>
使用if标签可以完成我们的动态sql语句并且,我们很多时候可能判断这个的时候却又不判断那个,我们只好分成几个方法写,有了这个if标签我们就可以很好根据业务需求完成自己的语句拼接合并成一个方法。
where标签
where标签可以替代if和choose标签,不需要添加多余的where 1=1条件。当where中的条件没有一个满足时,不输出where关键字。如果条件满足,会去掉第一个开头的and或者or。
<select id="findall" resultmap="employee" parametertype="map"> select * from tal_employee <!-- 使用where会去除前面 and/or --> <where> <if test="lastname!=null and lastname!=''"> and last_name=#{lastname} </if> <if test="email!=null and email!=''"> and email=#{email} </if> <if test="gender!=null and gender!=''"> and gender=#{gender} </if> </where> </select>
choose标签
有些时候,我们不想用到所有的条件语句,而只想从中择其一二。 choose标签为mybatis中的提供多重条件判断,使用when和otherwise标签进行条件判断,多个条件中只有一个被执行。
<select id="choosetest" parametertype="map" resultmap="employee"> select * from tal_employee <choose> <when test="lastname != null and lastname != ''"> and last_name like concat('%',#{lastname},'%') </when> <when test="gender != null and gender != ''"> and gender = #{gender} </when> <!-- 如果上面两个条件不成立,那么会选择otherwise标签相当于ifelse --> <otherwise> and id = #{id} </otherwise> </choose> </select>
set标签
set标签主要用于在update更新值时,动态添加更新的列,如果列没有值则不添加。避免使用多余的,号。
<update id="update" parametertype="map"> update tal_employee <!-- 使用set会去除末尾逗号 --> <set> <if test="lastname!=null and lastname!=''"> last_name=#{lastname}, </if> <if test="email!=null and email!=''"> email=#{email}, </if> <if test="gender!=null and gender!=''"> gender=#{gender}, </if> </set> where id = #{id} </update>
有了set这个标签就想指定更新那个字段就是那个字段,高端大气上档次。
trim标签
where默认是将第一个的and或者or去掉,set是将更新中的,去掉,如果用户想自定义一些规则,则需要使用另外一个自定义标签<trim>。
<!-- 替代set标签 --> <trim prefix="set" suffixoverrides=","> <if test="lastname!= null"></if> </trim> <!-- 替代where标签 --> <trim prefix="where" prefixoverrides="and|or"> <if test="lastname!= null"></if> </trim>
foreach标签
foreach标签这个标签是用来迭代我们的集合对象,它支持list,array,map。它有属性:
collection:循环集合或指定类型
item:每次迭代的结果
separator:设置分隔符
open:开始符号(前缀)可选
close:结束符号(后缀)可选
index:list和数据的序号,可选
<select id="manyid" parametertype="list" resultmap="employee"> select * from tal_employee where id in <foreach collection="list" item="id" open="(" close=")" separator=","> #{id} </foreach> </select>
sql标签
用来定义常量,通过include来引用
<sql id="select"> select * from tal_employee </sql>
<select id="findall" resultmap="employee"> <!--select * from tal_employee --> <!-- 引入已经定义好的sql --> <include refid="select"></include> </select>