1. 输入映射
输入映射,是在映射文件中通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。假设现在有个比较复杂的查询需求:完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的),那么我们单纯的传入一个User就不行了,所以首先我们得根据查询条件,自定义一个新的pojo,在这个pojo中包含所有的查询条件。
1)定义包装类型pojo
定义一个UserQueryVo类,将要查询的条件包装进去。这里为了简单起见,就不添加其他的查询条件了,UserQueryVo中就包含一个User,假设复杂的查询条件在User中都已经包含了。
2)配置UserMapper.xml文件
定义好了我们自己的pojo后,需要在UserMap.xml映射文件中配置查询的statement,如下:<select id="findUserList" parameterType="mybatis.po.UserQueryVo" resultType="mybatis.po.User">
select * from user where user.sex = #{user.sex} and user.username like '%${user.username}%'
</select>
输入的parameterType的值是我们自己定义的pojo,输出的是User,当然这里的User也可以换成另一个用户自定义的pojo,包含用户所需要的条件,都行,不仅仅局限为User。然后查询条件使用OGNL表达式,取出UserQueryVo中User的相应属性即可。
在SqlMapperConfig.xml中配置好这个UserMapper.xml映射文件。
3)定义mapper接口
做好了自定义的pojo输入映射了,其实并不是很难,下面测试一下这个程序是否正确:
输入映射比较简单,下面来总结一下输出映射相关的东东。
2. 输出映射
输出映射中同样有很多中对象类型,这里也主要总结一下输出pojo对象。mybatis中的与输出映射有关的resultType就不再叙述了,下面博文都已经提到过了,这里主要总结一下另一个resultMap的使用方法。
通过resultType输出映射的时候,查询出来的列名和pojo中对应的属性名要一致才可以做正确的映射,如果不一致就会映射错误。但是如果不一致呢?该如何解决这个问题呢?这就要使用resultMap来映射了。
假设现在映射文件中有个sql语句:SELECT id id_,username username_ FROM USER WHERE id=#{id},从这个sql语句中可以看出,查询出了id和username两列,但是都起了别名了,也就是说,如果我们现在用resultType去映射到User中的话,肯定会出问题,所以我们现在要定义一个resultMap来做查询结果列与User的属性之间的一个映射。
1)定义resultMapper
首先我们要定义一个resultMap,如下:
关于resultMap中的几个属性,简单介绍一下它们的作用:
2)配置文件UserMapper.xml
3)定义Mapper接口
对resultMap的配置和接口处理完之后,我们来写一个测试程序测试一下:
打印出的user中只有sex和username是有值的,其他都是null,因为我们在sql中只要了这两个属性,所以是正常的。
总结一下:使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
参考:https://mp.weixin.qq.com/s/pZdyL9k2eoAilGCK2ocYMw