Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

updateBatchById批量更新报空指针异常 #2542

Closed
112921482 opened this issue Jun 1, 2020 · 26 comments
Closed

updateBatchById批量更新报空指针异常 #2542

112921482 opened this issue Jun 1, 2020 · 26 comments

Comments

@112921482
Copy link

当前使用版本(必填,否则不予处理)

3.3.2

该问题是如何引起的?(确定最新版也有问题再提!!!)

使用updateBatchById,集合为2197条数据,报错。

将2197条数据遍历使用updateById,则正常。
将日志调整为debug级,使用updateBatchById查看生成的sql,将sql直接在数据库运行也正常。

重现步骤(如果有就写完整)

报错信息

Cause: java.sql.BatchUpdateException: java.lang.NullPointerException

@lucheng
Copy link
Contributor

lucheng commented Jun 2, 2020

你这个我用3.3.2版本 也没复现

@miemieYaho
Copy link
Member

有复现demo?

@112921482
Copy link
Author

大概定位到问题,并不是数量的问题。使用mysql数据库,表中有一个字段类型为date,对应entity的类型为LocalDate,如果该字段保存值,则报错,不保存的话updateBatchById不会保存,只有一条数据的时候也是如此,

@miemieYaho
Copy link
Member

那就是驱动问题,不支持jdbc4,mybatis底层全面升级为jdbc4了

@112921482
Copy link
Author

那我现在要怎么解决呢?

@112921482
Copy link
Author

问题是,我单独使用updateById不会报错,只有在使用updateBatchById才报错,这也是因为驱动问题吗?

@lucheng
Copy link
Contributor

lucheng commented Jun 2, 2020

本地也没复现,你把你的核心问题代码 发出来。 数据库是mysql吧, 字段date 属性是localdate 对吧

@112921482
Copy link
Author

@Test void batchUpdateTest1() { List<PortalUser> portalUserList = portalUserService.list(); portalUserList.forEach(portalUser -> portalUser.setRealName(LocalDateTime.now().toString())); portalUserService.updateBatchById(portalUserList); }
@Test void batchUpdateTest12() { List<PortalUser> portalUserList = portalUserService.list(); portalUserList.forEach(portalUser -> { portalUser.setRealName(LocalDateTime.now().toString()); portalUser.setBirthday(LocalDate.now()); }); portalUserService.updateBatchById(portalUserList); }
两个测试,第一个测试不设置生日可以通过,第二个设置则报错,数据库mysql,版本5.7.30

@miemieYaho
Copy link
Member

驱动版本?

@112921482
Copy link
Author

springboot项目,springboot版本:2.3.0,mysql版本:8.0.20

@miemieYaho
Copy link
Member

pom里和mybatis有关的都有啥?

@112921482
Copy link
Author

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.2</version>
    </dependency>

@miemieYaho
Copy link
Member

去掉,只保留mp的

@112921482
Copy link
Author

去掉了,还是报错

@miemieYaho
Copy link
Member

那你整个复现demo吧

@112921482
Copy link
Author

demo.zip

@112921482
Copy link
Author

我用这个demo可以成功复现,复现的代码在测试类中,使用的数据库是mysql5.7.30

@miemieYaho
Copy link
Member

image
没毛病啊

@112921482
Copy link
Author

要不链我的测试库试试?我数据库就报错啊

@miemieYaho
Copy link
Member

data-source-properties:
        cachePrepStmts: true
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048
        useServerPrepStmts: true
        useLocalSessionState: true
        rewriteBatchedStatements: true
        cacheResultSetMetadata: true
        cacheServerConfiguration: true
        elideSetAutoCommits: true
        maintainTimeStats: false

你这一坨配置的问题.搞不懂啥意思就别乱配,over

@112921482
Copy link
Author

你有没有跑data.sql里面先插入一条数据。。。。

@112921482
Copy link
Author

这是hikari的推荐配置啊我的哥,你跑的时候数据库有数据吗?

@miemieYaho
Copy link
Member

看图片,里面有debug的sql

@112921482
Copy link
Author

要不连我的数据库试试?为啥我连自己的就报错呢???

@112921482
Copy link
Author

试了下,真是配置的问题。。。按照hikari配的。。。我再研究研究,谢谢了

@lucheng
Copy link
Contributor

lucheng commented Jun 2, 2020

这很尴尬...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants