【05】SpringBoot3 MybatisPlus 添加(Mapper)

SpringBoot3 MybatisPlus 添加(Mapper)

  • 前言
  • [添加 API](#添加 API)
    • insert
    • [insert 批量(默认)](#insert 批量(默认))
    • [insert 批量(自定义)](#insert 批量(自定义))
    • insertOrUpdate
    • [insertOrUpdate 批量(默认)](#insertOrUpdate 批量(默认))
    • [insertOrUpdate 批量(自定义)](#insertOrUpdate 批量(自定义))

前言

本篇中使用到的项目工程是在《SpringBoot3 MybatisPlus 加入日志功能》基础上,持续功能开发。

添加 API

insert

官网 API:

java 复制代码
    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    int insert(T entity);

Demo 示例:

java 复制代码
    @Test
    public void testInsert() {
        ClientEntity clientEntity = new ClientEntity();
        clientEntity.setId(999L);
        clientEntity.setClientId(1001L);
        // 此处省略其他属性的 set 方法
        // clientEntity.setXXX;
        clientEntity.setNickName("测试姓名999");
        int insertResult = clientMapper.insert(clientEntity);
        System.out.println("insertResult = " + insertResult);
    }

输出日志:

insert 批量(默认)

查阅官网 API 可知,默认 int DEFAULT_BATCH_SIZE = 1000; 按 1000 条数据进行批量提交。

官网 API:

java 复制代码
    /**
     * 插入(批量)
     *
     * @param entityList 实体对象集合
     * @since 3.5.7
     */
    default List<BatchResult> insert(Collection<T> entityList) {
        return insert(entityList, Constants.DEFAULT_BATCH_SIZE);
    }
    
    /**
     * 默认批次提交数量
     */
    int DEFAULT_BATCH_SIZE = 1000;
    

Demo 示例:

java 复制代码
    @Test
    public void testInsert_02() {

        // 生成批量测试数据.
        List<ClientEntity> clientEntityList = new ArrayList();
        for(int i = 200; i <= 210; i++) {
            ClientEntity clientEntity = new ClientEntity();
            clientEntity.setId(Long.valueOf(i + 1));
            clientEntity.setClientId(Long.valueOf(i + 1));
            // 此处省略其他属性的 set 方法
            // clientEntity.setXXX;
            clientEntity.setNickName("测试姓名" + i);
            clientEntityList.add(clientEntity);
        }

        // 批量添加.
        List<BatchResult> batchResults = clientMapper.insert(clientEntityList);
        System.out.println("batchResults = " + batchResults);

    }
    

输出日志:

insert 批量(自定义)

查看官网 API ,支持自定义批量提交的数量参数。

官网 API:

java 复制代码
    /**
     * 插入(批量)
     *
     * @param entityList 实体对象集合
     * @param batchSize  插入批次数量
     * @since 3.5.7
     */
    default List<BatchResult> insert(Collection<T> entityList, int batchSize) {
        MapperProxyMetadata mapperProxyMetadata = MybatisUtils.getMapperProxy(this);
        MybatisBatch.Method<T> method = new MybatisBatch.Method<>(mapperProxyMetadata.getMapperInterface());
        SqlSessionFactory sqlSessionFactory = MybatisUtils.getSqlSessionFactory(mapperProxyMetadata.getSqlSession());
        return MybatisBatchUtils.execute(sqlSessionFactory, entityList, method.insert(), batchSize);
    }

Demo 示例:

java 复制代码
    @Test
    public void testInsert_03() {
        // 生成批量测试数据.
        List<ClientEntity> clientEntityList = new ArrayList();
        for(int i = 300; i < 310; i++) {
            ClientEntity clientEntity = new ClientEntity();
            clientEntity.setId(Long.valueOf(i + 1));
            clientEntity.setClientId(Long.valueOf(i + 1));
            // 此处省略其他属性的 set 方法
            // clientEntity.setXXX;
            clientEntity.setNickName("测试姓名" + i);
            clientEntityList.add(clientEntity);
        }

        int batchSize = 5;
        List<BatchResult> batchResults = clientMapper.insert(clientEntityList, batchSize);
        System.out.println("batchResults = " + batchResults);

    }
    

输出日志:

insertOrUpdate

如果待添加的数据,在数据库中已经存在,则进行 更新(update),反之 进行 添加(insert)

官网 API

java 复制代码
    /**
     * 主键存在更新记录,否插入一条记录
     *
     * @param entity 实体对象 (不能为空)
     * @since 3.5.7
     */
    default boolean insertOrUpdate(T entity) {
        Class<?> entityClass = ReflectionKit.getSuperClassGenericType(getClass(), BaseMapper.class, 0);
        Assert.notNull(entityClass, "entityClass must not be null");
        TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass);
        Assert.notNull(tableInfo, "Can not get TableInfo for entity " + entityClass);
        String keyProperty = tableInfo.getKeyProperty();
        Assert.notEmpty(keyProperty, "The current table has no primary key.");
        Object idVal = tableInfo.getPropertyValue(entity, keyProperty);
        return StringUtils.checkValNull(idVal) || Objects.isNull(selectById((Serializable) idVal)) ? insert(entity) > 0 : updateById(entity) > 0;
    }

Demo 示例:

java 复制代码
    @Test
    public void testInsertOrUpdate() {

        // 测试已经存在的数据,是否更新?
        // 301(Long), 301(Long), 测试姓名300(String)
        ClientEntity clientEntity1 = new ClientEntity();
        clientEntity1.setId(301L);
        clientEntity1.setClientId(301L);
        clientEntity1.setNickName("君九");
        clientMapper.insertOrUpdate(clientEntity1);

        // 测试未存在的数据,是否添加?
        ClientEntity clientEntity2 = new ClientEntity();
        clientEntity2.setId(9301L);
        clientEntity2.setClientId(9301L);
        clientEntity2.setNickName("新增姓名:君九");
        clientMapper.insertOrUpdate(clientEntity2);

        // 查询数据,进行验证
        List<ClientEntity> clientEntityList = clientMapper.selectList(
                new QueryWrapper<ClientEntity>().lambda().like(ClientEntity::getNickName, "君九")
        );
        System.out.println("clientEntityList 个数 = " + clientEntityList.size());
        System.out.println(JSON.toJSONString(clientEntityList));

    }
    

输出日志:

java 复制代码
2026-01-28T22:07:35.796+08:00  INFO 13720 --- [springboot3-mybatisplus] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@948208151 wrapping com.mysql.cj.jdbc.ConnectionImpl@1dcca426] will not be managed by Spring
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 301(Long)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 301, 301, null, null, 测试姓名300, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@704c3bdf]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3b347439] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@681200528 wrapping com.mysql.cj.jdbc.ConnectionImpl@1dcca426] will not be managed by Spring
==>  Preparing: UPDATE client SET client_id=?, nick_name=? WHERE id=?
==> Parameters: 301(Long), 君九(String), 301(Long)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3b347439]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5f68eec6] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1341781781 wrapping com.mysql.cj.jdbc.ConnectionImpl@1dcca426] will not be managed by Spring
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 9301(Long)
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5f68eec6]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6cb194f5] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@814507488 wrapping com.mysql.cj.jdbc.ConnectionImpl@1dcca426] will not be managed by Spring
==>  Preparing: INSERT INTO client ( id, client_id, nick_name ) VALUES ( ?, ?, ? )
==> Parameters: 9301(Long), 9301(Long), 新增姓名:君九(String)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6cb194f5]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@47d9c01] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@649913869 wrapping com.mysql.cj.jdbc.ConnectionImpl@1dcca426] will not be managed by Spring
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE (nick_name LIKE ?)
==> Parameters: %君九%(String)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 301, 301, null, null, 君九, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==        Row: 9301, 9301, null, null, 新增姓名:君九, null, 2026-01-28 22:07:35, 2026-01-28 22:07:35
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@47d9c01]
clientEntityList 个数 = 2
[{"clientId":301,"createdTime":"2026-01-28 22:07:21","id":301,"nickName":"君九","upatedTime":"2026-01-28 22:07:21"},{"clientId":9301,"createdTime":"2026-01-28 22:07:35","id":9301,"nickName":"新增姓名:君九","upatedTime":"2026-01-28 22:07:35"}]
2026-01-28T22:07:36.062+08:00  INFO 13720 --- [springboot3-mybatisplus] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2026-01-28T22:07:36.069+08:00  INFO 13720 --- [springboot3-mybatisplus] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

insertOrUpdate 批量(默认)

官网 API:

java 复制代码
    /**
     * 批量修改或插入
     *
     * @param entityList 实体对象集合
     * @since 3.5.7
     */
    default List<BatchResult> insertOrUpdate(Collection<T> entityList) {
        return insertOrUpdate(entityList, Constants.DEFAULT_BATCH_SIZE);
    }

Demo 示例:

java 复制代码
    @Test
    public void testInsertOrUpdate_02() {
        // 生成批量测试数据.
        List<ClientEntity> clientEntityList = new ArrayList();
        for(int i = 300; i <= 303; i++) {
            ClientEntity clientEntity = new ClientEntity();
            clientEntity.setId(Long.valueOf(i + 1));
            clientEntity.setClientId(Long.valueOf(i + 1));
            // 此处省略其他属性的 set 方法
            // clientEntity.setXXX;
            clientEntity.setNickName("测试姓名" + i);
            clientEntityList.add(clientEntity);
        }
        clientMapper.insertOrUpdate(clientEntityList);
    }

输出日志:

java 复制代码
2026-01-28T22:12:13.764+08:00  INFO 12712 --- [springboot3-mybatisplus] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@1360879214 wrapping com.mysql.cj.jdbc.ConnectionImpl@b339a08] will not be managed by Spring
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 301(Long)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 301, 301, null, null, 君九, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==      Total: 1
==>  Preparing: UPDATE client SET client_id=?, nick_name=? WHERE id=?
==> Parameters: 301(Long), 测试姓名300(String), 301(Long)
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 302(Long)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 302, 302, null, null, 测试姓名301, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==      Total: 1
==>  Preparing: UPDATE client SET client_id=?, nick_name=? WHERE id=?
==> Parameters: 302(Long), 测试姓名301(String), 302(Long)
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 303(Long)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 303, 303, null, null, 测试姓名302, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==      Total: 1
==>  Preparing: UPDATE client SET client_id=?, nick_name=? WHERE id=?
==> Parameters: 303(Long), 测试姓名302(String), 303(Long)
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 304(Long)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 304, 304, null, null, 测试姓名303, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==      Total: 1
==>  Preparing: UPDATE client SET client_id=?, nick_name=? WHERE id=?
==> Parameters: 304(Long), 测试姓名303(String), 304(Long)
2026-01-28T22:12:13.881+08:00  INFO 12712 --- [springboot3-mybatisplus] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...

insertOrUpdate 批量(自定义)

官网 API:

java 复制代码
    /**
     * 批量修改或插入
     *
     * @param entityList 实体对象集合
     * @param batchSize  插入批次数量
     * @since 3.5.7
     */
    default List<BatchResult> insertOrUpdate(Collection<T> entityList, int batchSize) {
        MapperProxyMetadata mapperProxyMetadata = MybatisUtils.getMapperProxy(this);
        Class<?> entityClass = ReflectionKit.getSuperClassGenericType(getClass(), BaseMapper.class, 0);
        Assert.notNull(entityClass, "entityClass must not be null");
        TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass);
        Assert.notNull(tableInfo, "Can not get TableInfo for entity " + entityClass);
        String keyProperty = tableInfo.getKeyProperty();
        Assert.notEmpty(keyProperty, "The current table has no primary key.");
        String statement = mapperProxyMetadata.getMapperInterface().getName() + StringPool.DOT + SqlMethod.SELECT_BY_ID.getMethod();
        return insertOrUpdate(entityList, (sqlSession, entity) -> {
            Object idVal = tableInfo.getPropertyValue(entity, keyProperty);
            return StringUtils.checkValNull(idVal) || CollectionUtils.isEmpty(sqlSession.selectList(statement, entity));
        }, batchSize);
    }

Demo 示例:

java 复制代码
    @Test
    public void testInsertOrUpdate_03() {
        // 生成批量测试数据.
        List<ClientEntity> clientEntityList = new ArrayList();
        for(int i = 300; i <= 303; i++) {
            ClientEntity clientEntity = new ClientEntity();
            clientEntity.setId(Long.valueOf(i + 1));
            clientEntity.setClientId(Long.valueOf(i + 1));
            // 此处省略其他属性的 set 方法
            // clientEntity.setXXX;
            clientEntity.setNickName("测试姓名" + i);
            clientEntityList.add(clientEntity);
        }
        // 默认批量提交数量
        int batchSize = 2;
        clientMapper.insertOrUpdate(clientEntityList, batchSize);
    }

输出日志:

java 复制代码
2026-01-28T22:15:10.891+08:00  INFO 16016 --- [springboot3-mybatisplus] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@1946338463 wrapping com.mysql.cj.jdbc.ConnectionImpl@6ceb11f9] will not be managed by Spring
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 301(Long)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 301, 301, null, null, 测试姓名300, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==      Total: 1
==>  Preparing: UPDATE client SET client_id=?, nick_name=? WHERE id=?
==> Parameters: 301(Long), 测试姓名300(String), 301(Long)
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 302(Long)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 302, 302, null, null, 测试姓名301, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==      Total: 1
==>  Preparing: UPDATE client SET client_id=?, nick_name=? WHERE id=?
==> Parameters: 302(Long), 测试姓名301(String), 302(Long)
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 303(Long)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 303, 303, null, null, 测试姓名302, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==      Total: 1
==>  Preparing: UPDATE client SET client_id=?, nick_name=? WHERE id=?
==> Parameters: 303(Long), 测试姓名302(String), 303(Long)
==>  Preparing: SELECT id,client_id,user_no,user_password,nick_name,real_name,created_time,upated_time FROM client WHERE id=?
==> Parameters: 304(Long)
<==    Columns: id, client_id, user_no, user_password, nick_name, real_name, created_time, upated_time
<==        Row: 304, 304, null, null, 测试姓名303, null, 2026-01-28 22:07:21, 2026-01-28 22:07:21
<==      Total: 1
==>  Preparing: UPDATE client SET client_id=?, nick_name=? WHERE id=?
==> Parameters: 304(Long), 测试姓名303(String), 304(Long)
2026-01-28T22:15:11.012+08:00  INFO 16016 --- [springboot3-mybatisplus] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...

若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/157436339

相关推荐
水饺编程2 小时前
第4章,[标签 Win32] :系统字体与字符大小
c语言·c++·windows·visual studio
i建模2 小时前
在Windows系统上通过SSH访问远程AWS主机
windows·ssh·aws
Hx_Ma162 小时前
List 转二维 List
数据结构·windows·list
软件资深者3 小时前
植物大战僵尸1经典版(小游戏)+超强辅助工具 自动收取阳光
windows·游戏程序·windows11
雄狮少年3 小时前
AI Agent Workflow基类及实现类,快速实现一个react agent,可直接运行
人工智能·windows·react.js
Kazefuku3 小时前
VS Code 和Visual Studio:简单易懂的区别
ide·windows·visual studio
Asssshzy3 小时前
校园网断网无法远程电脑的解决方案
windows·计算机网络·电脑
等风来不如迎风去4 小时前
【android】oppo手机拷贝视频文件
android·windows·智能手机
LeenixP4 小时前
OpenHarmony调试工具安装与使用-HDC
windows·测试工具·华为·鸿蒙系统·hdc