MyBatis:使用Map参数类型

上一篇文章中介绍了简单的CRUD语句,其中当我们需要根据Id更新name以及pwd字段时,传入的实际上是一个对象:
测试类中的方法:

1
mapper.updateUser(new User(2,"Liu","password"));

UserMapper.xml:

1
2
3
<update id="updateUser" parameterType="com.xliu.pojo.User">
update mybatis.user set name=#{name}, pwd=#{pwd} where id=#{id};
</update>

想象一下当数据库的字段变得非常多的时候,假设一个用户同时拥有id,name,pwd,address,hobby,phone等多条属性时,再做上述操作传入对象时,我们需要填写所有的字段的值,即使我们的需求仅仅是根据id改用户的密码。
为了解决上述问题,我们可以使用Map作为参数的类型

使用Map参数

已知Map是一个的数据结构,我们可以将我们所需要用到的字段以及值存储进去,包括条件字段以及需要更新的字段。
回归上述情形,假设一条用户数据有很多个字段,而现在的需求是根据用户ID更改用户密码,因此我们只需要将这两个字段以及值存入Map中。
UserMapper.java:

1
2
<!-- 添加一条方法 -->
void updateUser2(Map<String,Object> map);

UserMapper.xml:

1
2
3
4
<!-- 添加一个标签 -->
<update id="updateUser2" parameterType="map">
update mybatis.user set pwd=#{pwd} where id=#{id};
</update>

Test.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void updateUser2() {

SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
<!-- 创建一个HashMap对象 -->
HashMap<String, Object> map = new HashMap<String, Object>();
<!-- 添加K-V数据 -->
map.put("id", 1);
map.put("pwd", "password");
<!-- 将map作为参数传入方法 -->
mapper.updateUser2(map);
sqlSession.commit();
sqlSession.close();
}

总结

Map传递参数,设置parameterType=”map”后,直接在sql中取出key即可:update mybatis.user set pwd=#{pwd} where id=#{id};。另外,此处#{}中可以用任意的名字,只要在创建map的时候和Key的名字统一就行。