Mybatis基础学习之使用ResultMap解决字段名不一致

前言

小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。

这个Mybatis基础学习系列是用来记录我学习Mybatis框架基础知识的全过程 (这个系列是参照B站狂神的Mybatis最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)


之后我将尽量以一天一更的速度更新这个系列,还没有学习Mybatis3框架的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。最后,希望能够和大家一同进步吧!加油吧!少年们!

特别提醒:如果对Mybatis基础学习系列感兴趣,可以阅读本系列往期博客:
第一篇Mybatis基础学习之初识Mybatis
第二篇Mybatis基础学习之第一个Mybatis程序
第三篇Mybatis基础学习之CRUD增删改查
第四篇Mybatis基础学习之万能的Map和模糊查询
第五篇Mybatis基础学习之配置解析(上篇)
第六篇Mybatis基础学习之配置解析(下篇)


今天我们来到了Mybatis基础学习的第六站:使用ResultMap解决字段名不一致。废话不多说,让我们开始今天的学习内容吧。

6.使用ResultMap解决字段名不一致

为了模拟数据库和实体类的字段名不一致,我们这里需要把实体类中的某一个字段修改一下

6.1 设置字段名不一致

6.1.1 数据库中的字段名

在这里插入图片描述

6.1.2 Java实体类中的属性名

  • 创建新的User实体类,修改其属性名,与数据库字段名不一致
// 实体类
public class User {
    
    private int id;
    private String name;
    
    // 将字段名pwd修改为password
    private String password;
    
    public User() {
    }
    
    public User(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }
    
    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 String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
    
}

6.2 编写Mybatis核心配置文件

6.2.1 编写pom.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>Mybatis-Study</artifactId>
        <groupId>com.kuang</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>mybatis-03</artifactId>
    
    <!-- 导入依赖 -->
    <dependencies>
        <!-- mysql数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!-- mybatis框架资源依赖 -->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!-- junit单元测试资源依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    
    <!-- 在build中配置resources,来防止我们资源导出失败的问题 -->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
    
</project>

6.2.2 编写 db.properties 配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
pwd=123456

6.2.3 编写 mybatis-config.xml 配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration: 核心配置文件 -->
<configuration>
    
    <!-- 引入外部配置文件(优先使用外部配置文件) -->
    <properties resource="db.properties"></properties>
    
     <!-- 通过给包起别名 -->
    <typeAliases>
        <package name="com.kuang.pojo"/>
    </typeAliases>  
    
    <environments default="development">
        <!-- 设置环境 -->
        <environment id="development">
            <!-- transactionManager: 表示事务管理器(MyBatis的默认管理器是JDBC) -->
            <transactionManager type="JDBC"/>
            <!-- dataSource: 表示数据源, 主要作用: 连接数据库 (MyBatis的默认数据源类型是POOLED,也就是有池的连接) -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 每一个Mapper.xml都需要再Mybatis核心配置文件中注册 -->
    <mappers>
        <mapper resource="com/kuang/dao/UserMapper.xml"/>
    </mappers>
    
</configuration>

6.3 编写MybatisUtils工具类和UserMapper接口

6.3.1 编写MybatisUtils工具类

// sqlSessionFactory --> sqlSession
public class MybatisUtils {
    
    private static SqlSessionFactory sqlSessionFactory;
    // 静态方法体
    static {
        try {
            // 获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
   /**
    * SqlSession 提供了在数据库执行 SQL 命令所需的所有方法
    */
   public static SqlSession getSqlSession() {
       return sqlSessionFactory.openSession();
   }
}

6.3.2 编写UserMapper接口

public interface UserMapper {
    
    // 通过Id查询指定用户信息
    User getUserById(int id);
    
}

6.3.3 编写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.kuang.dao.UserMapper">
    
    <!-- 通过id查询指定用户信息 -->
    <select id="getUserById"  resultType="User">
        select * from mybatis.user where id = #{id}
    </select>
    
</mapper>

6.4 编写 UserMapperTest 测试类

6.4.1 单元方法测试

public class UserMapperTest {
    
    @Test
    public void test(){
        // 获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        // 使用getMapper方法来获取接口对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 调用getUserById方法,查询所有用户
        User user = userMapper.getUserById(1);
        System.out.println(user);
        // 关闭sqlSession
        sqlSession.close();
    }
    
}

6.4.2 测试结果

在这里插入图片描述

结果出现了password为空的问题

6.5 解决password为空问题

6.5.1 使用起别名方式解决

1. 原因分析与解决思路

1-2 原因分析
-- 原本的SQL查询语句
select * from mybatis.user where id = #{id}
-- 自动使用了使用了类型处理器,将*转换为id,name和pwd
select id,name,pwd from mybatis.user where id = #{id}

我们可以发现,此时person类中的pwd属性已经修改为password,但查询的却还是pwd,因此造成了password为空的情况

1-2 解决思路
  • pwd起别名为password,这种方式最为简单暴力,易于理解
select id,name,pwd as password from mybatis.user where id = #{id}

2.修改UserMapper配置文件

<?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.kuang.dao.UserMapper">
    
    <!-- 通过id查询指定用户信息 -->
    <select id="getUserById"  resultType="com.kuang.pojo.User">
        select id,name,pwd as password from mybatis.user where id = #{id}
    </select>
    
</mapper>

3. 测试结果

在这里插入图片描述

结果查询结果中password值不为空了!

6.5.2 使用resultMap结果集决

1. resultMap基本概念

resultMap:表示结果集映射

  • resultMap 元素:是MyBatis 中最重要最强大的元素
  • ResultMap的设计思想:对简单的语句根本不需要配置显式的结果映射(即做到零配置),对于复杂一点的语句,只需要描述语句之间的关系就行了
  • resultMap最优秀的地方在于:虽然你已经对它相当了解了,但是根本不需要显式的用到它们!

多对一多个学生对应一个老师

在这里插入图片描述

复杂结果映射

在这里插入图片描述

2. 原因分析和解决思

2-1 原因分析
  • 数据库字段名id name pwd

  • Java实体类属性id name password

    可以发现,这是由于 数据库字段名与Java实体类中的属性名不一致造成的!

2-2 解决思路

使用resultMap(结果集映射)将数据库中的字段pwd转换为Java实体类中的password属性

3. 修改UserMapper配置文件

<?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.kuang.dao.UserMapper">
    
    <!-- 使用结果集映射: id对应select标签中的resultMap的值, type对应Java实体类 -->
    <resultMap id="UserMap" type="User">
        <!-- column: 数据库中的字段名, property: Java实体类中的属性名, 只需要显式定义不一致的字段和属性即可 -->
        <!-- <result column="id" property="id"/>
             <result column="name" property="name"/> -->
        <result column="pwd" property="password"/>
    </resultMap>
    
    <!-- Select查询: 查询指定用户 -->
    <select id="getUserById"  resultMap="UserMap">
        select * from mybatis.user where id = #{id}
    </select>
    
</mapper>

4. 测试结果

在这里插入图片描述

结果查询结果中password值也不为空了!


好了,今天的有关 使用ResultMap解决字段名不一致 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!


参考视频链接:https://www.bilibili.com/video/BV1NE411Q7Nx?spm_id_from=333.999.0.0(【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂)

  • 2
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页
评论

打赏作者

狂奔の蜗牛rz

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值