ibatis中使用List作為傳入參數的使用方法及 CDATA使用

ibatis中list做回參很簡單,resultClass設為list中元素類型,dao層調用:

(List)getSqlMapClientTemplate().queryForList("sqlName", paraName);  

并經類型轉換即可,做入參還需要稍微調整下,本文主要講list做入參碰到的幾個小問題:

入參主要有兩種方法一種是以list直接作為入參,另一種是將list作為map的元素之一為入參,個人覺得第一種明顯優勢,就一個list為入參,還用map包裝一層多蛋疼。下面的介紹都以這個sql為例

 "getProjectJobIdsByProjectIds" resultClass="java.lang.Integer"  parameterClass="java.util.ArrayList">  SELECT id   FROM cic_job   WHERE last_buildid <> 'NULL'  "AND" open="(" close=")" conjunction="or">  CRID=#projectIdList[]#  

以上是正確的寫法,意義大家不用關注,重點放在倒數2到4行,表示以list為入參,其中projectIdList為dao層傳入的參數名。主要寫法就是parameterClass="java.util.ArrayList",然后加上

"AND" open="(" close=")" conjunction="or">  
CRID=#projectIdList[]#  

意思就是迭代器循環projectIdList,并用or拼接形成sql,拼接完后用()括起來,在加上前綴and。

1、iterate property的問題

網上很多寫法是:

property="projectIdList" prepend="AND" open="(" close=")" conjunction="or">  

即多了一個property,這個時候ibatis會從參數中尋找屬性為projectIdList的對象,而list是一個對象沒有屬性就會報錯:

Cause: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. 
Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1

異常,解決方法就是去掉property="projectIdList"

其實這種寫法是相對第二種以map為參數而言的,你可以使用map傳入參數設置屬性為?property對應名即可。

2、< ! [ CDATA[的問題

大家注意到上面sql添加有 ! [ CDATA[,它的作用是對一些字符進行轉移,具體可以參見http://renren.it/a/JAVAbiancheng/iBATIS/20111105/139874.html

但上面sql如果寫成:

 <select id="getProjectJobIdsByProjectIds" resultClass="java.lang.Integer"  parameterClass="java.util.ArrayList">  <![CDATA[  SELECT id   FROM cic_job   WHERE last_buildid <> 'NULL'  <iterate prepend="AND" open="(" close=")" conjunction="or">  CRID=#projectIdList[]#  </iterate>  ]]>  
</select> 

擴大轉義范圍會出現如下錯誤:

com.ibatis.common.beans.ProbeException: There is no READABLE property named 'projectIdList[]' in class 'java.util.ArrayList' 

解決方法,就是縮小 CDATA的范圍。原因是CDATA導致系統無法識別動態判斷部分。

在使用ibatis時,經常需要配置待執行的sql語句。使用過ibatis的朋友都知道,無可避免的都會碰到一些不兼容、沖突的字符,多數人也都 知道用<![CDATA[? ]]>標記避免Sql中與xml規范相沖突的字符對xml映射文件的合法性造成影響。但是,如果在ibatis中使用了動態語句的時候,還是有一些 細節需要注意。下面舉例說明一下:

環境:oracle、ibatis、java

錯誤例1:符號“<=”會對xml映射文件的合法性造成影響

<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">  select idfrom tableA a,tableB b<dynamic prepend="WHERE"><isNotNull prepend="AND" property="startDate">a.act_time >= #startDate# and a.act_time <= #endDate#and a.id = b.id </isNotNull>    </dynamic>  </select>

錯誤例2:將整個sql語句用<![CDATA[? ]]>標記來避免沖突,在一般情況下都是可行的,但是由于該sql配置中有動態語句(where部分),將導致系統無法識別動態判斷部分,導致整個sql語句非法。

<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">< ![CDATA[   select idfrom tableA a,tableB b<dynamic prepend="WHERE"><isNotNull prepend="AND" property="startDate">a.act_time >= #startDate# and a.act_time <= #endDate#and a.id = b.id </isNotNull>    </dynamic>  ]]></select>

正確做法:縮小范圍,只對有字符沖突部分進行合法性調整。

<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">  select idfrom tableA a,tableB b<dynamic prepend="WHERE"><isNotNull prepend="AND" property="startDate">a.act_time >= #startDate# < ![CDATA[ and a.act_time <= #endDate#  ]]>and a.id = b.id </isNotNull>    </dynamic>  </select>
------------------------------------------------------------------

ibatis中應該經常見到"<![CDATA["這樣的東西吧,它的用處應該是轉義一些特殊關鍵字字符,不合法的XML字符必須被替換為相應的實體。?下面是五個在XML文檔中預定義好的實體:

<&gt;?小于號
>&lt;?大于號
&&
&apos;'單引號
""雙引號

一個 CDATA 部件以"< ! [CDATA[" 標記開始,以"]]>"標記結束:

<message>if salary < 1000 then</message>

為了避免出現這種情況,必須將字符"<" 轉換成實體,象下面這樣:

<message>if salary < 1000 then</message>

這里有一個問題,由于我在ibatis中用到了一個循環標簽"<iterate>" ,為了寫一個??類似

SELECT * FROM b?

WHERE b.trade_no in
?<iterate property="tradeNoList" open="(" close=")" conjunction=",">#tradeNoList[]#</iterate>
???AND .........這樣的一個語句。

由于"<iterate"標簽以 "<"開頭,那么可能被"< ! [CDATA["轉義了,所以造成語法錯誤,sql不能正常執行,去掉"<![CDATA["后發現sql能正常執行。

所以在碰到類似問題的時候,應該留意,在"< ! [CDATA["轉義符中間不要用標簽。

轉載于:https://www.cnblogs.com/longshiyVip/p/4753443.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258467.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258467.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258467.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Samba服務

####################samba####################1.samba作用提供cifs協議實現共享文件2.安裝yum install samba samba-common samba-client -ysystemctl start smb nmbsystemctl enable smb nmb3.添加smb用戶smb用戶必須是本機用戶[rootlocalhost ~]# smbpasswd -a student New…

wpf 窗口的返回值_WPF Tips: Window.ShowDialog() 返回 true

Window.ShowDialog() 返回值為bool?。希望在窗口點擊OK時返回True。解決方法&#xff1a;ShowDialog()的注釋為&#xff1a;// Returns:// A System.Nullable value of type System.Boolean that specifies whether// the activity was accepted (true) or canceled (false). …

CodeForces 543D 樹形DP Road Improvement

題意&#xff1a; 有一顆樹&#xff0c;每條邊是好邊或者是壞邊&#xff0c;對于一個節點為x&#xff0c;如果任意一個點到x的路徑上的壞邊不超過1條&#xff0c;那么這樣的方案是合法的&#xff0c;求所有合法的方案數。 對于n個所有可能的x&#xff0c;輸出n個答案。 分析&am…

理解Javascritp中的引用

Author: bugall Wechat: bugallF Email: 769088641qq.com Github: https://github.com/bugall一&#xff1a; 函數中的引用傳遞 我們看下下面的代碼的正確輸出是什么 function changeStuff(a, b, c) {a a * 10;b.item "changed";c {item: "changed"}; …

通過擴展改善ASP.NET MVC的驗證機制[實現篇]

通過擴展改善ASP.NET MVC的驗證機制[實現篇] 原文:通過擴展改善ASP.NET MVC的驗證機制[實現篇]在《使用篇》中我們談到擴展的驗證編程方式&#xff0c;并且演示了本解決方案的三大特性&#xff1a;消息提供機制的分離、多語言的支持和多驗證規則的支持&#xff0c;我們現在來看…

canopen和1939區別_CAN 和 CANopen的區別和聯系

1、CAN與CANopen的共同點與不同點&#xff1a;CAN只定義了物理層與鏈路層&#xff0c;而沒有定義用戶層&#xff0c;用戶可根據自己的需要定義一些網絡上的通信約定&#xff1b; CANopen是在CAN的基礎上定義了用戶層&#xff0c;即規定了用戶、軟件、網絡終端等之間用來進行信…

ONOS系統架構演進,實現高可用性解決方案

上一篇文章《ONOS高可用性和可擴展性實現初探》講到了ONOS系統架構在高可用、可擴展方面技術概況&#xff0c;提到了系統在分布式集群中怎樣保證數據的一致性。在數據終于一致性方面&#xff0c;ONOS採用了Gossip協議。這一部分的變化不大&#xff0c;而在強一致性方案的選擇方…

Struts2_day01

Java Web開發常用框架 SSH(Struts2 Spring Hibernate)SSM(Struts2 Spring MyBatis)SSI(Struts2 Spring iBatis) 多種框架協同工作 Web層 -- Service層 -- Dao層 Struts2框架: Struts2是一個基于MVC設計模式的Web應用框架&#xff0c;它本質上相當于一個servlet&#xff0c;在MV…

使用 python 開發 Web Service

使用 python 開發 Web Service Python 是一種強大的面向對象腳本語言&#xff0c;用 python 開發應用程序往往十分快捷&#xff0c;非常適用于開發時間要求苛刻的原型產品。使用 python 開發 web service 同樣有語言本身的簡捷高速的特點&#xff0c;能使您快速地提供新的網絡服…

python中輸出n開始的5個奇數_送你99道Python經典練習題,練完直接上手做項目,免費送了來拿吧...

學python沒練習題怎么行、今天&#xff0c;給大家準備一個項目&#xff1a; 99道編程練習&#xff0c;這些題如果能堅持每天至少完成一道&#xff0c;一定可以幫大家輕松 get Python 的編程技能。目前&#xff0c;這個項目已經獲得了 2924 Stars&#xff0c;2468 Forks。首先&a…

java 基礎5

一、 什么是數組及其作用&#xff1f; 定義&#xff1a;具有相同數據類型的一個集合 作用&#xff1a;存儲連續的具有相同類型的數據 二、 java中如何聲明和定義數組 2.1 聲明和定義的語法&#xff1a; 數據類型[ ] 數組名&#xff1b;( int[ ] nums ; ) 或 數…

TFS(Team Foundation Server)介紹和入門

在本文的兩個部分中&#xff0c;我將介紹Team Foundation Server的一些核心特征&#xff0c;重點介紹在本產品的日常應用中是怎樣將這些特性結合在一起使用的。 作為一名軟件開發者&#xff0c;在我的職業生涯中&#xff0c;我常常會用到支持軟件開發過程的大量開發工具&#x…

逆函數求導公式_反函數求導法則

反函數的求導法則是&#xff1a;反函數的導數是原函數導數的倒數。例題&#xff1a;求yarcsinx的導函數。首先&#xff0c;函數yarcsinx的反函數為xsiny&#xff0c;所以&#xff1a;y‘1/sin’y1/cosy&#xff0c;因為xsiny&#xff0c;所以cosy√1-x2&#xff0c;所以y‘1/√…

SpringXML方式配置bean的懶加載lazy-init

lazy-init&#xff08;懶加載&#xff09;&#xff0c;表示該bean在容器初始化的時候不進行初始化。例如&#xff1a;<bean name"role1" class"com.fz.entity.Role" lazy-init"true">以上配置表示&#xff1a;spring容器在初始化的時候不會…

windows下system函數的使用

system函數 是可以調用一些DOS命令,比如system("cls");//清屏,等于在DOS上使用cls命令寫可執行文件路徑&#xff0c;可以運行它 下面列出常用的DOS命令,都可以用system函數調用: ASSOC 顯示或修改文件擴展名關聯。AT 計劃在計算機上運行的命令和程序。ATTRIB 顯示或更…

WWDC2017 筆記 - Cocoa Touch 中的新特性

這篇文章是 What’s New in Cocoa Touch / UIKit Session 201 的一些整理。【基于OC】 轉自我的 Blog: Dannys Dream Drag Drop 新的交互方式 拖拽 Drag 需要 Drag 的對象要 add 一個 UIDragInteraction &#xff0c;用法類似于 UIGestureRecognizer 。UIDragInteraction 有一個…

[Hadoop] - 自定義Mapreduce InputFormatOutputFormat

在MR程序的開發過程中&#xff0c;經常會遇到輸入數據不是HDFS或者數據輸出目的地不是HDFS的&#xff0c;MapReduce的設計已經考慮到這種情況&#xff0c;它為我們提供了兩個組建&#xff0c;只需要我們自定義適合的InputFormat和OutputFormat&#xff0c;就可以完成這個需求&a…

PS 色調——老照片效果

這就是通過調色使照片顯得發黃。 R_new0.393*R0.769*G0.189*B; G_new0.349*R0.686*G0.168*B; B_new0.272*R0.534*G0.131*B; clc; clear all; Imageimread(9.jpg); Imagedouble(Image); Image_newImage; Image_new(:,:,1)0.393*Image(:,:,1)0.769*Image(:,:,2)0.189*Image(:,:,3…

jsp出現錯誤

昨天在調試頁面時發生了如圖顯示的異常&#xff0c;它出現的原因是當<jsp:forward>或<jsp:include>標簽沒有參數時&#xff0c;開始標簽和結束標簽</jsp:forward>或</jsp:include>之間不能有空格&#xff0c;不能換行。解決辦法&#xff1a;刪除標簽之…

門限回歸模型的思想_Stata+R:門檻回歸教程

來源 | 數量經濟學綜合整理轉載請聯系進行回歸分析&#xff0c;一般需要研究系數的估計值是否穩定。很多經濟變量都存在結構突變問題&#xff0c;使用普通回歸的做法就是確定結構突變點&#xff0c;進行分段回歸。這就像我們高中學習的分段函數。但是對于大樣本、面板數據如何尋…