MyBatis 获取参数的方式(重点)
MyBatis 获取参数值的方式有两种: ${} 和 #{}
${} 的本质是字符串的拼接,若为字符串类型或日期类型的字段赋值时需要手动添加单引号。
#{} 的本质是占位符赋值,当为字符串类型或日期类型的字段赋值时会自动添加单引号。
1. 单个字面量类型的参数
若mapper接口中的方法参数为单个的字面量类型,此时可以使用 ${} 和 #{} 以任意名称获取参数值,注意 ${} 需要手动添加单引号
示例:
// mapper 接口
User getByUsername(String username);
// xml映射文件实现,此时 ${} 和 #{} 可以任意名称,如 #{aaa}
<select id="getByUsername" resultType="com.hxz.mybatis.entity.User">
<!-- select * from t_user where username = #{username} -->
select * from t_user where username = '${username}'
</select>
2. 多个字面量类型的参数
当mapper接口中的方法参数为多个时,此时mybatis会自动将这些参数放在一个map集合中,以arg0、arg1…为键,以参数为值,以param1、param2…为键,以参数为值这两种方式来存储,因此只需要通过 ${} 和 #{} 访问map集合的键就可以获取相应的值,注意 ${} 需要手动添加单引号
示例:
// mapper 接口
User getByUsernameAndPassword(String username, String password);
// xml映射文件实现
<select id="getByUsernameAndPassword" resultType="com.hxz.mybatis.entity.User">
<!-- 直接使用参数名来获取会抛出org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2] 异常 -->
<!-- 错误示例:select * from t_user where username = #{username} and password = #{password} -->
<!-- 正确示例: -->
<!-- select * from t_user where username = #{arg0} and password = #{arg1} -->
select * from t_user where username = #{param1} and password = #{param2}
</select>
3. Map 类型的参数
若mapper接口中的方法参数为多个时,可以手动创建map集合,将这些参数值放在map集合中,只需要通过 ${} 和 #{} 访问map集合的键就可以获取相应的值,注意 ${} 需要手动添加单引号
示例:
// mapper 接口
User getByParams(Map<String, Object> params);
// xml映射文件实现
<select id="getByParams" resultType="com.hxz.mybatis.entity.User">
<!-- 取map集合中的键 -->
select * from t_user where username = #{username} and password = #{password}
</select>
4. 实体类类型参数
若mapper接口方法中的参数是实体类对象时,通过 ${} 和 #{} 访问实体类对象的属性名获取属性值,注意 ${} 需要手动添加单引号
示例:
// mapper 接口
int insertUser(User user);
// xml映射文件实现
<insert id="insertUser">
<!-- 直接取属性名 -->
insert into t_user (username, password, age, sex, email) VALUES (#{username}, #{password}, #{age}, #{sex}, #{email})
</insert>
5. 使用 @Param 标识参数
可以通过 @Param 注解标识mapper方法中的参数,此时会自动将这些参数放在map集合中,以 @Param 注解的 value 值为键,以参数为值,或者以 param1,param2…为键,以参数为值,只需要通过 ${} 和 #{} 访问map集合的键就可以获取相应的值,注意 ${} 需要手动添加单引号
示例:
// mapper 接口
User getUser(@Param("username") String username, @Param("password") String password);
// xml映射文件实现
<select id="getUser" resultType="com.hxz.mybatis.entity.User">
<!-- 使用了@Param注解标识参数,Mybatis会使用@Param注解的value值将参数放在map集合中,这个时候只能使用@Param注解的value值来获取参数 -->
select * from t_user where username = #{username} and password = #{password}
</select>