mybatis学习之路----输出映射之resultType resultMap

来源:互联网 发布:淘宝文玩核桃 编辑:程序博客网 时间:2024/05/16 01:47

点滴记载,点滴进步,愿自己更上一层楼。


注:项目是在 mybatis学习之路----insert主键返回 selectKey使用 的基础上进行的。


mybatis的映射文件中,在写select的时候会有输出映射结果集属性   resultType 或者resultMap两种,当然这两种也最常用。

首先说说 resultType   

resultType   可以接收基本类型,包装类型的结果集映射。但是当是包装类型的时候就有要求了,必须包装类型中的属性值跟查询结果的字段对应的上,否则的话对应不上的属性是接收不到查询结果的。

例如:

数据库customer表字段为  id c_name c_sex c_ceroNo c_ceroType c_age这些。当想要通过主键来查询信息的时候,使用了一个model但是model中的属性跟这些字段不完全对应,

例如,customer  model的属性:id   name age sex ceroNo ceroType,跟表中的统一导游c_的形式不一样。这样即使查询有结果,mybatis也没发将数据绑定到model中。

下面进行演示:

customer.xml    Customer.java

    <!-- resultType 输出映射为 com.soft.mybatis.model.Customer,由于属性跟表数据对应不上,                    导致部分数据绑定不到model中去 -->    <select id="findById" parameterType="string" resultType="com.soft.mybatis.model.Customer">        select * from t_customer where id=#{id}    </select>
package com.soft.mybatis.model;/** * Created by xuweiwei on 2017/9/10. */public class Customer {    private String id;    private String name;    private Integer age;    private Integer sex;    private String ceroNo;    private Integer ceroType;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public Integer getSex() {        return sex;    }    public void setSex(Integer sex) {        this.sex = sex;    }    public String getCeroNo() {        return ceroNo;    }    public void setCeroNo(String ceroNo) {        this.ceroNo = ceroNo;    }    public Integer getCeroType() {        return ceroType;    }    public void setCeroType(Integer ceroType) {        this.ceroType = ceroType;    }    @Override    public String toString() {        return "Customer{" +                "id='" + id + '\'' +                ", name='" + name + '\'' +                ", age=" + age +                ", sex=" + sex +                ", ceroNo='" + ceroNo + '\'' +                ", ceroType='" + ceroType + '\'' +                '}';    }}
CustomerDao

    Customer findById(String id);
CustomerDaoImpl
    public Customer findById(String id) {        Customer user = null;        SqlSession sqlSession = null;        try {            sqlSession = SqlsessionUtil.getSqlSession();            user = sqlSession.selectOne("customer.findById", id);        } catch (Exception e) {            e.printStackTrace();        } finally {            SqlsessionUtil.closeSession(sqlSession);        }        return user;    }
测试

CustomerDaoImplTest

    @Test    public void findById() throws Exception {        Customer result = customerDao.findById("9e77c26b-95f7-11e7-b376-a45d36688239");        System.out.println("查询结果 : "+result);    }

数据库数据



如上面测试结果,resultType输出结果映射仅仅id属性映射成功了。其他的都为null。就是因为属性跟数据库字段对应不上。

怎么样才能让查询结果集映射到model中呢?这时候resultMap就出现了。

resultMap  需要首先在xml中定义一个  <resultMap></resultMap>节点

    <!-- resultMap 数据结果集映射map,主要作用就是将数据库中的字段跟需要映射的model的属性一一对应,                   这样即使model中的属性跟数据库中的字段不一样,也能映射成功         id  这个resultMap的唯一表示,         type 需要映射的model信息-->    <resultMap id="customerMap" type="com.soft.mybatis.model.Customer">        <!-- id 属性专门用来映射主键信息,其他信息用result节点              column 数据库字段              property model属性 -->        <id column="id" property="id"/>        <!-- result 用来映射非主键信息, column  property 作用跟id标签的一样-->        <result column="c_name" property="name"/>        <result column="c_sex" property="sex"/>        <result column="c_age" property="age"/>        <result column="c_ceroNo" property="ceroNo"/>        <result column="c_ceroType" property="ceroType"/>    </resultMap>


然后查询节点对其进行引用即可,引用它的id属性名。注意下面的这段,已经将resultType换成了resultMap了。

    <!-- 这次用resultmap接收输出结果  -->    <select id="findById2" parameterType="string" resultMap="customerMap">        select * from t_customer where id=#{id}    </select>

然后就是实现与测试,
CustomerDao

    Customer findById2(String id);
CustomerDaoImpl
    public Customer findById2(String id) {        Customer user = null;        SqlSession sqlSession = null;        try {            sqlSession = SqlsessionUtil.getSqlSession();            user = sqlSession.selectOne("customer.findById2", id);        } catch (Exception e) {            e.printStackTrace();        } finally {            SqlsessionUtil.closeSession(sqlSession);        }        return user;    }
CustomerDaoImplTest

    @Test    public void findById2() throws Exception {        Customer result = customerDao.findById2("9e77c26b-95f7-11e7-b376-a45d36688239");        System.out.println("查询结果 : "+result);    }
结果:


可以看出,成功将结果即映射到了customer里面。


由上面可以看出来 resultType  resultMap的区别:

resultMap 仅仅是作用数据库表字段跟model的属性的映射关系而存在,当需要映射的model的属性跟数据库字段不一样的时候使用,

但是如果数据库字段名跟需要映射的moadel的属性名完全一致,resultMap可以不用,resultType足够了。

但是,真正项目中的model的属性跟表字段完全对应的概率很小。

resultType可以映射结果集为基本类型的,resultmap就无能为力了。





阅读全文
0 0