栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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配置文件


    
        Mybatis-Study
        com.kuang
        1.0-SNAPSHOT
    
    4.0.0
    mybatis-03
    
    
    
        
        
            mysql
            mysql-connector-java
            5.1.47
        
        
        
        
            org.mybatis
            mybatis
            3.5.2
        
        
        
            junit
            junit
            4.12
        
    
    
    
    
        
            
                src/main/resources
                
                    ***.xml
                
                false
            
            
                src/main/java
                
                    ***.xml
                
                false
            
        
    
    

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 配置文件




    
    
    
    
     
    
        
      
    
    
        
        
            
            
            
            
                
                
                
                
            
        
    
    
    
    
        
    
    

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();
        }
    }
    
   
   public static SqlSession getSqlSession() {
       return sqlSessionFactory.openSession();
   }
}
6.3.2 编写UserMapper接口
public interface UserMapper {
    
    // 通过Id查询指定用户信息
    User getUserById(int id);
    
}
6.3.3 编写UserMapper.xml配置文件

        

    
    
    
        select * from mybatis.user where id = #{id}
    
    

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配置文件

        

    
    
    
        select id,name,pwd as password from mybatis.user where id = #{id}
    
    

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配置文件