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);
}