標籤
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語句中某個參數進行佔位的時候#{}