MyBatis,動態傳入表名,字段名的解決辦法

今天做項目,遇到的問題就是需求修改數據表的記錄,而且字段名都不是固定的,也就是說是需要通過參數傳入的,

本來這也不是什麼難題,按照平常的JDBC,或者hibernate裏也都好實現,可問題是現在項目用的mybatis這個持久層框架,按照我的剛開始的想法初使sql是這樣的,

當我滿心歡喜的運行才發現不行,遂百度之,辦法種用盡,還是不行,有人給我說需要把字段那一項換成${field},這種辦法來取,試之,無果,於是我種蛋疼。

           網上查找半天發現,提出的方法大都不能用,也都差不多,我放棄了。翻了一下電腦裏的mybatis文檔,在一個不起眼的地方發現update標籤有一個屬性statementType,一看我就覺得這個屬性不簡單,資料解釋如下:




 看到這,相信會點java的人都知道什麼意思了吧
這個statement,preparedstatement,到底什麼意思,我這不多做解釋,實在不懂請參閱:

http://wenku.baidu.com/view/ccb9da020740be1e650e9abc.html

簡單說就是一個是預編譯的,一個是非預編譯的。

如果你要動態傳入字段名,表名之類的如果你的sql執行是預編譯的,這顯然 

是不行的,所以你必須改成非預編譯的,也就是這樣:

Xml代碼  收藏代碼
  1. <update id="editIssuedData" parameterType="map" statementType="STATEMENT">  

同時sql裏的屬有變量取值最好都改成${xxxx},而不是#{xxx}

當我改好之後,這是我的完整xml:



 你妹,還是不行,數據庫報錯說,


這注明一下:三班是我傳給sql裏變量val的值,仔細一看報的錯,是不是感覺有點不一樣,對了,就是不一樣,是不是感覺三班這個東西少了個引號,其實就是這樣的,所以最後一步,需要在java代碼裏做,如下:

Java代碼  收藏代碼
  1. Map<String, Object> map = new HashMap<String, Object>();  
  2.         map.put("field", Constant.ISSUED_PLAN_COLUMN_NAME.get(field));  
  3.         map.put("val""'"+value+"'");  
  4.         map.put("id", id);  

 在往map裏put參數時,對應的val我在put時在參數前後加了個單引號,這樣就可以了,本人已測試成功!

如果要動態傳入表名,與傳入字段名相同的。

我發現也有不少人遇到這個問題,這裏權當參考,希望可以幫到你!

 

本文來自:http://luoyu-ds.iteye.com/blog/1517607

發佈了12 篇原創文章 · 獲贊 16 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章