一、單個簡單類型參數
簡單類型包括:
-
byte short int long float double char
-
Byte Short Integer Long Float Double Character
-
String
-
java.util.Date
-
java.sql.Date
parameterType 屬性:告訴 MyBatis 參數的類型
MyBatis 自帶類型自動推斷機制,所以大部分情況下 parameterType 屬性可以不寫
對于部分類型 MyBatis 內置已經起了別名,可以直接使用別名
參考文檔:https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases
<select id="selectById" resultType="Account" parameterType="java.lang.String">select * from t_act where actno = #{actno};
</select>
二、Map?參數?
這種方式是手動封裝 Map 集合,將每個條件以 key 和 value 的形式存放到集合中。
在使用的時候通過 #{map集合的key}
來取值。
/**
* 根據name和age查詢
* @param paramMap
* @return
*/
List<Student> selectByParamMap(Map<String,Object> paramMap);
@Test
public void testSelectByParamMap(){// 準備MapMap<String,Object> paramMap = new HashMap<>();paramMap.put("nameKey", "張三");paramMap.put("ageKey", 20);List<Student> students = mapper.selectByParamMap(paramMap);// students.forEach(student -> System.out.println(student));students.forEach(System.out::println);
}
<select id="selectByParamMap" resultType="student">select * from t_student where name = #{nameKey} and age = #{ageKey}
</select>
三、實體類參數?
這里需要注意的是:#{}
里面寫的是屬性名字。這個屬性名其本質上是:set/get 方法名去掉 set/get 之后的名字。 ?
/*** 保存學生數據* @param student* @return*/
int insert(Student student);
<insert id="insert">insert into t_student values(null,#{name},#{age},#{height},#{birth},#{sex})
</insert>
@Test
public void testInsert(){Student student = new Student();student.setName("李四");student.setAge(30);student.setHeight(1.70);student.setSex('男');student.setBirth(new Date());int count = mapper.insert(student);SqlSessionUtil.openSession().commit();
}
四、多參數?
/*** 根據name和sex查詢* @param name* @param sex* @return*/
List<Student> selectByNameAndSex(String name, Character sex);
@Test
public void testSelectByNameAndSex(){List<Student> students = mapper.selectByNameAndSex("張三", '女');// students.forEach(student -> System.out.println(student));students.forEach(System.out::println);
}
<select id="selectByNameAndSex" resultType="student">select * from t_student where name = #{name} and sex = #{sex}
</select>
執行結果:
異常信息描述了:name 參數找不到,可用的參數包括 [arg1, arg0, param1, param2]
修改 StudentMapper.xml 配置文件:嘗試使用 [arg1, arg0, param1, param2] 取參數
<select id="selectByNameAndSex" resultType="student"><!--select * from t_student where name = #{name} and sex = #{sex}-->select * from t_student where name = #{arg0} and sex = #{arg1}
</select>
執行結果:
再次嘗試修改 StudentMapper.xml 文件 ?
<select id="selectByNameAndSex" resultType="student"><!--select * from t_student where name = #{name} and sex = #{sex}--><!--select * from t_student where name = #{arg0} and sex = #{arg1}--><!--select * from t_student where name = #{param1} and sex = #{param2}-->select * from t_student where name = #{arg0} and sex = #{param2}
</select>
通過測試可以看到:
arg0 是第一個參數
param1 是第一個參數
arg1 是第二個參數
param2 是第二個參數
實現原理:實際上在 mybatis 底層會創建一個 map 集合,以 arg0/param1 為 key,以方法上的參數為 value
// mybatis 部分源碼
Map<String,Object> map = new HashMap<>();
map.put("arg0", name);
map.put("arg1", sex);
map.put("param1", name);
map.put("param2", sex);// 所以可以這樣取值:#{arg0} #{arg1} #{param1} #{param2}
// 其本質就是 #{map集合的key}
注意:使用 mybatis 3.4.2 之前的版本時:要用 #{0} 和 #{1} 這種形式。
五、@Param?注解(命名參數)?
map 集合的 key 可以自定義:使用使用 @Param 注解即可 ?
@Param("這里填寫的其實就是 map 集合的 key")
使用注解之后 arg0 arg1 失效了,但是 param1 param2 還可以用 ?
/*** 根據name和age查詢* @param name* @param age* @return*/
List<Student> selectByNameAndAge(@Param(value="name") String name, @Param("age") int age);
@Test
public void testSelectByNameAndAge(){List<Student> stus = mapper.selectByNameAndAge("張三", 20);// stus.forEach(student -> System.out.println(student));stus.forEach(System.out::println);
}
<select id="selectByNameAndAge" resultType="student">select * from t_student where name = #{name} and age = #{age}
</select>
六、@Param?源碼分析?
MyBatis 框架中的 @Param
注解主要用于在 SQL 語句中傳遞參數,并且可以指定參數的名稱,以便在 SQL 語句中引用
下面是 @Param
注解的核心原理解析:
-
參數綁定: 當使用
@Param
注解時,MyBatis 會將注解中指定的參數名與參數值進行綁定,這樣在 XML 映射文件或者注解中就可以通過參數名引用對應的參數值。 -
構建參數Map: 在處理帶有
@Param
注解的方法參數時,MyBatis 會將這些帶有@Param
注解的參數構建成一個參數 Map,在執行 SQL 語句時,會將這個參數 Map 傳遞給 SQL 語句,以便提供參數值。 -
參數替換: MyBatis 在解析 SQL 語句時,會檢測到帶有
@Param
注解的參數,并將參數值替換到 SQL 語句中對應的位置,從而構建最終可執行的 SQL 語句。 -
參數處理: MyBatis 在執行 SQL 語句時,會根據參數 Map 中的參數名和值來替換 SQL 語句中的參數占位符,從而執行 SQL 查詢操作。
-
參數傳遞: 使用
@Param
注解可以明確指定參數的名稱,避免參數不明確導致的錯誤,同時也可以方便地在 SQL 語句中引用具體的參數值。
總的來說,@Param
注解的核心原理是通過將帶有注解的參數與參數值進行綁定,并構建參數 Map,以便在 SQL 語句中引用參數值并執行查詢操作。這樣可以提高代碼的可讀性和準確性。
一? 葉? 知? 秋,奧? 妙? 玄? 心