TK mybatis插件通用mapper与oracle的几个坑
最近公司有幾個項目的數據庫用的oracle,有段時間沒用,然后果斷就掉坑里面了,記錄幾個比較有代表性的。
1:關于oracle的批量數據插入,我用TK通用mapper的insertList方法自動拼接出來的sql是這樣的
咋一看沒啥問題啊,然后就一直報 sql未正確結束,出于對自己sql的過于自信,導致一直都在思考是否是參數問題,浪費了好幾個小時,后來把sql拼好直接丟到數據庫跑了跑才發現,這種sql確實是不能在oracle跑的,oracle批量插入的語法應該是:
INSERT ALL INTO A(field_1,field_2) VALUES (value_1,value_2) INTO A(field_1,field_2) VALUES (value_3,value_4) INTO A(field_1,field_2) VALUES (value_5,value_6)粗略的瞅了下TK的代碼,貌似確實沒有校驗數據庫驅動就直接開始拼sql了
public String insertList(MappedStatement ms) {Class<?> entityClass = this.getEntityClass(ms);StringBuilder sql = new StringBuilder();sql.append(SqlHelper.insertIntoTable(entityClass, this.tableName(entityClass)));sql.append(SqlHelper.insertColumns(entityClass, true, false, false));sql.append(" VALUES ");sql.append("<foreach collection=\"list\" item=\"record\" separator=\",\" >");sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);Iterator var5 = columnList.iterator();while(var5.hasNext()) {EntityColumn column = (EntityColumn)var5.next();if (!column.isId() && column.isInsertable()) {sql.append(column.getColumnHolder("record") + ",");}}sql.append("</trim>");sql.append("</foreach>");return sql.toString();}不過我覺得這種插件肯定是有兼容方案的,并且使用了這個插件跟使用源生mybatis并不沖突,所以實際對開發并沒有影響,算是復習一下oracle的基礎并提醒下自己,程序員還是老老實實先run起來,自以為是的經驗有時候也很坑的。
2:關于oracle的比較符號(<> =)和null
先復習一下
一般數據庫查詢某某字段為空或者不為空的時候都是用is null或者is not null
如果查詢條件使用=null或者<>null是查不出來數據的
但是賦值卻可以用=null如
這個是可以執行成功的,不過這個都是表外的值操作,那么當表內的數據有null時,又有啥坑呢,比如
select * from table1 where name <>'zhansan'查詢表中name字段不為zhangsan的數據,當表中有name為null的數據時,這些數據也是查不出來的.比如表中有100條數據,一條數據的name值為zhangsan ,九條數據的name值為null,那么這條sql只能查出90條數據,所以如果確切的需求要查詢name值不為zhangsan的數據且包括name值為null的數據,sql應該為
select * from table1 where name <>'zhansan' or name is null3:這個是mybatis的一個規范,基本是湊數的,不過也坑過我
先上內容:mybatis插入null值時需要指定該值的類型(jdbctype),不然會報錯。
因為不指定類型的話mybatis會自己去適配匹配的數據庫字段類型,null適配不了。搞不定就報錯,很穩。不過一般使用xml配置sql的話一般都不會有這個問題,寫的時候順手都會寫上。這個也是我使用TK的時候暴露出來的問題,在使用insert方法的時候有null就掛了,不過TK有個insertSelective方法做插入的時候會自動過濾掉空值。
end
總結
以上是生活随笔為你收集整理的TK mybatis插件通用mapper与oracle的几个坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OTB使用介绍一】tracker_be
- 下一篇: 【原创】vue中使用CKEditor5引