日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jdk LocalDateTime mybatis 空指针解决办法

發布時間:2024/4/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdk LocalDateTime mybatis 空指针解决办法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. mysql.mysql-connector-java:5.1.39

2. org.mybatis.mybatis:3.5.2

3.?org.mybatis.mybatis-spring:2.0.2

在項目中的mybats升級使用了jdk8的LocalDateTime等后,數據庫timesstamp字段有的記錄是null,導致查詢時出現下面錯誤

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'UPDATE_TIME' from result set. ?Cause: java.lang.NullPointerException
?? ?at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:78)
?? ?at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
?? ?at com.sun.proxy.$Proxy154.selectList(Unknown Source)
?? ?at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223)
?? ?at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
?? ?at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
?? ?at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57)
?? ?at com.sun.proxy.$Proxy181.find(Unknown Source)
?? ?at cn.enn.ygego.sunny.sv.service.online.impl.LogisticsBrandServiceImpl.list(LogisticsBrandServiceImpl.java:67)
?? ?at cn.enn.ygego.sunny.sv.controller.online.LogisticsBrandController.list(LogisticsBrandController.java:49)
?? ?at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
?? ?at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
?? ?at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
?? ?at java.lang.reflect.Method.invoke(Method.java:498)
不能把null轉換為LocalDateTime。通過跟蹤代碼,發現問題出在mysql的驅動上,JDBC42ResultSet的getObject代碼如下:

public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
? ? ? ? if (type == null) {
? ? ? ? ? ? throw SQLError.createSQLException("Type parameter can not be null", "S1009", this.getExceptionInterceptor());
? ? ? ? } else if (type.equals(LocalDate.class)) {
? ? ? ? ? ? return type.cast(this.getDate(columnIndex).toLocalDate());
? ? ? ? } else if (type.equals(LocalDateTime.class)) {
? ? ? ? ? ? return type.cast(this.getTimestamp(columnIndex).toLocalDateTime());
? ? ? ? } else if (type.equals(LocalTime.class)) {
? ? ? ? ? ? return type.cast(this.getTime(columnIndex).toLocalTime());
? ? ? ? } else {
? ? ? ? ? ? if (type.equals(OffsetDateTime.class)) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? return type.cast(OffsetDateTime.parse(this.getString(columnIndex)));
? ? ? ? ? ? ? ? } catch (DateTimeParseException var5) {
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } else if (type.equals(OffsetTime.class)) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? return type.cast(OffsetTime.parse(this.getString(columnIndex)));
? ? ? ? ? ? ? ? } catch (DateTimeParseException var4) {
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
?
? ? ? ? ? ? return super.getObject(columnIndex, type);
? ? ? ? }
? ? }
return type.cast(this.getTimestamp(columnIndex).toLocalDateTime());代碼中this.getTimestamp(columnIndex)返回null,再次執行toLocalDateTime(),當然報錯。
解決方式升級mysql驅動,我升級到5.1.47,其他版本沒有測試,在5.1.47中代碼如下:

public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
? ? ? ? if (type == null) {
? ? ? ? ? ? throw SQLError.createSQLException("Type parameter can not be null", "S1009", this.getExceptionInterceptor());
? ? ? ? } else if (type.equals(LocalDate.class)) {
? ? ? ? ? ? Date date = this.getDate(columnIndex);
? ? ? ? ? ? return date == null ? null : type.cast(date.toLocalDate());
? ? ? ? } else if (type.equals(LocalDateTime.class)) {
? ? ? ? ? ? Timestamp timestamp = this.getTimestamp(columnIndex);
? ? ? ? ? ? return timestamp == null ? null : type.cast(timestamp.toLocalDateTime());
? ? ? ? } else if (type.equals(LocalTime.class)) {
? ? ? ? ? ? Time time = this.getTime(columnIndex);
? ? ? ? ? ? return time == null ? null : type.cast(time.toLocalTime());
? ? ? ? } else {
? ? ? ? ? ? String string;
? ? ? ? ? ? if (type.equals(OffsetDateTime.class)) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? string = this.getString(columnIndex);
? ? ? ? ? ? ? ? ? ? return string == null ? null : type.cast(OffsetDateTime.parse(string));
? ? ? ? ? ? ? ? } catch (DateTimeParseException var5) {
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } else if (type.equals(OffsetTime.class)) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? string = this.getString(columnIndex);
? ? ? ? ? ? ? ? ? ? return string == null ? null : type.cast(OffsetTime.parse(string));
? ? ? ? ? ? ? ? } catch (DateTimeParseException var4) {
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
?
? ? ? ? ? ? return super.getObject(columnIndex, type);
? ? ? ? }
? ? }
明顯看到增加null判斷。

總結

以上是生活随笔為你收集整理的jdk LocalDateTime mybatis 空指针解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。