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;
   }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值