3.2 MyBatis XML 循环语句

MyBasis批量插入(foreach)

比如批量插入 user,我们先创建 DAO 方法

What is DAO?

DAO(Data Access Object) 模型就是写一个类,把访问数据库的代码封装起来,DAO在数据库与业务逻辑(Service)之间。Dao是数据访问层,Dao的作用是封装对数据库的访问:增删改查,不涉及业务逻辑,只是达到按某个条件获得指定数据的要求。

package com.youkeda.comment.dao;

import com.youkeda.comment.dataobject.UserDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

@Mapper
public interface UserDAO {

    int batchAdd(@Param("list") List<UserDO> userDOs);

}

我们来看一下 foreach 语法

<insert id="batchAdd" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user (user_name, pwd, nick_name,avatar,gmt_created,gmt_modified)
    VALUES
    <foreach collection="list" item="it" index="index" separator =",">
        (#{it.userName}, #{it.pwd}, #{it.nickName}, #{it.avatar},now(),now())
    </foreach >
</insert>

foreach 相当于执行了 Java 的 for 循环,它有几个属性

  • collection 指定集合的上下文参数名称,比如这里的 list,对应的是 @Param("list")
  • item 指定遍历中的每一个数据的变量,一般我们用 it 命名,所以就可以使用 it.userName 这种获取具体的值啦
  • index 集合的索引值,从0开始
  • separator 遍历每条记录并添加分隔符

上面的 SQL 最终执行会变成

INSERT INTO user (user_name, pwd, nick_name,avatar,gmt_created,gmt_modified)
    VALUES
    (?, ?, ?,?,now(),now()),
    (?, ?, ?,?,now(),now()),
    (?, ?, ?,?,now(),now())

MyBatis 会自动优化最后一个 , 确保 SQL 是正确的。

批量插入在实际工作场景中使用的是非常多,我们用好 foreach 语句即可,有的时候面试官也会问批量插入的问题

MyBasis批量查询(SQL in;Foreach)

还是先创建 DAO 方法

package com.youkeda.comment.dao;

import com.youkeda.comment.dataobject.UserDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

@Mapper
public interface UserDAO {

    List<UserDO> findByIds(@Param("ids") List<Long> ids);

}

然后,我们再完善 SQL XML

<select id="findByIds" resultMap="userResultMap">
    select * from user
    <where>
        id in
        <foreach item="item" index="index" collection="ids"
                    open="(" separator="," close=")">
            #{item}
        </foreach>
    </where>
</select>

这里多了两个参数

  • open

    表示的是节点开始时自定义的分隔符

  • close

    表示的是节点结束时自定义的分隔符

上面的 SQL 执行后会变成

select * from user where id in (?,?,?)

pay attention!!

  1. 这个一定不能搞错!!!! 一开始是写成了mysql:/ ,漏了一个/~QwQ
    spring.datasource.url=jdbc:mysql://mysql数据库地址:数据库端口/数据库名称?serverTimezone=GMT%2B8
    spring.datasource.url=jdbc:mysql://192.168.0.1:3306/comment?serverTimezone=GMT%2B8

  2. 一定要连接并且创建好数据库!!! 调试了好久都没有实现!!!一定不能搞错了!!!

3.homework:

List<CommentDO> findByUserIds(@Param("userIds") List<Long> ids);
 <delete id="delete">
        delete from comment where id=#{id}
    </delete>


    <select id="findAll" resultMap="commentResultMap">
        select * from comment
    </select>

    <select id="findByUserIds" resultMap="commentResultMap">
        select * from comment
        <where>
            user_id in  // 和数据库中一致
            <foreach item="it" index="index" collection="userIds"// 和参数一致
                     open="(" separator="," close=")">
                #{it}
            </foreach>
        </where>
    </select>
posted @ 2024-11-03 10:27  芝麻番茄  阅读(243)  评论(0)    收藏  举报