一、单个简单类型参数
简单类型包括:
-
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 语句中引用参数值并执行查询操作。这样可以提高代码的可读性和准确性。
一 叶 知 秋,奥 妙 玄 心