您好,登錄后才能下訂單哦!
本篇內容主要講解“MyBatis中的占位符入參方法有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MyBatis中的占位符入參方法有哪些”吧!
#{}
占位符會被解析為JDBC中的預編譯語句(Prepared Statement)中的參數占位符?
,一個#{}
會被解析為一個?
。
${}
占位符標識的位置會直接被替換為入參,是簡單的字符串替換。
映射接口中查詢單條記錄的方法定義如下。
// 使用#{}作為參數占位符 MyInfo getMyInfoByNameUseWell(String infoName); // 使用${}作為參數占位符 MyInfo getMyInfoByNameUseDollar(String infoName);
與之對應的映射文件中的查詢標簽定義如下。
<select id="getMyInfoByNameUseWell" resultMap="myInfoMap"> SELECT * FROM myinfo WHERE info_name = #{name} </select> <select id="getMyInfoByNameUseDollar" resultMap="myInfoMap"> SELECT * FROM myinfo WHERE info_name = '${name}' </select>
入參是基本類型(示例中是String類型)且參數個數只有一個時,使用#{}
和${}
占位符均不要求占位符指定的名稱與映射接口中的參數名相等,但是#{}
進行占位符替換后參數會添加上''
號,而${}
進行占位符替換是直接進行字符串替換,所以上述示例中,使用${}
占位符時需要在占位符兩側添加''
號。
映射接口中查詢單條記錄的方法定義如下。
// 使用#{}作為參數占位符 MyInfo getMyInfoByNameTypeUseWell(@Param("infoName") String infoName, @Param("infoType") String infoType); // 使用${}作為參數占位符 MyInfo getMyInfoByNameTypeUseDollar(@Param("infoName") String infoName, @Param("infoType") String infoType);
與之對應的映射文件中的查詢標簽定義如下。
<select id="getMyInfoByNameTypeUseWell" resultMap="myInfoMap"> SELECT * FROM myinfo WHERE info_name = #{infoName} AND info_type = #{infoType} </select> <select id="getMyInfoByNameTypeUseDollar" resultMap="myInfoMap"> SELECT * FROM myinfo WHERE info_name = '${infoName}' AND info_type = '${infoType}' </select>
入參是基本類型且參數個數大于一個時,此時需要在映射接口的方法中使用@Param注解定義參數的名稱,并且要求占位符指定的名稱需要與@Param注解定義的名稱相等,否則報錯。
映射接口中查詢單條記錄的方法定義如下。
// 使用#{}作為參數占位符 MyInfo getMyInfoByQueryParamUseWell(QueryParam queryParam); // 使用${}作為參數占位符 MyInfo getMyInfoByQueryParamUseDollar(QueryParam queryParam);
其中自定義類型QueryParam定義如下。
@Data public class QueryParam { private String infoName; private String infoType; public QueryParam(String infoName, String infoType) { this.infoName = infoName; this.infoType = infoType; } }
與之對應的映射文件中的查詢標簽定義如下。
<select id="getMyInfoByQueryParamUseWell" resultMap="myInfoMap" parameterType="com.learn.mybatis.dynamic.entity.QueryParam"> SELECT * FROM myinfo WHERE info_name = #{infoName} AND info_type = #{infoType} </select> <select id="getMyInfoByQueryParamUseDollar" resultMap="myInfoMap" parameterType="com.learn.mybatis.dynamic.entity.QueryParam"> SELECT * FROM myinfo WHERE info_name = '${infoName}' AND info_type = '${infoType}' </select>
入參是自定義類型時,占位符指定的名稱需要與自定義類型中的字段名相同,否則報錯。
映射接口中查詢單條記錄的方法定義如下。
// 使用#{}作為參數占位符 MyInfo getMyInfoByMapUseWell(Map<String, Object> queryParamMap); // 使用${}作為參數占位符 MyInfo getMyInfoByMapUseDollar(Map<String, Object> queryParamMap);
與之對應的映射文件中的查詢標簽定義如下。
<select id="getMyInfoByMapUseWell" resultMap="myInfoMap"> SELECT * FROM myinfo WHERE info_name = #{infoName} AND info_type = #{infoType} </select> <select id="getMyInfoByMapUseDollar" resultMap="myInfoMap"> SELECT * FROM myinfo WHERE info_name = '${infoName}' AND info_type = '${infoType}' </select>
入參是Map時,占位符指定的名稱需要與Map的key相等,這樣才能將key對應的value與占位符進行替換。
通過上面幾點分析,發現大多數能夠使用${}
占位符的場景都可以使用#{}
占位符,而且#{}
占位符相比${}
占位符還具有能夠防止SQL注入和提高執行速度的功能,但是如下幾種場景,只能夠使用${}
占位符。
當入參是表名時,此時如果表名的參數占位符使用#{}
,會報錯,因為表名不確定時,是無法進行預編譯SQL的,所以這種場景只能使用${}
作為表名的參數占位符。下面是示例。
映射接口中的示例方法定義如下。
// 傳入表名實現動態創建表 void createMyInfoTable(String tableName); // 傳入表名動態指定被查詢的表 MyInfo getMyInfoByNameUseWellDynmic(@Param("tableName") String tableName, @Param("infoName") String infoName);
與之對應的映射文件中的標簽定義如下。
<update id="createMyInfoTable"> CREATE TABLE ${tableName} ( id INT(11) PRIMARY KEY AUTO_INCREMENT, info_name VARCHAR(255), info_type ENUM('USER', 'HOUSE', 'CAR'), info_detail VARCHAR(255), info_seq INT(11) ) </update> <select id="getMyInfoByNameUseWellDynmic" resultMap="myInfoMap"> SELECT * FROM ${tableName} WHERE info_name = #{infoName} </select>
當入參是列名時,此時也只能使用${}
作為列名的參數占位符。下面是示例。
映射接口中的方法定義如下。
// 為數據庫表創建索引 // 表名,索引名,加索引的列的列名全部動態指定 void createIndex(@Param("tableName") String tableName, @Param("indexName") String indexName, @Param("columnNames") List<String> columnNames); // 對查詢結果集進行排序并動態指定排序的列名 List<MyInfo> getMyInfosSorted(String columnName);
與之對應的映射文件中的標簽定義如下。
<update id="createIndex"> CREATE INDEX ${indexName} ON ${tableName} <foreach collection="columnNames" item="columnName" open="(" separator="," close=")"> ${columnName} </foreach> </update> <select id="getMyInfosSorted" resultMap="myInfoMap"> SELECT * FROM myinfo ORDER BY ${columnName} DESC </select>
在為數據庫表創建索引的示例中,表名,索引名和加索引的列的列名全部都需要使用${}
作為參數占位符,否則會報錯。在對查詢結果集進行排序的示例中,如果列名占位符不使用${}
而使用#{}
,不會報錯,但是無法實現根據指定列進行排序的功能。
到此,相信大家對“MyBatis中的占位符入參方法有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。