當前位置:首頁 » 編程語言 » ibatissqlupdate
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

ibatissqlupdate

發布時間: 2023-01-20 21:40:52

1. ibatis 批量update操作

上面的解析成sql就是
update Question?? set status = "OK"?? where questionId in(1,2,3,4,5...)
PS:只是單獨的ibatis項目,不和spring集成??問題補充:<div class="quote_title"rensanning 寫道</div<div class="quote_div"ibatis只是對JDBC的封裝,真正是否能夠一次性批量操作,要看你的資料庫類型! /比如: / 一次插入多條數據: /INSERT INTO t (t.a, t.b, t.c) /VALUES ('key1','key2','value'), ('key1','key3','value2') ,... / /</div / / /這些明白,少量數據可以用循環來執行,如果是大量數據,在ibatis中是怎麼優化的,放到同一個session中嗎???問題補充:<div class="quote_title"makemyownlife 寫道</div<div class="quote_div"iBatis2通過SqlMapClient提供了一組方法用於批處理實現: /startBatch() 開始批處理 /xecuteBatch() 執行批處理 / /<pre name="code" class="java"
public void create(List<Reply> replyList) {try {// 開始批處理
sqlMapClient.startBatch();
for (Reply reply: replyList) {
// 插入操作
sqlMapClient.insert("Reply.create", reply);}// 執行批處理
sqlMapClient.executeBatch();
e.printStackTrace();}}</pre</div / / /首先不加這兩個,紅色部分也可以正常執行批量插入,差別就是加了startBatch() && sqlMapClient.executeBatch(),這樣的好處能說下嗎?問題補充:<div class="quote_title"makemyownlife 寫道</div<div class="quote_div"iBatis2通過SqlMapClient提供了一組方法用於批處理實現: /startBatch() 開始批處理 /xecuteBatch() 執行批處理 / / / public void create(List<Reply> replyList) { / / try { / // 開始批處理 / sqlMapClient.startBatch(); / / <span style="color: red"for (Reply reply: replyList) { / // 插入操作 / sqlMapClient.insert("Reply.create", reply); / }</span / // 執行批處理 / sqlMapClient.executeBatch(); / / } catch (Exception e) { / e.printStackTrace(); / } / } / / /</div / /

2. ibatis和hibernate

ibatis:sql需要自己寫
hibernate:sql自動生成
上面是最大的區別,下面是一些細節.
選擇Hibernate還是iBATIS都有它的道理:
Hibernate的特點:
Hibernate功能強大,資料庫無關性好,O/R映射能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那麼你的項目整個持久層代碼會相當簡單,需要寫的代碼很少,開發速度很快,非常爽。以資料庫欄位一一對應映射得到的PO和Hibernte這種對象化映射得到的PO是截然不同的,本質區別在於這種PO是扁平化的,不像Hibernate映射的PO是可以表達立體的對象繼承,聚合等等關系的,這將會直接影響到你的整個軟體系統的設計思路。Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO 和資料庫表之間的映射,以及SQL 的自動生成和執行。程序員往往只需定義好了POJO 到資料庫表的映射關系,即可通過Hibernate 提供的方法完成持久層操作。程序員甚至不需要對SQL 的熟練掌握, Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL 並調用JDBC 介面加以執行。Hibernate的缺點就是學習門檻不低,要精通門檻更高,而且怎麼設計O/R映射,在性能和對象模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行,但是Hibernate現在已經是主流O/R Mapping框架,從文檔的豐富性,產品的完善性,版本的開發速度都要強於iBATIS。
iBATIS的特點:
iBATIS入門簡單,即學即用,提供了資料庫查詢的自動對象綁定功能,而且延續了很好的SQL使用經驗,對於沒有那麼高的對象模型要求的項目來說,相當完美。iBATIS的缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。當系統屬於二次開發,無法對資料庫結構做到控制和修改,那iBATIS的靈活性將比Hibernate更適合。系統數據處理量巨大,性能要求極為苛刻,這往往意味著我們必須通過經過高度優化的SQL語句(或存儲過程)才能達到系統性能設計指標。在這種情況下iBATIS會有更好的可控性和表現。
對於實際的開發進行的比較:
1. iBATIS需要手寫sql語句,也可以生成一部分,Hibernate則基本上可以自動生成,偶爾會寫一些Hql。同樣的需求,iBATIS的工作量比 Hibernate要大很多。類似的,如果涉及到資料庫欄位的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。
2. iBatis 可以進行細粒度的優化
比如說我有一個表,這個表有幾個或者幾十個欄位,我需要更新其中的一個欄位,iBatis 很簡單,執行一個sql UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id# 但是用 Hibernate 的話就比較麻煩了,預設的情況下 hibernate 會更新所有欄位。 當然我記得 hibernate 有一個選項可以控制只保存修改過的欄位,但是我不太確定這個功能的負面效果。
例如:我需要列出一個表的部分內容,用 iBatis 的時候,這裡面的好處是可以少從資料庫讀很多數據,節省流量SELECT ID, NAME FROM TABLE_WITH_A_LOT_OF_COLUMN WHERE ...一般情況下Hibernate 會把所有的欄位都選出來。比如說有一個上面表有8個欄位,其中有一兩個比較大的欄位,varchar(255)/text。上面的場景中我為什麼要把他們也選出來呢?用hibernate 的話,你又不能把這兩個不需要的欄位設置為lazy load,因為還有很多地方需要一次把整個 domain object 載入出來。這個時候就能顯現出ibatis 的好處了。如果我需要更新一條記錄(一個對象),如果使用 hibernate,需要現把對象 select 出來,然後再做 update。這對資料庫來說就是兩條sql。而iBatis只需要一條update的sql就可以了。減少一次與資料庫的交互,對於性能的提升是非常重要。
3. 開發方面:
開發效率上,我覺得兩者應該差不多。可維護性方面,我覺得 iBatis 更好一些。因為 iBatis 的 sql 都保存到單獨的文件中。而 Hibernate 在有些情況下可能會在 java 代碼中保sql/hql。相對Hibernate「O/R」而言,iBATIS 是一種「Sql Mapping」的ORM實現。 而iBATIS 的著力點,則在於POJO 與SQL之間的映射關系。也就是說,iBATIS並不會為程序員在運行期自動生成SQL 執行。具體的SQL 需要程序員編寫,然後通過映射配置文件,將SQL所需的參數,以及返回的結果欄位映射到指定POJO。使用iBATIS 提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java對象,這一層與通過Hibernate 實現ORM 而言基本一致,而對於具體的數據操作,Hibernate會自動生成SQL 語句,而iBATIS 則要求開發者編寫具體的SQL 語句。相對Hibernate而言,iBATIS 以SQL開發的工作量和資料庫移植性上的讓步,為系統設計提供了更大的自由空間。
4. 運行效率
在不考慮 cache 的情況下,iBatis 應該會比hibernate 快一些或者很多。

3. ibatis 執行多條sql問題

樓上說的對,先update後select ,但是ibatis中<select></select>之間不能嵌套update語句,因此你只能分兩次調用了 但是可以使用批處理

4. ibatis配置文件中update語句的寫法

ibatis標簽提供生成sql的功能,沒有標簽滿足你的需求。
但是可以從sql的角度解決,像是你用select的時候的1=1的處理方式。
我是這么搞的
update user
set id = id
<............>
where id = #{id}