天天看點

Ibatis基本的sql語句

<sqlMap namespace="xuesheng"></sqlMap>

1、在<sqlMap>元素内包含的就都是一些sql語句了,這些sql語句是由不同的元素“包裹”起來的,這些元素有<select>  <insert>  <update>  <delete>  <procedure>。 看這些元素名

字就知道他們分别是用來包裹哪一類sql語句的。還有一個元素<statement>  這個元素是通用的,可以包裹任意的sql語句,但是不怎麼招人待見,反正我是一次沒用過,據說他

也不是完全通用(據官方文檔說 的)   ,有些特性在這個元素下還是不好使的,例如<insert>元素下可以有<selectKey>元素,換成<statement>就不好使。

說到這個主鍵,我平時用sql server 做添加操作的時候并且主鍵還是自增長類型的我就在資料庫裡設定,用oracle的時候就用 seq_tableName.nextnvl  擷取,一般不用他提供

 的那個<selectKey>多折騰一下。

但也查了下用的時候該怎麼用:

<!-- Oracle SEQUENCE -->   
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">   
    <selectKey resultClass="int" keyProperty="id" type="pre">   
        <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>   
    </selectKey>   
    <![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values(#id#,#description#)]]>   
</insert> 
           
<!— Microsoft SQL Server IDENTITY Column Example --> 
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product"> 
insert into PRODUCT (PRD_DESCRIPTION) 
values (#description#) 
<selectKey resultClass="int" keyProperty="id" > 
SELECT @@IDENTITY AS ID 
</selectKey> 
</insert>
           
<!-- Mysql  這個例子測試了,可以用-->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
insert into PRODUCT(PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
           

2、寫這些基本的sql語句需要注意的地方

(1)、首當其沖的就是sql語句結束之後不要寫分号

(2)、Ibatis不支援sql語句中的某些特殊字元  例如> <   需要用<![CDATA[       ]]>将那部分包起來。

(3)、查詢的字段一定要跟resultClass或者resultMap中的字段名稱對應上,如果字段名字不對應,請 as 起别名。

(4)、##      $$  兩種引用參數的方式是有差別的:

$$ 的實際作用是進行字元串拼接   等效于StringBuffer類的append方法。

##  的作用是用來做變量替換的。

舉幾個開發中遇到的例子:

A、

 String tableName=t_apply;

select  *  from  $tableName$   這裡就是拼接了一個字元串嗎,這種情況下用##是會報錯的,因為##隻用來做變量替換的。

B、

String idStr="1,2,3,4,5";

select  *  from tableName where id  in ($idStr$)   這裡用## 也會報錯  你用##的話他會把idStr的值當成一個

C、

String sql="select  pid from  t_table where t_table_id=1"

select  *  from  tableName  where id=($sql$)   這裡你用##同樣會報錯的

說白了  ##裡面傳的字元串值到了資料庫裡是帶着單引号的,$$傳遞的字元值到了資料庫裡 不會再加個單引号

也就是說A例子中如果用了##  那麼執行的sql語句将是  select *  from 't_applu'  想想  能用嗎?

$$傳參數會帶來sql注入的問題  , 不需要用的時候千萬别用。

(5)、突然想起來Ibatis的一個bug,不是關于寫sql方面的,剛想起來就先放在這裡了:

sqlMapConfig.xml中 引入映射檔案的時候一定要注意順序,   例如A映射檔案中用到了B映射檔案的内容  ,那麼A一定要放在B的下面,否則啟動程式報錯,不信你去試一下。

(6)、寫sql的時候給表起别名的時候有時候會加個as  例如 select  a.*  from  apply  as  a    這句話在sql server 和 Mysql中都支援  ,在Oracle中竟然不支援,Oracle中給字段

起别名可以用as  給表起别名不可以用   就是select a.*  from  apply  a;    想了一想應該是為了與存儲過程、函數、視圖中的as關鍵字進行差別,也是猜測。

先寫到這 ,以後想到了再補充。