场景是,别人给我传一张表中的数据list,其中的数据有些是数据库中有的,有些是新的,已经有的我要更新,新的我要插入,oracle提供了merge into语句来实现这个功能
MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and […]…)
WHEN MATCHED THEN
[UPDATE sql]
WHEN NOT MATCHED THEN
[INSERT sql]
merge into没有返回值,返回值只有insert,update,delete三个基本的DML语句才有
meige into只能把表A和表B进行比较,要么表B是已经存在的表,要么用select “常量” from dual来建立临时的只有一条数据的表
原本打算用mybatis+foreach将list中的每一条数据建立临时表和原有表进行比较,如下
image.png
但是发现执行中,如果有不止一条数据进来,就会报如下错
sql injection violation, multi-statement not allow
image.png
可以看到,我的foreach,separator=”;”,也就是说我最后要执行的是很多个sql,java不允许这样做。
方法二(暂时采用的方法)
在java中,用foreach循环,对list的每一条记录merge into
在使用merge into的时候,有时候会报错
image.png
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property=’roomInfo.roomType’, mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId=’null’, jdbcTypeName=’null’, expression=’null’}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #5 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111
错在我没有为变量指定类型,识别出来的类型为other,所以当这个字段为null时,插入不成功。解决办法是指定类型,比如#{roomInfo.roomLayer,jdbcType=VARCHAR}
image.png
这里我只将有可能为null值的字段指定,其他没管。
方法三
在数据库中创建一个临时表,将list插入数据库,再将原表和临时表进行merge into,最后将临时表的记录delete
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36902.html