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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

TK mybatis插件通用mapper与oracle的几个坑

發布時間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TK mybatis插件通用mapper与oracle的几个坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近公司有幾個項目的數據庫用的oracle,有段時間沒用,然后果斷就掉坑里面了,記錄幾個比較有代表性的。
1:關于oracle的批量數據插入,我用TK通用mapper的insertList方法自動拼接出來的sql是這樣的

insert into table(column1,column2)values (value1,value2), (value3,value4)。。。

咋一看沒啥問題啊,然后就一直報 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如

update BUS_PLATFORM.bus_trans set return_code = null where return_msg= 'tac驗證通過';

這個是可以執行成功的,不過這個都是表外的值操作,那么當表內的數據有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 null

3:這個是mybatis的一個規范,基本是湊數的,不過也坑過我
先上內容:mybatis插入null值時需要指定該值的類型(jdbctype),不然會報錯。
因為不指定類型的話mybatis會自己去適配匹配的數據庫字段類型,null適配不了。搞不定就報錯,很穩。不過一般使用xml配置sql的話一般都不會有這個問題,寫的時候順手都會寫上。這個也是我使用TK的時候暴露出來的問題,在使用insert方法的時候有null就掛了,不過TK有個insertSelective方法做插入的時候會自動過濾掉空值。

end

總結

以上是生活随笔為你收集整理的TK mybatis插件通用mapper与oracle的几个坑的全部內容,希望文章能夠幫你解決所遇到的問題。

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