mybatis动态sql标签

if标签

比如UserMapper.xml

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">
	SELECT id, username, birthday, sex, address FROM `user`
	WHERE 1=1
	<if test="sex != null and sex != ''">
		AND sex = #{sex}
	</if>
	<if test="username != null and username != ''">
		AND username LIKE
		'%${username}%'
	</if>
</select>

where标签

比如UserMapper.xml

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">
	SELECT id, username, birthday, sex, address FROM `user`
<!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
	<where>
		<if test="sex != null">
			AND sex = #{sex}
		</if>
		<if test="username != null and username != ''">
			AND username LIKE
			'%${username}%'
		</if>
	</where>
</select>

sql片段标签

Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">
	<!-- SELECT id, username, birthday, sex, address FROM `user` -->
	<!-- 使用include标签加载sql片段;refid是sql片段id -->
	SELECT <include refid="userFields" /> FROM `user`
	<!-- where标签可以自动添加where关键字,同时处理sql语句中第一个and关键字 -->
	<where>
		<if test="sex != null">
			AND sex = #{sex}
		</if>
		<if test="username != null and username != ''">
			AND username LIKE
			'%${username}%'
		</if>
	</where>
</select>

<!-- 声明sql片段 -->
<sql id="userFields">
	id, username, birthday, sex, address
</sql>

如果要使用别的Mapper.xml配置的sql片段,可以在refid前面加上对应的Mapper.xml的namespace
在这里插入图片描述

foreach标签

向sql传递数组或List,mybatis使用foreach解析
比如根据多个id查询用户信息

<!-- 根据ids查询用户 -->
<select id="queryUserByIds" parameterType="queryVo" resultType="user">
	SELECT * FROM `user`
	<where>
		<!-- foreach标签,进行遍历 -->
		<!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
		<!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
		<!-- open:在前面添加的sql片段 -->
		<!-- close:在结尾处添加的sql片段 -->
		<!-- separator:指定遍历的元素之间使用的分隔符 -->
		<foreach collection="ids" item="item" open="id IN (" close=")"
			separator=",">
			#{item}
		</foreach>
	</where>
</select>

QueryVo
在这里插入图片描述

trim标签

背景

parameterType参数类型student是别名,里面的字段有id,name,age,sex被封装成bean对象,跟数据库中student表中字段一一对应,以下案例只为一个SQL语句。

1、prefix属性:在trim开始部分添加内容

例,在trim前面加上set

<update id="updateStudent2" parameterType="student"> 
	update student 
	<trim prefix="set">
		<if test="name!=null and name!=''">name=#{name},</if>
		<if test="age!=null and age!=''">age=#{age},</if>
		<if test="sex!=null and age!=''">sex=#{sex}</if>
	</trim>
	<where>id=#{id}</where>
</update>

2、suffix属性:在trim结束部分添加内容

例,在后面添加上where内容

<update id="updateStudent2" parameterType="student"> 
	update student set 
	<trim suffix="where id=#{id}">
		<if test="name!=null and name!=''">name=#{name},</if>
		<if test="age!=null and age!=''">age=#{age},</if>
		<if test="sex!=null and age!=''">sex=#{sex}</if>
	</trim>
</update>

3.prefixOverrides属性:去除trim开始部分的内容

例,删掉name前面的set

<update id="updateStudent2" parameterType="student"> 
	update student set 
	<trim prefixOverrides="set">
		<if test="name!=null and name!=''">set name=#{name},</if>
		<if test="age!=null and age!=''">age=#{age},</if>
		<if test="sex!=null and age!=''">sex=#{sex}</if>
	</trim>
	<where>id=#{id}</where>
</update>

4、suffixOverrides属性:去除trim结束部分的内容

例,删掉最后一个逗号

<update id="updateStudent2" parameterType="student"> 
	update student set 
	<trim suffixOverrides=",">
		<if test="name!=null and name!=''">name=#{name},</if>
		<if test="age!=null and age!=''">age=#{age},</if>
		<if test="sex!=null and age!=''">sex=#{sex},</if>
	</trim>
	<where>id=#{id}</where>
</update>

choose标签

choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满足时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
例如下面例子,同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的test为true的sql执行。安全考虑,我们使用where将choose包起来,放置关键字多于错误。

<!--  choose(判断参数) - 按顺序将实体类 User 第一个不为空的属性作为:where条件 -->  
<select id="getUserList_choose" resultMap="resultMap_user" parameterType="com.yiibai.pojo.User">  
    SELECT *  
      FROM User u   
    <where>  
        <choose>  
            <when test="username !=null ">  
                u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')  
            </when >  
            <when test="sex != null and sex != '' ">  
                AND u.sex = #{sex, jdbcType=INTEGER}  
            </when >  
            <when test="birthday != null ">  
                AND u.birthday = #{birthday, jdbcType=DATE}  
            </when >  
            <otherwise>  
            </otherwise>  
        </choose>  
    </where>    
</select>

choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中 的 choose 很类似

selectKey标签

在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。
比如使用mysql的 LAST_INSERT_ID()函数

<!-- 保存用户 -->
<insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User">
	<!-- selectKey 标签实现主键返回 -->
	<!-- keyColumn:主键对应的表中的哪一列 -->
	<!-- keyProperty:主键对应的pojo中的哪一个属性 -->
	<!-- order:设置在执行insert语句前执行查询id的sql,还是在执行insert语句之后执行查询id的sql -->
	<!-- resultType:设置返回的id的类型 -->
	<selectKey keyColumn="id" keyProperty="id" order="AFTER"
		resultType="int">
		SELECT LAST_INSERT_ID()
	</selectKey>
	INSERT INTO `user`
	(username,birthday,sex,address) VALUES
	(#{username},#{birthday},#{sex},#{address})
</insert>

如果报错:必须为selectKey声明属性keyColumn;则去掉keyColumn属性即可

set标签

使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。

<update id="updateUserById" parameterType="cn.itcast.mybatisdemo.pojo.User">  
    UPDATE user 
    <set>  
        <if test="username!= null and username!= '' ">  
           username = #{username },  
        </if>  
        <if test="sex!= null and sex!= '' ">  
            sex = #{sex},  
        </if>  
        <if test="birthday!= null ">  
            birthday = #{birthday},  
        </if>  
        <if test="address!= null ">  
            address= #{address},  
        </if>  
    </set>  
    WHERE id = #{id};      
</update>  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值