从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

    • Redis

    • Mybatis

      • Mybatis介绍
      • Mybatis入门案例
      • Mybatis入门案例-注解
      • Mybatis入门案例-实现类
      • Mybatis内部执行原理概述
      • 实现一个微型的Mybatis-配置文件版
      • 实现一个微型的Mybatis-注解版
      • Mybatis实现CRUD
      • Mybatis中传递对象参数
      • Mybatis中的列名和属性名的映射
        • Java类属性和数据库表之间的映射
        • 改造User类
        • 改造测试类
        • 修改IUserDao.xml
        • 查询所有的问题
        • 解决方法1:起别名
        • 解决方法2:配置列名和Java属性的映射关系
        • 源码
      • Mybatis实现DAO层的开发
      • Mybatis实现类的执行过程-查询方法
      • properties标签的使用及细节
      • typeAliases标签和package标签
      • Mybatis连接池和事务
      • Mybatis与JNDI
      • Mybatis中的动态SQL
      • Mybatis多表查询
      • Mybatis中的多对多查询
      • Mybatis的延迟加载
      • Mybatis的缓存
      • Mybatis的注解开发-CRUD
      • Mybatis的注解开发-多表查询
      • Mybatis
    • Lucene

    • Elasticsearch

    • MQ

    • MyCat

    • Lombok

    • 主流框架
  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • Java
  • 主流框架
  • Mybatis
2023-04-25
目录

Mybatis中的列名和属性名的映射

# 90.Mybatis中的列名和属性名的映射

Mybatis的查询结果,可以是基本类型,也可以是对象类型,并且我们之前都演示过了;还可以是POJO列表   ‍

# Java类属性和数据库表之间的映射

之前我们使用User类来存储数据库返回的数据,这要求类的属性名,和数据库列名一致,例如User有个成员变量是address,数据库表中,列名也是address;

如果两者不一致,还能映射吗?答案是可以的,只不过要做一些配置。

‍

# 改造User类

我们将User类的成员变量前,都加上user,使其与数据库列名不一致

public class User implements Serializable {
    private Integer userId;
    private String userName;
    private Date userBirthday;
    private String userSex;
    private String userAddress;
}
1
2
3
4
5
6
7

这里请读者重新生成getter 和 setter

‍

# 改造测试类

由于getter 和 setter 名字都改变了,测试类里调用的方法也得改名。例如testSave方法:

@Test
public void testSave() throws IOException {
    User user = new User();
    user.setUserName("mybatis saveuser");
    user.setUserAddress("广州市番禺区");
    user.setUserSex("男");
    user.setUserBirthday(new Date());

    System.out.println("保存操作之前:: " + user);
    userDao.saveUser(user);
    System.out.println("保存操作之前:: " + user);
    session.commit();
}
1
2
3
4
5
6
7
8
9
10
11
12
13

‍

‍

# 修改IUserDao.xml

由于我们改了列名,配置文件中涉及到列名的也需要改,例如insert标签:

<insert id="saveUser" parameterType="com.peterjxl.domain.User">
    <selectKey keyProperty="userId" keyColumn="id" order="AFTER" resultType="int">
        select last_insert_id();
    </selectKey>
    insert into user(username, address, sex, birthday) values (#{userName}, #{userAddress}, #{userSex}, #{userBirthday})
</insert>
1
2
3
4
5
6

‍

‍

# 查询所有的问题

我们测试查询所有:

@Test
public void helloMybatis() throws Exception{
    // 5. 使用代理对象执行方法
    List<User> users = userDao.findAll();
    for(User user : users){
        System.out.println(user);
    }
}
1
2
3
4
5
6
7
8

‍

‍

可以看到只能userName能正常设置参数,而数据库列名里明明是username,有一个字母 n 大小写不同,为什么还能正常获取值呢?这是因为Windows下,MySQL是不区分大小写的,所以才能正常封装。

​​

‍

‍

# 解决方法1:起别名

那如何才能让Java类的属性,和数据库列名保持一致呢?最简单的方式:起别名

<!-- 配置查询所有用户,id要写方法名称-->
    <select id="findAll" resultType="com.peterjxl.domain.User">
        select
            id as userId,
            username as userName,
            address as userAddress,
            sex as userSex,
            birthday as userBirthday
        from user
    </select>
1
2
3
4
5
6
7
8
9
10

​

再次测试查询所有,可以看到能正常设置对象的属性了:

‍

这种方式的效率也是很高的,因为是在SQL语句的层面上解决;

​

# 解决方法2:配置列名和Java属性的映射关系

我们可以在配置文件中,新增一个resultMap标签作为映射关心。

resultMap的属性id​是唯一标识,我们这里起名叫userMap;type表明查询的对应的实体类是哪个,写全类名;

<resultMap id="userMap" type="com.peterjxl.domain.User">
    <!-- 主键字段的对应 -->
    <id property="userId" column="id" />
    <!-- 非主键字段的对应 -->
    <result property="userName" column="userName"/>
    <result property="userAddress" column="address"/>
    <result property="userSex" column="sex"/>
    <result property="userBirthday" column="birthday"/>
</resultMap>
1
2
3
4
5
6
7
8
9

然后第一个配置的是主键字段的映射;然后是其他字段的映射,property​表示Java类中的列名

注意,property​属性对应的就是Java中的属性名的,而Java是区分大小写,所以别写错了

‍

‍

然后我们在select标签里,就不再使用resultType属性了,而是resultMap;并且也不用再写别名了

<select id="findAll" resultMap="userMap">
    select * from user
</select>
1
2
3

再次运行测试方法,可以看到能正常执行了。

​​

‍

‍

由于该种方式,少不了再解析一次XML,因此效率比方法1低一点,但是开发效率高了。并且使用这种方式,我们只需改造select等标签的resultMap属性,改动较小;而使用别名的方式,改动较大。

各有利弊,按需选择

‍

‍

# 源码

所有代码已上传到了GitHub (opens new window)和Gitee (opens new window)上,并且创建了分支demo9,读者可以通过切换分支来查看本文的示例代码。

在GitHub上编辑此页 (opens new window)
上次更新: 2023/5/16 10:04:12
Mybatis中传递对象参数
Mybatis实现DAO层的开发

← Mybatis中传递对象参数 Mybatis实现DAO层的开发→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式