Mybatis大总结

1、大于等于小于等于的写法

原符号       <        <=      >       >=       &        '        "
替换符号    &lt;    &lt;=   &gt;    &gt;=   &amp;   &apos;  &quot;
例如:sql如下:
create_date_time &gt;= #{startTime} and  create_date_time &lt;= #{endTime}

 2、foreach 标签实现批量新增和批量删除等;

<insert id="insertBatch" >
    insert into person ( <include refid="Base_Column_List" /> ) 
    values 
    <foreach collection="list" item="item" index="index" separator=",">
        (null,#{item.name},#{item.sex},#{item.address})
    </foreach>
</insert>

参数解释
foreach 的主要作用在构建 in 条件中,它可以在 sql 语句中进行迭代一个集合。foreach 元素的属性主要有 collection,item,separator,index,open,close。

  1. collection:指定要遍历的集合。表示传入过来的参数的数据类型。该属性是必须指定的,要做 foreach 的对象。在使用 foreach 的时候最关键的也是最容易出错的就是 collection 属性。在不同情况 下,该属性的值是不一样的,主要有一下 3 种情况:
    a. 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 list。
    b. 如果传入的是单参数且参数类型是一个数组的时候,collection 的属性值为 array。
    c. 如果传入的参数是多个的时候,就需要把它们封装成 Map,当然单参数也可以封装成 Map。Map 对象没有默认的键。

  2. item:表示集合中每一个元素进行迭代时的别名。将当前遍历出的元素赋值给指定的变量,然后用#{变量名},就能取出变量的值,也就是当前遍历出的元素。

  3. separator:表示在每次进行迭代之间以什么符号作为分隔符。select * from tab where id in(1,2,3)相当于1,2,3之间的","

  4. index:索引。index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置。遍历 list 的时候 index 就是索引,遍历 map 的时候 index 表示的就是 map 的 key,item 就是 map 的值。

  5. open/close:表示该语句以什么开始/结束。

3、批量新增的同时如果已存在则批量修改 

        案例:售卖机项目:每个售卖机有不同的货道,每个货道上有商品,以及商品的数量,现在要批量保存四个参数:(机器id,货道号,商品id,商品数量)PS:如果机器id和货道号已存在则更新操作,否则新增,即机器id和货道号只能存在一次;

实现方式:在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,那么 插入的行与表 与 现有记录 的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。

总结: 存在则更新,如果不存在则新增

条件 操作
唯一索引/主键相同 更新原有数据
唯一索引/主键不同 插入新数据

 分析:需求中是两个字段,所以要使用唯一索引来实现

 代码示例:

 <insert id="insertOrUpdateBatch">
        insert into machine_goods_check (machine_id, aisles, goods_id,
        `number`, account, data_created,last_updated)
        VALUES
        <foreach collection="machineGoodsCheckList" index="index" item="item" separator=",">
            (#{item.machineId,jdbcType=BIGINT}, #{item.aisles,jdbcType=INTEGER}, #{item.goodsId,jdbcType=BIGINT},
             #{item.number,jdbcType=INTEGER}, #{item.account,jdbcType=INTEGER}, #{date}, #{date})
        </foreach>
        ON DUPLICATE KEY UPDATE
        machine_id = VALUES(machine_id),
        aisles = VALUES(aisles),
        goods_id = VALUES(goods_id),
        number = VALUES(number),
        account = VALUES(account),
        last_updated = VALUES(last_updated)
    </insert>

Guess you like

Origin blog.csdn.net/weixin_52540274/article/details/119824790