IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 关于通用mapper中批量新增的问题说明 -> 正文阅读

[大数据]关于通用mapper中批量新增的问题说明

记录一次开发中遇到的关于通用mapper批量新增问题. 在一次需求中,遇到批量新增, 因不想写复杂的xml语句, 想起曾看到过通用mapper提供了相关的接口, 所以就直接使用,然后出现了问题,如是有了这篇文章

1 问题引入

1 问题说明

需求: 业务数据批量新增, 主键非自增,而是采用uuid生成.

对于批量新增,通用mapper提供两个接口tk.mybatis.mapper.additional.insert.InsertListMappertk.mybatis.mapper.common.special.InsertListMapper. 在导入InsertMapper类时, 没注意到其区别, 导致项目中引入了后者,即tk.mybatis.mapper.common.special.InsertListMapper类, 在后续批量新增操作中, 数据库报错, 参数id不存在.

尝试一:

在去掉数据库主键约束后, 数据成功入库,但是主键id列数据都为空.

尝试二:

在使用for循环标签语句添加数据库时, 数据没有问题.

2 问题分析

根据上述尝试操作, 问题出现在批量新增的接口,且查看批量相关的sql语句,发现没有插入id.查询了相关资料,发现通用mapper提供的两个接口具体用途不一样.

1 tk.mybatis.mapper.additional.insert.InsertListMapper

此类是不支持主键策略, 即批量插入前,需要手动添加好主键值.

/**
 * 通用Mapper接口,特殊方法,批量插入,支持批量插入的数据库都可以使用,例如mysql,h2等
 *
 * @param <T> 不能为空
 * @author liuzh
 * @since 3.5.0
 */
@RegisterMapper
public interface InsertListMapper<T> {

    /**
     * 批量插入,支持批量插入的数据库可以使用,例如MySQL,H2等
     * <p>
     * 不支持主键策略,插入前需要设置好主键的值
     * <p>
     * 特别注意:2018-04-22 后,该方法支持 @KeySql 注解的 genId 方式
     *
     * @param recordList
     * @return
     */
    @InsertProvider(type = InsertListProvider.class, method = "dynamicSQL")
    int insertList(List<? extends T> recordList);
}

2 tk.mybatis.mapper.common.special.InsertListMapper

此类支持主键策略, 要求实体类中必须包含id属性且必须为自增主键.

/**
 * 通用Mapper接口,特殊方法,批量插入,支持批量插入的数据库都可以使用,例如mysql,h2等
 *
 * @param <T> 不能为空
 * @author liuzh
 */
@tk.mybatis.mapper.annotation.RegisterMapper
public interface InsertListMapper<T> {

    /**
     * 批量插入,支持批量插入的数据库可以使用,例如MySQL,H2等,另外该接口限制实体包含`id`属性并且必须为自增列
     *
     * @param recordList
     * @return
     */
    @Options(useGeneratedKeys = true)
    @InsertProvider(type = SpecialProvider.class, method = "dynamicSQL")
    int insertList(List<? extends T> recordList);

}

2 问题解决

切换导入的InsertListMapper类, 使用tk.mybatis.mapper.additional.insert.InsertListMapper类后,数据成功入库. 对于上述问题,即在使用开源的工具时,还是需要多了解其相关用法,也需要多多实践去验证.

3 通用mapper相关注解说明

1 @Table

@Table注解是表示实体类和数据库表之前的映射关系. 默认开启驼峰命名(tb_user => tbUser),也可通过name手动映射.

@Table(name = "t_user")
public class user{
    
}

2 @Column

@Column注解是表示实体类属性和数据库表列名的映射关系.默认开启驼峰命名(is_use => isUse),可手动映射

3 @Id

@Id 注解表示实体类该属性和数据库主键映射关系

4 @GeneratedValue

@GeneratedValue注解是通用 Mapper 在执行插入数据之后将数据库自动生成的主键值回写到实体类对象中,和@Id注解一起使用.

5 @KeySql

@KeySql注解是主键策略注解,用于配置如何生成主键.

6 @Transient

@Transient注解, 瞬时的,不持久化的.即表示在实体类和数据库映射时忽略.

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:37:32  更:2022-02-26 11:40:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:34:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码