目前常见的标签有:
<mapper>标签
这是XML文件配置的根标签,并且XML文件配置的根标签必须是<mapper>;
<mapper>标签上必须配饰 namespace 属性,此属性的值是接口 XX 的全限定名(包名与接口名);
比如:
<mapper namespace="cn.csmall.product.mapper.BrandMapper">
增删改查 语句标签
<resultMap>标签
详解见个人关于ResultMap文章。
<SQL>标签
用来定义sql片段,以此达到复用;
比如原XML:
<!--List<AlbumListItemVO> list();-->//此处是对应抽象方法
<select id="list" resultMap="ListResultMap">
select id, name, description, sort
from pms_album
group by id desc
</select>
<!-- 此处resultMap标签没写封装字段对应的属性名 是因为名字一样可以省略 -->
<resultMap id="ListResultMap" type="cn.tedu.csmall.product.pojo.vo.AlbumListItemVO">
</resultMap>
使用
使用<sql>标签进行复用,可以当多个 SQL块通过<include >标签通过 refid 找到对应的<sql>标签的id使用使用
如下所示:
<!--List<AlbumListItemVO> list();-->
<select id="list" resultMap="ListResultMap">
select <include refid="ListQueryFields"></include>
from pms_album
group by id desc
</select>
<sql id="ListQueryFields" >
<if test="true"> //此处的<if>标签没有特殊含义,只是为了更严谨
id, name, description, sort
</if>
</sql>
<resultMap id="ListResultMap" type="cn.csmall.product.pojo.vo.AlbumListItemVO">
<foreach>标签
作用:常用语 in 这样的语法中;这里用接收 list 集合为例:
XML中配置的 批量插入操作:
<!--int insertBatch(List<Album> albumList) 批量插入-->
<insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">
insert into pms_album(name,description,sort) values
<foreach collection="list" item="album" separator="," >
(#{album.name},#{album.description},#{album.sort})
</foreach>
</insert>
此代码是循环 插入list表数据。
<if>标签
用法:进行判断,跟java中的if类似 但是需要注意Mybatis中:没有if ... else...的语句
<if test="name!=null">
name=#{name},
</if>
<if test="sort!=null">
sort=#{sort}
</if>
作用就是 防止传入空值;比如,当进行更新操作时,为了代码效率(防止每一个更新情况都对应要配置一个<update>),一般会把所有有可能需要更新的表字段 写入XML中的<update>标签中;这样后,当你只想跟心name的值时,会只传入name的值,其他值为空,如果没有这if判断,空值会直接传入,这样跟新得到的数据 除了name是跟新后的值,其他表字段的值全默认传了空值。
<set>标签和<where>标签类似
一般<set>标签和<where>标签都和<if>标签结合使用;此外<set>和<where>标签都有自动判断功能;
自动判断:
如果任何条件都不成立,那么就在sql语句里就不会出现set/where关键字,
如果有任何条件成立,<set>会自动去掉多余的",";而<where>会自动去掉多出来的 and 或者 or。
<set>演示
<update id="updateById" >
UPDATE pms_album
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="description!=null">
description=#{description},
</if>
<if test="sort!=null">
sort=#{sort},
</if>
</set>
WHERE
id=#{id}
</update>
注意:多个属性时,第一个属性 如 name=#{name}, 后必须加,之后的属性会自动判断是否添加。 此处我们无法判断 那个修改的属性是第一个(因为存在可能某个属性不修改的情况),为此我们尽量每个属性结尾都添加个 , 号。
<where>演示
<select id="listProduct" resultType="Product">
select * from product_
<where>
<if test="name!=null">
and name like concat('%',#{name},'%')
</if>
<if test="price!=null and price!=0">
and price > #{price}
</if>
</where>
</select
此处的 每个属性 前都加了and 原因和上述一样。
choose when otherwise 标签
<if>标签中说明了Mybatis中没有if...else...的语句,其实choose when otherwise标签就相当于if...else。
when 相当于 if ; otherwise 相当于 else
演示:
<select id="listProduct" resultType="Product">
SELECT * FROM product_
<where>
<choose>
<when test="name != null">
and name like concat('%',#{name},'%')
</when>
<when test="price !=null and price != 0">
and price > #{price}
</when>
<otherwise>
and id >1
</otherwise>
</choose>
</where>
</select>