MyBatis获取参数值的两种方式:${}和#{}${}的本质就是字符串拼接,#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
- /**
- * MyBatis 获取参数的两种方式:${} 和 #{}
- * #{} 的本质是占位符 , ${}的本质是字符串拼接
- * 1.若 mapper 接口方法参数为单个字面量类型
- * 此时可以通过 #{} 和 ${} 以任意内容获取参数值,一定要注意 ${} 的单引号问题
- */
- public interface UserMapper {
-
- /**
- * 根据用户名查询用户信息
- * @param username 需要查询的用户名参数
- * @return 获取查询到的用户对象
- */
- User getUserByUsername(String username);
- }
UserMapper.xml 配置文件:
- <mapper namespace="com.chenyixin.ssm.mapper.UserMapper">
-
- <select id="getUserByUsername" resultType="user">
-
- select * from t_user where username = '${username}'
- select>
- mapper>
测试类:
- public class UserMapperTest {
-
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
-
- @Test
- public void getUserByUsername() {
- User user = mapper.getUserByUsername("李四");
- System.out.println(user);
- }
- }
结果:

若mapper接口中的方法参数为多个字面量类型
此时 MyBatis 会将参数放在 map 集合汇总,以两种方式存储数据a> 以 arg0,arg1 ... 为键,以参数值为值b> 以 param1,param2 ... 为键,以参数值为值因此,只需要通过 #{} 和 ${} 访问 map 集合的键,就可以获取相对应的值一定要注意 ${} 单引号问题
代码示例:
UserMapper 接口:
- /**
- * 用户登录检验
- * @param username 用户名
- * @param password 密码
- * @return 返回登录的用户
- */
- User checkLogin(String username, String password);
UserMapper.xml 配置文件:
- <select id="checkLogin" resultType="user">
-
- select * from t_user where username = '${param1}' and password = '${param2}'
- select>
测试;
- @Test
- public void checkLogin() {
- User user = mapper.checkLogin("李四","123");
- System.out.println(user);
- }
结果:

若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在 map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号
代码示例:
UserMapper 接口:
- /**
- * 验证登录(通过 map 集合)
- * @param map 参数
- * @return 返回登录的用户
- */
- User checkLoginByMap(Map
map) ;
UserMapper.xml 配置文件:
- <select id="checkLoginByMap" resultType="user">
- select *
- from t_user
- where username = #{username}
- and password = #{password}
- select>
测试:
- @Test
- public void checkLoginByMap() {
- Map
map = new HashMap<>(); - map.put("username", "李四");
- map.put("password", "123");
- User user = mapper.checkLoginByMap(map);
- System.out.println(user);
- // User{id=3, username='李四', password='123', age=19, gender='男', email='123456@qq.com'}
- }
如果 mapper 接口方法的参数为实体类类型
只需要通过 #{} 和 ${} 访问实体类中的属性名,既可以获取相对应的属性值(这里的属性指的是get方法的属性)
一定要注意 ${} 的单引号问题
代码示例:
UserMapper 接口:
- /**
- * 添加用户信息
- * @param user 要添加的用户信息
- * @return 返回影响数据库行数
- */
- int insertUser(User user);
UserMapper.xml 配置文件:
- <insert id="insertUser">
- insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
- insert>
测试:
- @Test
- public void insertUser() {
- User user = new User(null, "王五", "321", 23, "女", "321@qq.com");
- int i = mapper.insertUser(user);
- System.out.println(i); // 1
- }
结果:

可以在 mapper 接口方法的参数上设置@Param 注解
此时 MyBatis 汇集那个这些参数放在 map,以两种方式进行存储
a> 以 @Param 注解的 value 属性值为键,一参数为值
b> 以 param1,param2 ... 为键,以参数为值
因此,只需要通过 #{} 和 ${} 访问 map 集合的键,就可以获取相对应的值
一定要注意 ${} 单引号问题
代码示例:
UserMapper 接口:
- /**
- * 验证登录 (通过 @Param 注解方式)
- * @param username 用户名
- * @param password 密码
- * @return 返回登录的用户信息,若登录失败,则返回 null
- */
- User checkLoginParam(@Param("username") String username, @Param("password") String password);
UserMapper.xml 配置文件:
-
- <select id="checkLoginParam" resultType="user">
- select *
- from t_user
- where username = #{username}
- and password = #{password}
- select>
测试:
- @Test
- public void checkLoginParam() {
- User user = mapper.checkLoginParam("王五", "321");
- System.out.println(user);
- // User{id=13, username='王五', password='321', age=23, gender='女', email='321@qq.com'}
- }
以后都使用 实体类类型的参数 与 @Param标识参数(包括单个字面量类型的参数)