Mybatis06-Mybatis获取参数值的两种方式
1、获取参数值的两种方式
Mybatis获取参数的两种方式:${} 和 #{}
${}本质:字符串拼接
#{}本质:占位符赋值
2、mapper接口方法的参数为单一的字面量类型
可以通过${}和#{}以任意的字符串获取参数值,但是需要注意 ${}的单引号问题
2.1、mapper接口方法
/**
* 根据用户名查询用户信息
*/
User getUserByUsername(String username);
2.2、mapper接口的映射文件
<!-- User getUserByUsername(String username); -->
<select id="getUserByUsername" resultType="User">
<!-- select * from mybatis.user where username = #{username} -->
select * from mybatis.user where username = '${username}'
</select>
2.3、测试方法代码及其对应运行结果
@Test
public void testGetUserByUsername() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
User user = parameterMapper.getUserByUsername("sweetyuge");
System.out.println(user);
}
- 正常运行结果
- 将SQL中的#{}或${}中的字符修改后的运行结果
说明字符串该情况下可以任取
3、mapper接口方法的参数为多个时
3.1、mapper接口方法
/**
* 验证登录
*/
User checkLogin(String username, String password);
3.2、mapper接口的映射文件
<!-- User checkLogin(String username, String password); -->
<select id="checkLogin" resultType="User">
<!-- select * from mybatis.user where username = #{arg0} and password = #{arg1} -->
select * from mybatis.user where username = '${param1}' and password = '${param2}'
</select>
3.3、测试方法代码及其对应运行结果
@Test
public void testCheckLogin() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
User user = parameterMapper.checkLogin("sweetyuge", "123");
System.out.println(user);
}
- 正常运行结果
- 由错误得到Mybatis多参数时该如何取值
Mybatis会将这些参数放在一个map集合中,以两种方式进行存储
a>以arg0,arg1…为键,以参数为值
b>以param1,param2…为键,以参数为值
因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意 ${}的单引号问题
4、mapper接口方法的参数有多个时,可以手动将这些参数放在一个map中存储
4.1、mapper接口方法
/**
* 验证登录(参数为map)
*/
User checkLoginByMap(Map<String, Object> map);
4.2、mapper接口的映射文件
<!-- User checkLoginByMap(Map<String, Object> map); -->
<select id="checkLoginByMap" resultType="User">
select * from mybatis.user where username = #{username} and password = #{password}
</select>
4.3、测试方法代码
@Test
public void testCheckLoginByMap() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("username", "sweetyuge");
map.put("password", "123");
User user = parameterMapper.checkLoginByMap(map);
System.out.println(user);
}
4.4、运行结果
5、mapper接口方法的参数是实体类类型的参数
5.1、mapper接口方法
/**
* 添加用户信息
*/
int insertUser(User user);
5.2、mapper接口的映射文件
<!-- int insertUser(User user); -->
<insert id="insertUser">
insert into mybatis.user values(null, #{username}, #{password}, #{age}, #{sex})
</insert>
5.3、测试方法代码及其对应运行结果
@Test
public void testInsertUser() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
int result = parameterMapper.insertUser(new User(null, "wy", "123", 18, "女"));
System.out.println(result);
}
6、使用@Param注解命名参数
此时Mybatis会将这些参数放在一个map集合中,以两种方式进行存储
a>以@Param注解的值为键,以参数为值
b>以param1,param2…为键,以参数为值
因此只需要通过#{}和 ${}以键的方式访问值即可,但是需要注意 ${}的单引号问题
6.1、mapper接口方法
/**
* 验证登录(使用@Param)
*/
User checkLoginByParam(@Param("username") String username, @Param("password") String password);
6.2、mapper接口的映射文件
<!-- User checkLoginByParam(@Param("username") String username, @Param("password") String password); -->
<select id="checkLoginByParam" resultType="User">
select * from mybatis.user where username = #{username} and password = #{password}
</select>
6.3、测试方法代码及其对应运行结果
@Test
public void testCheckLoginByParam() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
User user = parameterMapper.checkLoginByParam("sweetyuge", "123");
System.out.println(user);
}
7、参数设置源码
public Object getNamedParams(Object[] args) {
final int paramCount = names.size();
if (args == null || paramCount == 0) {
return null;
} else if (!hasParamAnnotation && paramCount == 1) {
Object value = args[names.firstKey()];
return wrapToMapIfCollection(value, useActualParamName ? names.get(0) : null);
} else {
final Map<String, Object> param = new ParamMap<>();
int i = 0;
for (Map.Entry<Integer, String> entry : names.entrySet()) {
param.put(entry.getValue(), args[entry.getKey()]);
// add generic param names (param1, param2, ...)
final String genericParamName = GENERIC_NAME_PREFIX + (i + 1);
// ensure not to overwrite parameter named with @Param
if (!names.containsValue(genericParamName)) {
param.put(genericParamName, args[entry.getKey()]);
}
i++;
}
return param;
}
}