MyBatis执行批量插入sqlserver报错:不允许从数据类型 varbinary 到 datetime2 的隐式转换
报错信息
不允许从数据类型 varbinary 到 datetime2 的隐式转换。请使用 CONVERT 函数来运行此查询。
问题描述
SpringBoot+MyBatis后台,使用的驱动版本为10.2.3.jre8,foreach标签批量插入,当datetime字段有值可以正常插入,如果null就会报错;单条插入时都没问题,就是一批量插入+带空值就报错。
这其实是sqlserver驱动的bug,升级驱动可解决,也可以不升级通过代码换种方式解决,具体解决办法请拉到最底下查看
代码结构
前端日期组件:
<el-date-picker
style="width: 170px;"
v-model="scope.row.productDate"
type="datetime"
value-format="x"
placeholder="选择生产日期"
@change="productDateChange(scope.row)"
/>
后端接收属性:
@Schema(description = "生产日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime productDate;
dao层
<insert id="saveBatch">
INSERT INTO t_test(
product_date
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.productDate}
)
</foreach>
</insert>
解决办法
下面每一项都可以解决问题,不用都实现:
①在service层将日期转为字符串
item.setProductDateStr(DateUtils.format(item.getProductDate(), DateUtils.DATE_FORMAT_19));
②jdbc驱动maven依赖版本升级:12.8.1.jre8
③改为单条插入,for循环中一条一条insert,这种不太推荐,虽然解决问题,但是代码太不好