定义sql语句 | insert,delete,update,select |
配置java对象属性与查询结果集中列名对应关系 | resultMap |
控制动态sql拼接 | foreach,if,choose,when,otherwise |
格式化输出 | where,set,trim |
配置关联关系 | collection,association |
定义常量 | sql,include |
目录
mybatis九大动态标签详解
- 1.if:你们能判断,我也能判断
<select id="count" resultType="java.lang.Integer">
select count(*) from user where <if test="id != null">id = #{id}</if> and username = 'xiarufeng'
</select>
如果传入的id不为空,那么SQL才会拼接id=#{id}
如果传入的id为null,那么最终的SQL语句就变成了select count(*) from user where and username=''xiarufeng";
这语句就会有问题,这时候where标签就隆重登场了
- 2. where: 有了我,sql语句拼接条件神马都是浮云
<select id="count" resultType="java.lang.Integer">
select count(*) from user
<where>
<if test="id != null">id = #{id}</if>
<if test="id != null">and username = 'xiarufeng'</if>
</where>
</select>
where元素只会在至少有一个子元素的条件返回SQL字句的情况下才会插入where子句,并且若语句的开头为and或or,where元素也会将他们去除,还可以通过trim标签取自定义这种处理规则
- 3.trim:我的地盘,我做主
trim标签一般用于拼接,去除sql的前缀、后缀
prefix 拼接前缀 suffix拼接后缀 prefixOverrides去除前缀 suffixOverrides去除后缀
<select id="count" result="java.lang.Integer">
select count(*) from user
<trim prefix ="where" prefixOverrides="and | or">
<if test="id != null">id = #{id}</if>
<if test="username != null"> and username = #{username}</if>
</trim>
</select>
如果id或者username有一个不为空,则在语句前加入where,如果where后面紧随and 或or就会自动会去除,如果id或者username都为空,则不拼接任何东西
- 4.set:信我,不出错!
<update id="UPDATE" parameterType="User">
update user
<set>
<if test="name != null">name = #{name},</if>
<if test="password != null">password = #{password},</if>
<if test="age != null">age = #{age},</if>
</set>
</update>
三个if至少有一个不为空,会在前面加上set,自动去除尾部多余的逗号
- 5.foreach:你有for,我有foreach
foreach标签中的属性
index 下标 item 每个元素名称 open该语句以什么开始 close该语句以什么结尾 separator在每次迭代之间以什么作为分隔符
collection 参数类型
如果参数类型为List,则该值为list
<select id="count" resultType="java.lang.Integer">
select count(*) from user where id in
<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</select>
如果参数类型为数组,则该值为array
<select id="count" resultType="java.lang.Integer">
select * from user where id inarray
<foreach collection="array" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</select>
如果参数类型为Map,则参数类型为Map的key
- 6.choose:我选择了你,你选择了我!
<select id="count" resultType="Blog">
select count(*) from user
<choose>
<when test="id != null">
and id = #{id}
</when>
<when test="username != null">
and username = #{username}
</when>
<otherwise>
and age = 18
</otherwise>
</choose>
</select>
当id和username都不为空的时候,那么选择二选一(前者优先) 如果都为空,那么选择otherwise中的,如果id和username只有一个不为空,那么就选择不为空的那个。
- 7.sql:相当于Java中的代码提重,需要配合include使用
<sql id="table"> user </sql>
- 8.include: 相当于Java终得方法调用
<select id="count" resultType="java.lang.Integer">
select count(*) from <include refid=“table(sql 标签中的 id 值)” />
</select>
- 9.bind:对数据进行再加工
<select id="count" resultType="java.lang.Integer">
select count(*) from user
<where>
<if test="name != null">
<bind name="name" value="'%' + username + '%'"
name = #{name}
</if>
</select>
其它一些标签的讲解:
- selectKey标签
作用:有些情况下,新增一条数据信息,但其主键id是数据库自动再数据库生成(自增),而有些业务逻辑的处理是需要要到这个生成的主键(Id)标签就是用来获取这个生成的主键id
自增主键:
<insert id="add" parameterType="com.demo.pojo.User">
<!--通过mybatis框架提供的selectKey标签获得自增产生的ID值-->
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
select LAST_INSERT_ID()
</selectKey>
insert into user(code,name,remark,sex) values(#{code},#{name},#{remark},#{sex})
</insert>
简单来说,selectKey会将select last_insert_id()的结果放入到传入的model的主键里面,即获取数据库里自动生成的id
keyProperty: 对应的model中的主键的属性名,跟数据库的主键对应
order: after表示select last_insert_id()在insert执行之后执行,多用与自增主键
before表示select last_insert_id()在insert执行之前执行,这样的话就拿不到主键了,适合那种主键不是自增的类型
resultType: 主键类型
非自增主键:
<insert id="add" parameterType="com.demo.pojo.User">
<!--通过mybatis框架提供的selectKey标签获得自增产生的ID值-->
<selectKey resultType="string" order="BEFORE" keyProperty="id">
select uuid()
</selectKey>
insert into user(id,code,name,remark,sex) values(#{id},#{code},#{name},#{remark},#{sex})
</insert>
insert语句需要写id字段,order属性需要写成before
2. 配置关联关系:
association: 通常用来映射一对一的关系
collection: 通常用来映射一对多的关系
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,在Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。