Mybatis标签的理解

mybatis全部标签
定义sql语句insert,delete,update,select
配置java对象属性与查询结果集中列名对应关系resultMap
控制动态sql拼接foreach,if,choose,when,otherwise
格式化输出where,set,trim
配置关联关系collection,association
定义常量sql,include

目录

mybatis九大动态标签详解

其它一些标签的讲解:


mybatis九大动态标签详解

  1. 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标签就隆重登场了

  1. 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标签取自定义这种处理规则

  1. 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都为空,则不拼接任何东西

  1. 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,自动去除尾部多余的逗号

  1. 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

  1. 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只有一个不为空,那么就选择不为空的那个。

  1. 7.sql:相当于Java中的代码提重,需要配合include使用
<sql id="table"> user </sql>
  1. 8.include: 相当于Java终得方法调用
<select id="count" resultType="java.lang.Integer">
    select count(*) from <include refid=“table(sql 标签中的 id 值)” />
</select>
  1. 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>

其它一些标签的讲解:

  1. 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如风之夏

感谢,你的鼓励是我前进的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值