(七)mybatis 的输入映射与输出映射


目录


前言

通过 paramterType 指定输入参数类型,类型可以是 简单类型pojohashmap ,这里只讲究相对较难的 pojo ;


输入映射 — — 传递 pojo 包装类型 (复杂查询 )

需求 :完成用户信息的综合查询,需要 传入查询条件(可能包括用户信息、其他信息,比如:商品信息、订单信息) ;

例子:查询所有买了 i7-4710 cpu 电脑的用户信息 ;

针对上面需求,建议使用自定义的 包装类型 pojo ,在包装类型的 pojo 中将复杂的 查询条件 包装起来 ;将需要查询的条件,作为包装类型的属性,封装进去 ;


后面学到逆向工程的时候,我们就不再需要手写 User 这样的类,直接使用工具根据数据库的字段,自动生成 ;

假如,生成的类,我们需要做一些改动,我们推荐写一个增强类继承生成的类,在增强类中改动 ;

事例代码

public class UserStrengthen extends User {
    //.... 要增强的内容

}

说明:其实复杂查询,也很好理解,就是当查询条件比较复杂的时候,我们需要对其进行封装,这里我们将复杂条件封装到 UserQueryVo 中 ,需要对该类,设置 get 、set 方法,为了mybatis 使用反射获取其属性 ;

UserQueryVo 类 :

/**
 *  封装复杂查询条件
 * @author An
 */
public class UserQueryVo {


    /**
     * 封装用户条件
     */
    private UserStrengthen userStrengthen ;

    public UserStrengthen getUserStrengthen() {
        return userStrengthen;
    }

    public void setUserStrengthen(UserStrengthen userStrengthen) {
        this.userStrengthen = userStrengthen;
    }

    //.... 封装其他条件,比如商品订单
}

在映射文件中,写出 sql 语句,参数类型就是我们封装的 UserQueryVo 类 ;

   <!--复杂查询-->
    <select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen">
        SELECT * from user where sex = #{userStrengthen.sex} and  name like '%${userStrengthen.name}%'
    </select>

mapper 代理接口中,构建出方法:

/**
     * 复杂查询
     * @param userQueryVo
     * @return
     * @throws Exception
     */
    public List<UserStrengthen> findUsersByVo(UserQueryVo userQueryVo)  throws Exception ;



输出映射 — — resultType

输出映射可以,可以输出 简单类型pojo 对象pojo 列表hashmap

其中输出 pojo 对象 可改为输出 hashmap,其中字段名是 key ,名字值是 value ;输出 pojo 列表 可改为输出 List<HashMap> ;

说明:在使用 resultType 进行输出映射的时候,只要查询出来的列名pojo 对象的属性名一致的时候,该列结果才会得到映射; 如果查询结果的列,没有一列 得到映射,则不会创建 pojo 对象,但是 只要有一列 得到映射,就会创建 pojo 对象


输出映射 — — resultMap

mybatis 中完成高级输出结果映射的东西,完成 一对多、多对多、多对一 ;(以后会讲)

简单的使用场景

如果查询出来的列名pojo 对象的属性名不一致,那么可以通过定义一个 resultMap 对列名和属性名之间,进行映射 ;

  1. 在映射关系中定义 resultMap

    <!--定义一个 resultMap-->
    <!--
        id 是 resultMap 的唯一标识 ;
        type 是 resultMap 最终要将查询的列名和谁进行映射的类
    -->
    <resultMap id="userMap" type="user">
        <!--对 结果集中的唯一标识,例如主键,使用 id标签 进行映射-->
        <id column="id_" property="id"></id>
        <!--其他属性使用 result 进行映射-->
        <result column="sex_" property="sex"></result>
    </resultMap>
  2. 使用 resultMap 作为 statement 的输出映射类型 ;

    <!--如果 map 定义在其他映射关系文件中,则需要加上命名空间-->
    <select id="findUserByMap" parameterType="int" resultMap="userMap">
        SELECT id id_,sex sex_ from user where id = #{id}
    </select>
  3. mapper 接口中,定义方法,方法的返回值,是 **resultMap 中的 type 类型 ;

    public User findUserByMap(int id) throws Exception ;
原文地址:https://www.cnblogs.com/young-youth/p/11665678.html