单个字面量类型的参数
若mapper接口中的方法参数为单个的字面量类型
此时可以使用 ${} 和 #{} 以任意的名称获取参数的值,
注意 ${} 需要手动加单引号
字面量:字符串、基本数据类型、基本数据类型对应的包装类 例如: int a = 1
如:
UserMapper.java
User getUserByUsername(String username);UserMapper.xml
<select id="getUserByUsername" parameterType="java.lang.String" resultType="User">
select * from t_user where username = #{username}
</select>通过测试代码:
@Test
public void testgetUserByUsername(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserByUsername("test1");
System.out.println(user);
sqlSession.close();
}输出:

如果使用 ${},则如果是字符串参数,则要手动添加单引号
<select id="getUserByUsername" parameterType="java.lang.String" resultType="User">
select * from t_user where username = '${username}'
</select>此时发现跟jdbc.properties里的重复,会取到这个文件里的参数,导致username='root',根据debug发现可以用arg0代替
<select id="getUserByUsername" parameterType="java.lang.String" resultType="User">
select * from t_user where username = '${arg0}'
</select>运行成功.

总结:
单个参数的时候不管事#或者$,参数名称都可以用arg0代替
多个字面量类型的参数
若mapper接口中的方法参数为多个时
此时MyBatis会自动将这些参数放在一个map集合中,
(1)以arg0,arg1…为键,以参数为值;
(2)以param1,param2…为键,以参数为值;
因此只需要通过 ${} 和 #{} 访问map集合的键就可以获取相对应的值,
注意 ${} 需要手动加单引号
方法1:
UserMapper.java
User getUserByUsernameAndPassword(String username1,String password1);UserMapper.xml
<select id="getUserByUsernameAndPassword" resultType="User">
select * from t_user where username = #{arg0} and password = #{arg1}
</select>
测试用param1和param2也是可以,用${}加单引号也可以
方法二:
用注解@Param(""),注解中的参数则是sql的参数名
UserMapper.java
User getUserByUsernameAndPassword(@Param("username") String username,@Param("password") String password);UserMapper.xml
<select id="getUserByUsernameAndPassword" resultType="User">
select * from t_user where username = #{username} and password = #{password}
</select>
map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过 ${} 和 #{} 访问map集合的键就可以获取相对应的值。
注意 ${} 需要手动加单引号
UserMapper.java
User getUserByUsernameAndPassword(Map<String,Object> map);UserMapper.xml
<select id="getUserByUsernameAndPassword" parameterType="map" resultType="User">
select * from t_user where username = #{username} and password = #{password}
</select>测试程序
@Test
public void testGetUserByUsernameAndPassword(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
HashMap<String,Object> map = new HashMap<>();
map.put("username","test1");
map.put("password","0");
//User user = userMapper.getUserByUsernameAndPassword("test1","0");
User user = userMapper.getUserByUsernameAndPassword(map);
System.out.println(user);
sqlSession.close();
}
注意:
map添加的顺序和键的名称必须一致。
实体类类型的参数
若mapper接口中的方法参数为实体类对象时
此时可以使用 ${} 和 #{} ,通过访问实体类对象中的属性名获取属性值,
注意 ${} 需要手动加单引号
UserMapper.java
User getUserByUsernameAndPassword(User user);UserMapper.xml
<select id="getUserByUsernameAndPassword" parameterType="User" resultType="User">
select * from t_user where username = #{username} and password = #{password}
</select>测试程序
@Test
public void testGetUserByUsernameAndPassword(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
HashMap<String,Object> map = new HashMap<>();
map.put("username","test1");
map.put("password","0");
User userPara = new User();
userPara.setUsername("test1");
userPara.setPassword("0");
//User user = userMapper.getUserByUsernameAndPassword("test1","0");
//User user = userMapper.getUserByUsernameAndPassword(map);
User user = userMapper.getUserByUsernameAndPassword(userPara);
System.out.println(user);
sqlSession.close();
}测试成功

注意:
参数名和实体类的属性名必须一致
本文介绍了MyBatis中不同参数类型的传参方式。包括单个字面量类型参数,可用${}和#{}以任意名称取值;多个字面量类型参数,MyBatis会将其放入map集合;map集合类型参数,手动创建map后通过键取值;实体类类型参数,通过访问属性名获取属性值。同时提醒${}需手动加单引号。
1438

被折叠的 条评论
为什么被折叠?



