目录
1、两种方式的区别
2、单个字面量类型的参数
2.1 在映射文件中,用#{}加任意名称获取参数的值:
2.2 在映射文件中,用${}加任意名称获取参数的值:
2.3 小结
3、在map集合类型的参数
3.1 使用MyBatis默认的map映射集合
3.2 实验:使用自定义map集合
3.2 结果
4、实体类类型的参数
4.1 实验
4.2 结果
5、使用@Param标识参数
5.1 @Param注解使用方法
5.2 使用@Param注解单(多)个字面类型的参数
5.3 其他情况
MyBatis获取参数有两种方式,分别为#{}和${}。下面Sql语句以t_user表为例,mapper接口、映射文件、表结构等参考博客:NO.2 MyBatis框架:创建Mapper接口和映射文件,实现基本增删改查_qq_46053741的博客-CSDN博客
1、两种方式的区别
${}:${}的本质就是字符串拼接,${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;
例如:
select *from t_user where id='${id}'
#{}:#{}的本质就是占位符赋值,但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时, 可以自动添加单引号。
例如:
select *from t_user where id=#{id}
2、单个字面量类型的参数
在UserMapper接口中定义了多个数据库操作方法,对于只有一个字面量类型的参数,此时可以使用${}和#{}以任意的名称获取参数的值。
以UserMapper接口中的User getUserByUsername(String username)方法为例,使用两种方式在Sql语句中获取参数值。
2.1 在映射文件中,用#{}加任意名称获取参数的值:
<!-- User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select id,username,password,age,gender from t_user where username=#{arg0}
</select>
或
<!-- User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select id,username,password,age,gender from t_user where username=#{abc}
</select>
2.2 在映射文件中,用${}加任意名称获取参数的值:
<!-- User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select id,username,password,age,gender from t_user where username='${arg0}'
</select>
或
<!-- User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select id,username,password,age,gender from t_user where username='${abc}'
</select>
因为是以${}方式获取字面量参数的值,因此要在${}外面手动加上单引号,拼接Sql语句。
2.3 小结
对于以上两种方式,因为getUserByUserBname方法只有一个字面量类型参数,因此可以通过任意的名称获取username参数的值。代码中使用的arg0是MyBatis自动将参数放在一个map映射集合中,以arg0、arg1...(或param1、param2...)为键,以参数为值存储的。因此只需要通过${}和#{}访问map集合的键就可以获取相对应的参数值。以arg0、arg1...(或param1、param2...)为键,获取参数值的方式在多个字面量类型的参数中也可使用。
如果方法中有多个字面量类型的参数,可以通过MyBatis默认的map映射集合获取对应的参数的值,此时不能通过任意的名称获取参数的值。
3、在map集合类型的参数
3.1 使用MyBatis默认的map映射集合
使用MyBatis默认的map映射集合,通使用${}或#{}方法,访问map集合中的arg或param键获取对应的参数值。
3.2 实验:使用自定义map集合
在Sql语句中获取参数的值可以通过MyBatis默认的map集合,同样的也可以使用自定义的map集合访问map集合的键获取参数的值,此时需要我们手动设置key-value。
在UserMapper接口中创建以下方法:
//通过自定义Map集合获取用户信息,String对应用户名,Object对应用户密码
User getUserByMap(Map<String,Object> map);
在UserMapper.xml文件中创建该方法的sql语句:
<!-- void getUserByMap(Map<String,Object> map);-->
<select id="getUserByMap" resultType="User" >
select *from t_user where username=#{username} and password=#{password}
</select>
在测试类中测试getUserByMap方法:
@Test
public void getUserByMap() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
///获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//创建map集合
Map<String,Object> map=new HashMap<String,Object>();
//向集合中添加元素
map.put("username","小黑子");
map.put("password","123456");
User user=userMapper.getUserByMap(map);
System.out.println(user);
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
3.2 结果
数据库中数据如下:
查询结果如下:
4、实体类类型的参数
若mapper接口中的方法参数为实体类对象时,此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号。
4.1 实验
以UserMapper接口中的int insertUser(User user)方法为例:
//添加用户
int insertUser(User user);
UserMapper.xml配置文件中sql语句如下:
<!-- int insertUser(User user);-->
<insert id="insertUser" >
insert into t_user(id,userName,password,age,gender) values(null,#{userName},#{password},#{age},#{gender})
</insert>
在测试类中测试insertUser方法:
@Test
public void insertUser() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
///获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
int isInsert=0;
isInsert=userMapper.insertUser(new User(null,"李斯","daqinwangchao",34,'男'));
if(isInsert>0){
System.out.println("数据添加成功");
}else{
System.out.println("数据添加失败");
}
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
4.2 结果
控制台输出结果:
数据库数据:
5、使用@Param标识参数
5.1 @Param注解使用方法
@Param标识参数适用于以上所有情况,通过@Param注解标识mapper接口中的方法参数,此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值。此时只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。
5.2 使用@Param注解单(多)个字面类型的参数
在UserMapper接口中以User getUserByUsername(String username)、int deleteUser(String username,String password)方法为例:
//根据用户名查询用户信息
User getUserByUsername(@Parameter("username") String username);
//根据用户名和密码删除用户
int deleteUser(@Param("username") String username,@Param("password") String password);
在UserMapper.xml配置文件中sql语句如下,通过注解的value属性值获取参数的值:
<!-- User getUserByUsername(@Param("username") String username);-->
<!--使用#{}方式获取参数的值-->
<select id="getUserByUsername" resultType="User">
select id,username,password,age,gender from t_user where username=#{username}
</select>
<!--
使用${}方式获取参数的值
<select id="getUserByUsername" resultType="User">
select id,username,password,age,gender from t_user where username='${username}'
</select>
-->
<!-- int deleteUser(@Param("username") String username,@Param("password") String password);-->
<delete id="deleteUser">
delete from t_user where username=#{username} and password=#{password}
</delete>
<!--
使用${}方式获取参数的值
<delete id="deleteUser">
delete from t_user where username='${username}' and password='${password}'
</delete>
-->
在测试类中测试该方法:
@Test
public void getUserByUsername() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
///获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.getUserByUsername("小黑子");
System.out.println(user);
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
@Test
public void deleteUser() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
///获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
int isDelete=0;
isDelete=userMapper.deleteUser("小黑子","1234");
if(isDelete>0){
System.out.println("数据删除成功");
}else{
System.out.println("数据删除失败");
}
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
结果如下:
5.3 其他情况
对于实体类类型的参数也可以通过@Param()注解的方式获取参数属性的值,一般情况下不这样使用,因为实体类类型的参数可以直接使用${}和#{}访问实体类对象中的属性名获取属性值。
对于Map集合只需要使用${}或#{},访问map集合中的的键获取对应的参数值,不需要设置@Param()注解。