MyBatis总结之输入和输出映射

Posted fswhq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis总结之输入和输出映射相关的知识,希望对你有一定的参考价值。

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

 

1. 输入映射

 

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

 

1.1 定义包装类型pojo

 

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

 

public class UserQueryVo {

 

    //在这里添加所需要的查询条件

 

    //用户查询条件,这里假设一个User就已经够了

    private User user;

 

    public User getUser() {

        return user;

    }

 

    public void setUser(User user) {

        this.user = user;

    }   

      

}

 

1.2 配置UserMapper.xml映射文件

 

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

 

<select id="findUserList" parameterType="mybatis.po.UserQueryVo" resultType="mybatis.po.User">

    select * from user where sex = #{user.sex} and username like ‘%${user.username}%‘

</select>

 

  我们看到,输入的parameterType的值是我们自己定义的pojo,输出的是User,当然这里的User也可以换成另一个用户自定义的pojo,包含用户所需要的条件,都行,不仅仅局限为User。然后查询条件使用OGNL表达式,取出UserQueryVoUser的相应属性即可。

  然后别忘了在SqlMapperConfig.xml中配置好这个UserMapper.xml映射文件。

 

1.3 定义Mapper接口

 

public interface UserMapper {

 

    //用户信息综合查询

    public List<User> findUserList(UserQueryVo userQueryVo) throws Exception;

}   

 

  到此为止,我们就做好了自定义的pojo输入映射了,其实并不是很难

 

 

2. 输出映射

 

  输出映射中同样有很多种对象类型,这里也主要总结一下输出pojo对象。mybatis中的与输出映射有关的resultType就不再叙述了,这里主要总结一下另一个resultMap的使用方法。

  我们知道,通过resultType输出映射的时候,查询出来的列名和pojo中对应的属性名要一致才可以做正确的映射,如果不一致就会映射错误。如果不一致,这就要使用resultMap来映射了。

  假设现在映射文件中有个sql语句:SELECT id id_,username username_ FROM USER WHERE id=#{id},从这个sql语句中可以看出,查询出了idusername两列,但是都起了别名了,也就是说,如果我们现在用resultType去映射到User中的话,肯定会出问题,所以我们现在要定义一个resultMap来做查询结果列与User的属性之间的一个映射。

 

2.1 定义resultMap

 

  首先我们要定义一个resultMap,如下:

 

<resultMap type="user" id="userResultMap">

    <id column="id_" property="id"/>

    <result column="username_" property="username"/>

</resultMap>

 

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

 

<resultMap>中的type属性表示 resultMap最终映射的java对象类型。上面用的是别名,如果没有定义别名,需要使用完全限定名

<resultMap>中的id属性是对这个resultMap的唯一标识。

<resultMap>的子标签<id>表示查询结果集中的唯一标识,因为id是主键。

<resultMap>的子标签<result>表示对查询结果集中普通名映射的定义。

子标签中的column属性:表示查询出来的列名

子标签中的property属性:表示上面type指定的pojo类型中的属性名

 

2.2 配置UserMapper.xml映射文件

 

<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">

    SELECT id id_,username username_ from user where id = #{id}

</select>

 

2.3 定义Mapper接口

 

public interface UserMapper {

    

    //根据id查询用户信息,使用resultMap输出

    public User findUserByIdResultMap(int id) throws Exception;

}   

 

  在最后的结果中可以看出,打印出的user中只有idusername是有值的,其他都是null,因为我们在sql中只要了这两个属性,所以是正常的。

  

以上是关于MyBatis总结之输入和输出映射的主要内容,如果未能解决你的问题,请参考以下文章

框架学习系列 mybatis 第十二篇 mapper映射文件之输出映射

MyBatis学习总结——MyBatis核心配置文件与输入输出映射

MyBatis零散的总结

mybatis入门基础----输入映射和输出映射

靖烜小哥哥之mybatis总结

Mybatis输入映射和输出映射