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>