Mybatis SQL 寫法

標籤
1.select
select – 書寫查詢sql語句
select中的幾個屬性說明:
id屬性:當前名稱空間下的statement的唯一標識。必須。要求id和mapper接口中的方法的名字一致。
resultType:將結果集映射爲java的對象類型。必須(和 resultMap 二選一)
parameterType:傳入參數類型。可以省略

2.insert
insert 的幾個屬性說明:
id:唯一標識,隨便寫,在同一個命名空間下保持唯一,使用動態代理之後要求和方法名保持一致
parameterType:參數的類型,使用動態代理之後和方法的參數類型一致
useGeneratedKeys:開啓主鍵回寫
keyColumn:指定數據庫的主鍵
keyProperty:主鍵對應的pojo屬性名
標籤內部:具體的sql語句。

3.update
id屬性:當前名稱空間下的statement的唯一標識(必須屬性);
parameterType:傳入的參數類型,可以省略。
標籤內部:具體的sql語句。

4.delete
delete 的幾個屬性說明:
id屬性:當前名稱空間下的statement的唯一標識(必須屬性);
parameterType:傳入的參數類型,可以省略。
標籤內部:具體的sql語句。

#{}和${}區別

 

(1)#{} 佔位符 爲參數佔位符 ?,即sql 預編譯,變量替換後,#{} 對應的變量自動加上單引號 ''

  

(2)${} 拼接符 爲字符串替換,即 sql 拼接,變量替換後,${} 對應的變量不會加上單引號 ''


場景:數據庫有兩個一模一樣的表。歷史表,當前表
查詢表中的信息,有時候從歷史表中去查詢數據,有時候需要去新的表去查詢數據。
希望使用1個方法來完成操作。

<select id="queryUserByTableName" resultType="com.zpc.mybatis.pojo.User">
    select * from #{tableName}
</select>
測試輸出:

有問題,報語法錯誤:相當於執行了這樣一條sql:
select * from ‘tb_user’;    ????????沒驗證
顯然表名多了引號。

改正:

<select id="queryUserByTableName" resultType="com.zpc.mybatis.pojo.User">
    select * from ${tableName}
</select>
注意:
#{} 只是替換?,相當於PreparedStatement使用佔位符去替換參數,可以防止sql注入。
${} 是進行字符串拼接,相當於sql語句中的Statement,使用字符串去拼接sql;$可以是sql中的任一部分傳入到Statement中,不能防止sql注入。

使用${} 去取出參數值信息,需要使用${value}
#{} 只是表示佔位,與參數的名字無關,如果只有一個參數,會自動對應。

 

#{}多個參數時:

public User login(@Param("userName") String userName, @Param("password") String password);

<select id="login" resultType="com.zpc.mybatis.pojo.User">
    select * from tb_user where user_name = #{userName} and password = #{password}
</select>
 

通常在方法的參數列表上加上一個註釋@Param(“xxxx”) 顯式指定參數的名字,然後通過${xxxx}或#{xxxx}引入
sql語句動態生成的時候,使用${};
sql語句中某個參數進行佔位的時候#{}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章