[关闭]
@nextleaf 2018-09-06T12:00:36.000000Z 字数 3584 阅读 650

【5】MyBatis输入映射和输出映射

MyBatis


mybatis中输入映射和输出映射可以是基本数据类型、hashmap或者pojo的包装类型,这里主要来总结一下pojo包装类型的使用,因为这个在开发中比较常用。

1. 输入映射

输入映射,是在映射文件中通过parameterType指定输入参数的类型,类型可以是简单类型hashmappojo的包装类型。假设现在有个比较复杂的查询需求:完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的),那么我们单纯的传入一个User就不行了,所以首先我们得根据查询条件,自定义一个新的pojo,在这个`pojo中包含所有的查询条件

1.1 定义包装类型pojo

定义一个UserQueryVo类,将要查询的条件包装进去。这里为了简单起见,就不添加其他的查询条件了,UserQueryVo中就包含一个User,假设复杂的查询条件在User中都已经包含了。

  1. package com.pojo;
  2. public class UserQueryVo {
  3. //在这里添加所需要的查询条件
  4. //用户查询条件,这里假设一个User就已经够了
  5. private User user;
  6. public User getUser() {
  7. return user;
  8. }
  9. public void setUser(User user) {
  10. this.user = user;
  11. }
  12. //可以包装其他的查询条件,比如订单、商品等
  13. //......
  14. }

1.2 配置UserMapper.xml映射文件

定义好了我们自己的pojo后,需要在UserMap.xml映射文件中配置查询的statement,如下:

  1. <select id="findUserList" parameterType="mybatis.po.UserQueryVo" resultType="mybatis.po.User">
  2. select * from user where user.sex = #{user.sex} and user.username like '%${user.username}%'
  3. </select>

输入的parameterType的值是我们自己定义的pojo,输出的是User,当然这里的User也可以换成另一个用户自定义的pojo,包含用户所需要的条件,都行,不仅仅局限为User。然后查询条件使用OGNL表达式,取出UserQueryVo中User的相应属性即可。
然后别忘了在SqlMapperConfig.xml中配置好这个UserMapper.xml映射文件。

1.3 定义Mapper接口

  1. public interface UserMapper {
  2. //省去无关代码
  3. //用户信息综合查询
  4. public List<User> findUserList(UserQueryVo userQueryVo) throws Exception;
  5. }

到此为止,我们就做好了自定义的pojo输入映射了,其实并不是很难,下面测试一下这个程序是否正确:

  1. @Test
  2. public void testFindUserList() throws Exception {
  3. SqlSession sqlSession = sqlSessionFactory.openSession();
  4. //创建UserMapper对象,mybatis自动生成mapper代理对象
  5. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  6. //创建包装对象,设置查询条件
  7. UserQueryVo userQueryVo = new UserQueryVo();
  8. User user = new User();
  9. user.setSex("男");
  10. user.setUsername("倪升武");
  11. userQueryVo.setUser(user);
  12. //调用userMapper的方法
  13. List<User> list = userMapper.findUserList(userQueryVo);
  14. System.out.println(list);
  15. }

2. 输出映射

这里主要总结一下另一个resultMap的使用方法。
我们知道,通过resultType输出映射的时候,查询出来的列名和pojo中对应的属性名要一致才可以做正确的映射,如果不一致就会映射错误。但是如果不一致呢?该如何解决这个问题呢?这就要使用resultMap来映射了。
假设现在映射文件中有个sql语句:

SELECT id id_,username username_ FROM USER WHERE id=#{id}

从这个sql语句中可以看出,查询出了id和username两列,但是都起了别名了,也就是说,如果我们现在用resultType去映射到User中的话,肯定会出问题,所以我们现在要定义一个resultMap来做查询结果列与User的属性之间的一个映射。

2.1 定义resultMap

  1. <!-- 根据id查询用户信息,使用resultMap输出 (此处用了列别名) -->
  2. <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
  3. SELECT id id_,username username_ from user where id = #{id}
  4. </select>
  5. <!-- 输出映射,如果查询出来的列名和pojo的属性名不一致(通常是起了列的别名),通过定义一个resultMap对列名和pojo属性名之间作一个映射关系-->
  6. <resultMap type="User" id="userResultMap"><!-- id属性是对这个resultMap的唯一标识 -->
  7. <id column="id_" property="id"/><!-- <id>表示查询结果集中的唯一标识 -->
  8. <result column="username_" property="username"/><!-- column属性:表示查询出来的列名。property属性:表示上面type指定的pojo类型中的属性名 -->
  9. </resultMap>

关于resultMap中的几个属性,简单介绍一下它们的作用:

<resultMap>中的type属性表示resultMap最终映射的java对象类型。上面用的是别名,如果没有定义别名,需要使用完全限定名
<resultMap>中的id属性是对这个resultMap的唯一标识。
<resultMap>的子标签<id>表示查询结果集中的唯一标识,因为id是主键。
<resultMap>的子标签<result>表示对查询结果集中普通名映射的定义。
子标签中的column属性:表示查询出来的列名
子标签中的property属性:表示上面type指定的pojo类型中的属性名。

2.2 配置UserMapper.xml映射文件

  1. <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
  2. SELECT id id_,username username_ from user where id = #{id}
  3. </select>

2.3 定义Mapper接口

  1. public interface UserMapper {
  2. //省去无关代码
  3. //根据id查询用户信息,使用resultMap输出
  4. public User findUserByIdResultMap(int id) throws Exception;
  5. }

对resultMap的配置和接口处理完之后,我们来写一个测试程序测试一下:

  1. @Test
  2. public void testFindUserByIdResultMap() throws Exception {
  3. SqlSession sqlSession = sqlSessionFactory.openSession();
  4. //创建UserMapper对象,mybatis自动生成mapper代理对象
  5. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  6. User user = userMapper.findUserByIdResultMap(1);
  7. System.out.println(user);
  8. }

在最后的结果中可以看出,打印出的user中只有sex和username是有值的,其他都是null,因为我们在sql中只要了这两个属性,所以是正常的。
最后总结一下:使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注