mybatis 批量操作增删改查

mybatis 批量操作增删改查

一.foreach标签相关属性介绍

在介绍批量操作之前首先需要了解一下关于批量操作的标签,我们都知道在Mybatis中我们使用foreach标签进行批量操作;
foreach标签中相关属性介绍:

在这里插入图片描述
在这里插入图片描述
这里值得注意的是:separator属性表示在元素之间使用什么样的分隔符进行分割,这里的元素是指在之间定义的部分为一个元素,正因有这个不同之处所以在进行IN操作和VALUES操作时会有所不同,后面会进行详细的讲解;

二.批量增删改查操作讲解

1.入参为List<?>,批量插入
示例一批量插入数据:
Mapper接口:

Integer batchAdd(List<UserEntity> userEntity);

XML文件:
collection的部分需要填写list作为键,由于在foreach中手动填写了“(”和“)”,因此不需要使用close和open,通过"item."的点路径访问UserEntity的属性。

<insert id="batchAdd" parameterType="java.util.List">
  INSERT INTO a(name, age, gender, psw, seq) values
  <foreach collection="list" item="item" index="index"  separator=",">
    ( #{item.name},#{item.age},#{item.gender},#{item.psw},#{item.seq})
  </foreach>
</insert>

注:这种情况由于在mapper接口上并没有使用@Param注解指定名称,所以在collection中只能使用list作为key;同时进行批量添加数据时每个元素开始和结尾的“()”需要我们自己进行手动添加;

示例二批量删除:
入参为List,使用@Param(“KeyName”)设置键,批量删除
Mapper接口:

Integer batchDelete(@Param("idList") List<Integer> idList);

XML文件:
由于设置了@Param,因此在collection的部分需要与@Param的名称相同,这里使用了close和open,因此在可以用“ #{item}” 来代替“(#{item})

<delete id="batchDelete" parameterType="java.util.List">
    DELETE FROM a where id in   //由于我们在mapper接口上使用了@param注解指定keyname,所以在collection中可以使用这个名称进行匹配
    <foreach collection="idList" item="item" separator="," open="(" close=")">
      #{item}
    </foreach>
</delete>

示例三多参数批量操作:

当接口只有一个入参的时候,可以不适用@Paramter,但当入参达到两个及以上时,必须使用
Mapper接口:

Integer batchUpdateOneVariable(@Param("user") UserEntity user,@Param("idList") List idList);

注:在mapper接口参数上有多个参数时,一定要使用@param指定各个参数的keyName,原因很简单以为我们在定义xml文件时只指定一个参数类型parameterType,这时如果有两参数势必要自己进行指定;

<update id="batchUpdateOneVariable" >
  UPDATE a set psw=#{user.psw}
  <where>
    id in (
    <if test="idList.size()!=0">
      <foreach collection="idList" separator="," item="item" index="index">
        #{item}
      </foreach>
    </if>
    )
  </where>
</update>

示例四批量查询操作:
入参为对象的某个字段
实体类:

@Data
@EqualsAndHashCode(callSuper = false)
public class UserEntity2 {
    private List<Integer> ids;
    private String name;
    private String gender;
    private Integer age;
    private String psw;
    private Integer seq;
}

Mapper接口:

List<UserEntity> batchSelect2(UserEntity2 userEntity2);

XML文件:

<select id="batchSelect2" parameterType="cn.com.exercise.batch.entity.UserEntity2" resultMap="user">
  select * from a
  <where>
    id in
    <foreach collection="ids" separator="," open="(" close=")" index="index" item="item">
      #{item}
    </foreach>
  </where>
</select>

示例五批量查询操作:
入参为Map对象,批量查询
Mapper接口:

List<UserEntity> batchSelect4(Map<String,Object> myMap);

XML文件:
入参为Map是,collecttion的名称写待循环的对象即可

<select id="batchSelect4" parameterType="java.util.Map" resultMap="user">
  select * from a
  <where>
    <if test="ageMap!=null">
      and age = #{ageMap}
    </if>
    <if test="idMap!=null">
      and id in
      <foreach collection="idMap" separator="," open="(" close=")" index="index" item="item">
        #{item}
      </foreach>
    </if>
  </where>
</select>

注:
1.如果在接口上不使用@param指定参数的别名那么在mybatis标签中进行获取属性时直接取内层属性即可,但是要写清楚参数的parameterType;
例如:在示例四中就是无参数别名的应用;
2.如果使用了@param进行mapper接口上的参数名称修饰,可以使用这个key.property的形式进行获取,这种情况一般不需要指明参数的parameterType,在mapper接口中有多个参数时经常使用这种方法进行定义;
例如:在示例三中,就是这种方式的应用;

这两种方式本身没有那种更好,我们在不同情况下可以选择不同的方式进行开发;

相关链接:https://www.cnblogs.com/wulisz/p/10194824.html

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过使用 MyBatis 的 `batch` 操作来实现批量增删改查。 首先,需要在 Mapper 中定义对应的方法,如下所示: ```java public interface UserMapper { void insertUsers(@Param("users") List<User> users); void updateUsers(@Param("users") List<User> users); void deleteUsers(@Param("ids") List<Integer> ids); List<User> selectUsers(@Param("ids") List<Integer> ids); } ``` 然后,在 Mapper.xml 文件中实现对应的 SQL 语句,如下所示: ```xml <insert id="insertUsers" parameterType="java.util.List"> insert into user (id, name, age) values <foreach collection="users" item="user" separator=","> (#{user.id}, #{user.name}, #{user.age}) </foreach> </insert> <update id="updateUsers" parameterType="java.util.List"> <foreach collection="users" item="user" separator=";"> update user set name=#{user.name}, age=#{user.age} where id=#{user.id} </foreach> </update> <delete id="deleteUsers" parameterType="java.util.List"> delete from user where id in <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </delete> <select id="selectUsers" parameterType="java.util.List" resultMap="userResultMap"> select * from user where id in <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </select> ``` 接下来,在 Java 代码中调用对应的方法,如下所示: ```java SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 批量插入用户 List<User> users = new ArrayList<>(); users.add(new User(1, "张三", 20)); users.add(new User(2, "李四", 21)); users.add(new User(3, "王五", 22)); userMapper.insertUsers(users); // 批量更新用户 users = new ArrayList<>(); users.add(new User(1, "张三三", 23)); users.add(new User(2, "李四四", 24)); users.add(new User(3, "王五五", 25)); userMapper.updateUsers(users); // 批量删除用户 List<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); ids.add(3); userMapper.deleteUsers(ids); // 批量查询用户 ids = new ArrayList<>(); ids.add(1); ids.add(2); List<User> userList = userMapper.selectUsers(ids); } finally { sqlSession.close(); } ``` 以上就是使用 MyBatis 的 `batch` 操作实现批量增删改查的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值