05、MyBatis获取参数
5.1、MyBatis获取参数值的两种方式
- MyBatis获取参数值的两种方式:
${}
和#{}
${}
的本质就是字符串拼接,#{}
的本质就是占位符赋值${}
使用字符串拼接的方式拼接sql
,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;
但是#{}
使用占位符赋值的方式拼接sql
,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
5.2、MyBatis获取参数值的各种情况
5.2.1、单个字面量类型的参数
注意:
若
mapper
接口中的方法参数为单个的字面量类型:此时可以使用
${}
和#{}
以任意的名称获取参数值。
1、#{}
<!--User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
<!--
select * from t_user where username = #{aaa}
此时的#{aaa},并不影响参数传值
-->
select * from t_user where username = #{username}
</select>
2、${}
<!--User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select * from t_user where username = '${username}'
</select>
注意:
${}
需要手动加单引号
3、代码测试:
【ParameterMapperTest.java】
@Test
public void getUserByUsername() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
User user = parameterMapper.getUserByUsername("张三");
System.out.println(user);
}
5.2.2、多个字面量类型的参数
若mapper
接口中的方法参数为多个时:
此时MyBatis
会自动将这些参数放在一个map
集合中,以两种方式进行存储:
- 以
arg0
,arg1
…为键,以参数为值; - 以
param1
,param2
…为键,以参数为值;
因此只需要通过${}
和#{}
访问map
集合的键就可以获取相对应的值。
1、#{}
<!--User checkLogin(String username, String password);-->
<select id="checkLogin" resultType="User">
<!--select * from t_user where username=#{arg0} and password=#{arg1}-->
<!--select * from t_user where username=#{param1} and password=#{param2}-->
select * from t_user where username=#{arg0} and password=#{param2}
</select>
2、${}
<!--User checkLogin(String username, String password);-->
<select id="checkLogin" resultType="User">
select * from t_user where username='${arg0}' and password='${param2}'
</select>
注意:
${}
需要手动加单引号
3、代码测试:
【ParameterMapperTest.java】
@Test
public void checkLogin() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
User user = parameterMapper.checkLogin("张三","123456");
System.out.println(user);
}
5.2.3、map集合类型的参数
若mapper
接口中的方法需要的参数有多个时,可以手动将这些参数放在一个map
中存储。
此时,只需要通过${}
和#{}
访问map
集合的键就可以获取相对应的值,此时的键是由自己设置的。
1、#{}
<!--User checkLoginByMap(Map<String, Object> map);-->
<select id="checkLoginByMap" resultType="User">
select * from t_user where username=#{username} and password=#{password}
</select>
2、${}
<!--User checkLoginByMap(Map<String, Object> map);-->
<select id="checkLoginByMap" resultType="User">
select * from t_user where username='${username}' and password='${password}'
</select>
注意:
${}
需要手动加单引号
3、代码测试:
【ParameterMapperTest.java】
@Test
public void checkLoginByMap() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("username", "张三");
map.put("password", "123456");
User user = parameterMapper.checkLoginByMap(map);
System.out.println(user);
}
5.2.4、实体类类型的参数
若mapper
接口中的方法参数为实体类对象时:
此时可以使用${}
和#{}
,通过访问实体类对象中的属性名获取属性值。
1、#{}
<!--int insertUser(User user);-->
<insert id="insertUser">
insert into t_user value (null,#{username},#{password},#{age},#{sex},#{email})
</insert>
2、${}
<!--int insertUser(User user);-->
<insert id="insertUser">
insert into t_user value (null,'${username}','${password}',${age},'${sex}','${email}')
</insert>
注意:
${}
需要手动加单引号
3、代码测试:
【ParameterMapperTest.java】
@Test
public void insertUser() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
User user = new User(1,"李四","123456",23,"男","lisi@qq.com");
int insertUser = parameterMapper.insertUser(user);
System.out.println(insertUser);
}
5.2.5、使用@Param标识参数
可以通过@Param
注解标识mapper
接口中的方法参数:
此时,MyBatis会将这些参数放在map
集合中,以两种方式进行存储:
- 以
@Param
注解的value
属性值为键,以参数为值; - 以
param1
,param2
…为键,以参数为值;
因此只需要通过${}
和#{}
访问map
集合的键就可以获取相对应的值。
1、#{}
<!--User checkLoginByParam(@Param("username") String username, @Param("password") String password);-->
<select id="checkLoginByParam" resultType="User">
select * from t_user where username=#{username} and password=#{password}
</select>
2、${}
<!--User checkLoginByParam(@Param("username") String username, @Param("password") String password);-->
<select id="checkLoginByParam" resultType="User">
select * from t_user where username='${username}' and password='${password}'
</select>
注意:
${}
需要手动加单引号
3、代码测试:
【ParameterMapperTest.java】
@Test
public void checkLoginByParam() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
User user = parameterMapper.checkLoginByParam("张三","123456");
System.out.println(user);
}