相关文章推荐
烦恼的水桶  ·  关于沈阳地铁3号线一期工程甘官停车场不良地质 ...·  5 月前    · 
健壮的野马  ·  男装品牌金利来拟退市;去哪儿平台2025年春 ...·  1 年前    · 
逼格高的伤痕  ·  说说Kindle那些事 - ...·  1 年前    · 
会搭讪的骆驼  ·  大兴机场线最小发车间隔不超8分30秒 ...·  1 年前    · 
一直单身的匕首  ·  “果木中独备四时之气者”,说的就是枇杷·  2 年前    · 
Code  ›  mybatis-plus使用上需要注意的问题开发者社区
https://cloud.tencent.com/developer/article/1865551
好帅的土豆
1 年前
路行的亚洲

mybatis-plus使用上需要注意的问题

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
路行的亚洲
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > mybatis-plus使用上需要注意的问题

mybatis-plus使用上需要注意的问题

作者头像
路行的亚洲
发布 于 2021-08-20 15:05:04
3K 0
发布 于 2021-08-20 15:05:04
举报
文章被收录于专栏: 后端技术学习

mybatis-plus使用上需要注意的问题

1.问题产生

之前,开发项目使用的是tk-mapper,当使用批量操作时,通常使用insertList就可以了。但是,最近的项目使用的是mybaits-plus,在使用批量操作saveBatch的使用,却遇到了一个问题,这个一开始让我以为我的数据出现了重复,但是仔细看,不是数据出现了重复,而是因为有一个字段相同,报唯一索引字段重复插入 Duplicate entry。

下面是我插入数据的sql和相对应的数据信息:

但是插入却报了错:

第一个感觉很诧异,批量插入操作,为啥还报了唯一索引异常了呢。

2.查看mybatis-plus封装代码

可以看到其批量操作的本质是一个for循环操作,注意参数里面出现了ignore:

代码语言: javascript
复制
/**
 * 批量插入
 * @param entityList ignore
 * @param batchSize  ignore
 * @return ignore
@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveBatch(Collection<T> entityList, int batchSize) {
    String sqlStatement = sqlStatement(SqlMethod.INSERT_ONE);
    int size = entityList.size();
    executeBatch(sqlSession -> {
        int i = 1;
        //遍历需要插入的数据列表,也即将数据想打包,然后执行批量操作
        for (T entity : entityList) {
            sqlSession.insert(sqlStatement, entity);
            if ((i % batchSize == 0) || i == size) {
                sqlSession.flushStatements();
    return true;

同时还可以看到其插入操作底层却是更新操作。

代码语言: javascript
复制
@Override
public int insert(String statement, Object parameter) {
  return update(statement, parameter);

可以看到mybatis的执行器执行的是更新方法:

代码语言: javascript
复制
@Override
public int update(String statement, Object parameter) {
  try {
    dirty = true;
    MappedStatement ms = configuration.getMappedStatement(statement);
    return executor.update(ms, wrapCollection(parameter));
  } catch (Exception e) {
    throw ExceptionFactory.wrapException("Error updating database.  Cause: " + e, e);
  } finally {
    ErrorContext.instance().reset();

而当插入数据完成后,刷新语句,然后执行批量操作

代码语言: javascript
复制
  /**
     * 执行批量操作
     * @param fun fun
     * @since 3.3.0
    protected void executeBatch(Consumer<SqlSession> fun) {
        Class<T> tClass = currentModelClass();
        SqlHelper.clearCache(tClass);
        SqlSessionFactory sqlSessionFactory = SqlHelper.sqlSessionFactory(tClass);
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
        try {
            fun.accept(sqlSession);
            sqlSession.commit();
        } catch (Throwable t) {
            sqlSession.rollback();
            Throwable unwrapped = ExceptionUtil.unwrapThrowable(t);
            if (unwrapped instanceof RuntimeException) {
                MyBatisExceptionTranslator myBatisExceptionTranslator
                    = new MyBatisExceptionTranslator(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), true);
                throw Objects.requireNonNull(myBatisExceptionTranslator.translateExceptionIfPossible((RuntimeException) unwrapped));
            throw ExceptionUtils.mpe(unwrapped);
        } finally {
            sqlSession.close();
 
推荐文章
烦恼的水桶  ·  关于沈阳地铁3号线一期工程甘官停车场不良地质区处治工程施工项目等2个项目无拖欠农民工工资的公示-通知公告-沈阳市人力资源和社会保障局
5 月前
健壮的野马  ·  男装品牌金利来拟退市;去哪儿平台2025年春节出境游机酒预订量同比增长超1倍丨消费早参 _ 东方财富网
1 年前
逼格高的伤痕  ·  说说Kindle那些事 - Sunny_zhufeng - 博客园
1 年前
会搭讪的骆驼  ·  大兴机场线最小发车间隔不超8分30秒 常坐乘客有优惠_手机新浪网
1 年前
一直单身的匕首  ·  “果木中独备四时之气者”,说的就是枇杷
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号