文章目录

  • 前言
  • Java使用MyBatis实现对数据的批量添加与批量删除
  • 一、MyBatis是什么?
  • 二、使用步骤
  • 1.引入库
  • 2.数据模拟
  • 3. 在项目下创建实体类及对应的mapper文件和mapper.xml文件
  • 3.1.goods实体类
  • 3.2.GoodsMapper文件
  • 3.3.GoodsMapper.xml文件
  • 3.4.工具类
  • 3.5.测试类
  • 总结



前言

提示:这里可以添加本文要记录的大概内容:

Java使用MyBatis实现对数据的批量添加与批量删除

提示:以下是本篇文章正文内容,下面案例可供参考

一、MyBatis是什么?

MyBatis中文网 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

二、使用步骤

1.引入库

代码如下(示例):
首先在pom.xml文件中加入依赖,如下所示

<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.15</version>
        </dependency>

2.数据模拟

下面是我使用的数据库表

/*
 Navicat Premium Data Transfer

 Source Server         : RpWn
 Source Server Type    : MySQL
 Source Server Version : 50735 (5.7.35)
 Source Host           : localhost:3306
 Source Schema         : demo

 Target Server Type    : MySQL
 Target Server Version : 50735 (5.7.35)
 File Encoding         : 65001

 Date: 19/03/2024 19:11:07
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for goods
-- ----------------------------
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `price` decimal(10, 2) NULL DEFAULT NULL,
  `num` int(11) NULL DEFAULT 0,
  `weight` decimal(10, 2) NULL DEFAULT NULL,
  `cpu` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `memory` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `bodyMemory` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `createTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `isdel` bit(1) NULL DEFAULT b'0',
  `categoryCode` varchar(7) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 146 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;

SET FOREIGN_KEY_CHECKS = 1;

3. 在项目下创建实体类及对应的mapper文件和mapper.xml文件

3.1.goods实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@Alias("goods")
public class Goods {
    int id;
    String code;
    String name;
    double price;
    int num;
    double weight;
    String cpu;
    String memory;
    String bodyMemory;
    String createTime;
    String updateTime;
    String categoryCode;
}

3.2.GoodsMapper文件

public interface GoodsMapper {

    int foreachAdd(List<Goods> list);

    int removeMany(List<Integer> list);
}

3.3.GoodsMapper.xml文件

<mapper namespace="com.llf.mapper.GoodsMapper">
    <insert id="foreachAdd" parameterType="java.util.List">
        insert into goods (
        code,
        name,
        price,
        num,
        weight,
        cpu,
        memory,
        bodyMemory,
        categoryCode
        )
        values
        <foreach collection="list" item="goods" index="index" separator=",">
            (
            #{goods.code,jdbcType=VARCHAR},
            #{goods.name,jdbcType=VARCHAR},
            #{goods.price,jdbcType=DOUBLE},
            #{goods.num,jdbcType=INTEGER},
            #{goods.weight,jdbcType=DOUBLE},
            #{goods.cpu,jdbcType=VARCHAR},
            #{goods.memory,jdbcType=VARCHAR},
            #{goods.bodyMemory,jdbcType=VARCHAR},
            #{goods.categoryCode,jdbcType=VARCHAR}
            )
        </foreach>
    </insert>
    <delete id="removeMany">
        update goods
        set isdel=1
        where id in
        <foreach collection="list" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>
</mapper>

因为我在做删除操作时是使用逻辑删除,即在表中添加了一个isdel字段来表示是否删除,如果是物理删除则需要改为:

<delete id="removeMany">
        delete from goods
        where id in
        <foreach collection="list" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

这样就是把数据库表中的数据给删除了

3.4.工具类

利用单例模式创建唯一的SqlSessionFactory实例对象,因为这个类是重量级的,而我们程序关闭前都使用同一个,所以我们要这样设计,减少资源浪费。

public class FactoryUtil {
    @Getter
    private static final SqlSessionFactory factory;

    static {
        InputStream is = FactoryUtil.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        factory = builder.build(is);
    }

}

3.5.测试类

public void testForeachAdd() {
        SqlSession session = FactoryUtil.getFactory().openSession(true);
        GoodsMapper goodsMapper = session.getMapper(GoodsMapper.class);
        List<Goods> list = new ArrayList<>();
        list.add(new Goods(0, "123", "zx", 32, 4, 34.5, "cpu", "16", "128", null, null, "123"));
        list.add(new Goods(0, "132123", "z22x", 312, 41, 324.5, "cpu", "16", "128", null, null, "12123"));
        list.add(new Goods(0, "231123", "z22x", 326, 46, 314.5, "cpu", "16", "128", null, null, "12311"));
        int n = goodsMapper.foreachAdd(list);
        System.out.println(n);
        session.close();
    }


public void testRemoveMany() {
        SqlSession session = FactoryUtil.getFactory().openSession(true);
        GoodsMapper goodsMapper = session.getMapper(GoodsMapper.class);
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        int n = goodsMapper.removeMany(list);
        System.out.println(n);
        session.close();
    }

提示:在MyBatis中对数据库数据进行增删改时默认事务不会自动提交,所以我们在创建SqlSession对象时要在openSession方法中加入一个参数true,即可自动提交事务。


总结

在使用MyBatis是要常看官方文档,MyBatis中文网,看文档看API我们才会更熟悉,才会更深刻的去使用别的框架。