MBS6: 数据库与实体类之间的字段映射问题(resultMap标签的使用)

6.1 简介

​ 所谓实体类与数据库之间的映射,其实就是在java中创建一个类,用来存放数据库里的某一张表。但是,如果只是在纯粹的桌面端与web端开发中,没有使用到框架的化,其实字段与属性之间的映射要求并没有那么严格。但是,使用MyBatis框架之后,对于字段与属性之间的关系,是十分严格的。

6.2 例子

数据库:User表字段:

字段类型
idint
namevarchar
genderint

User实体类:

package com.yun.pojo;

import org.apache.ibatis.type.Alias;


public class User {
    private int id;
    private String name;
    private int sex;

    public User() {
    }

    public User(int id, String name, int sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex=" + sex +
                '}';
    }
}

提示: 这里可以明显地发现,实体类并没有与数据库进行良好地映射,数据库中的 gender 字段,在实体类中,却并没有使用同样的名字进行定义,而是使用了 sex 属性。

当我们编写好接口与mapper文件时,在测试类中,我们会发现,不能得到正确的值。

测试结果:

在这里插入图片描述

提示: 数据库中gender的候选值有1与2,但是,最后的查询结果并没有出现相应的性别结果。

6.3 原理

<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.yun.dao.UserMapper" >
        <select id="getUserList" resultType="User">
            select * from user
      </select>
    </mapper>

提示: 上述语句中,主要是查询出数据库中的所有用户的所有信息。

二者之间的映射: select * from user 语句,本质是 select id,name,gender from user语句。因此,在MyBatis实现数据库与实体类之间的映射时,MyBatis会去实体类中寻找gender属性的 setGender()与getGender() 方法。但是,由于属性名改变了,相应的属性Getter()与Setter()也发生了改变,所以,Mybaits得到了数据库的值,但是没有映射到实体类中。

解决方法:

  • select 语句更改为:select id,name,gender as sex from user。
  • 更改实体类中的Setter()与Getter()方法名,将setSex()更改为setGender(),getSex()更改为getGender(),但是这样不符合实体类的使用。
  • 使用Map接口做resultMap映射。

6.4 ResultMap映射

6.4.1 简介

​ 当实体类与数据库存在部分字段无法正确映射时,可以使用ResultMap作为中间组件,将数据库的字段映射给实体类

6.4.2 使用

UserMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.yun.dao.UserMapper" >
        <resultMap id="userResultMap" type="user">
            <result column="gender" property="sex"/>
        </resultMap>

        <select id="getUserList" resultMap="userResultMap">
            select * from user
      </select>
    </mapper>

提示: 在mapper标签下,使用resultMap标签,将需要转映射的字段定义在下面。column 对应的是sql语句的结果字段,property 对应的是实体类中的属性。而就集合来讲,colunmn等于key,property等于values。在 select 标签中,resultType需要更改为resultMap

执行结果:


写在最后,resultMap并不仅限于此,还有更高级的用法,可以查询官方文档。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值