今天做項目,遇到的問題就是需求修改數據表的記錄,而且字段名都不是固定的,也就是說是需要通過參數傳入的,
本來這也不是什麼難題,按照平常的JDBC,或者hibernate裏也都好實現,可問題是現在項目用的mybatis這個持久層框架,按照我的剛開始的想法初使sql是這樣的,
當我滿心歡喜的運行才發現不行,遂百度之,辦法種用盡,還是不行,有人給我說需要把字段那一項換成${field},這種辦法來取,試之,無果,於是我種蛋疼。
網上查找半天發現,提出的方法大都不能用,也都差不多,我放棄了。翻了一下電腦裏的mybatis文檔,在一個不起眼的地方發現update標籤有一個屬性statementType,一看我就覺得這個屬性不簡單,資料解釋如下:
看到這,相信會點java的人都知道什麼意思了吧
這個statement,preparedstatement,到底什麼意思,我這不多做解釋,實在不懂請參閱:
http://wenku.baidu.com/view/ccb9da020740be1e650e9abc.html
簡單說就是一個是預編譯的,一個是非預編譯的。
如果你要動態傳入字段名,表名之類的如果你的sql執行是預編譯的,這顯然
是不行的,所以你必須改成非預編譯的,也就是這樣:
- <update id="editIssuedData" parameterType="map" statementType="STATEMENT">
同時sql裏的屬有變量取值最好都改成${xxxx},而不是#{xxx}
當我改好之後,這是我的完整xml:
你妹,還是不行,數據庫報錯說,
這注明一下:三班是我傳給sql裏變量val的值,仔細一看報的錯,是不是感覺有點不一樣,對了,就是不一樣,是不是感覺三班這個東西少了個引號,其實就是這樣的,所以最後一步,需要在java代碼裏做,如下:
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("field", Constant.ISSUED_PLAN_COLUMN_NAME.get(field));
- map.put("val", "'"+value+"'");
- map.put("id", id);
在往map裏put參數時,對應的val我在put時在參數前後加了個單引號,這樣就可以了,本人已測試成功!
如果要動態傳入表名,與傳入字段名相同的。
我發現也有不少人遇到這個問題,這裏權當參考,希望可以幫到你!