Mybatis之ResultMap

Mybatis之ResultMap

实体类

  • 通常实体类中的属性要和数据库表中的字段一致,包括类型,字段名称
  • 因此我们在单表查询的时候不需要使用<resultMap>指定实体类和表中的字段对应关系,但是如果我们在查询的时候使用了别名,或者属性字段和表的字段不一致,那么我们就需要用<resultMap>指定对应关系了

准备

  • 创建一个User类
public class User implements Serializable {
    private static final long serialVersionUID = 6716332190979093860L;
    private Integer id;
    private String username;
    private String password;
    private Integer age;
​
    
    public Integer getAge() {
        return age;
    }
​
    public void setAge(Integer age) {
        this.age = age;
    }
​
    public Integer getId() {
        return id;
    }
​
    public void setId(Integer id) {
        this.id = id;
    }
​
    public String getUsername() {
        return username;
    }
​
    public void setUsername(String username) {
        this.username = username;
    }
​
    public String getPassword() {
        return password;
    }
​
    public void setPassword(String password) {
        this.password = password;
    }
    
    
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password="
                + password + ", age=" + age + "]";
    }
    
}
  • 创建user表
    • 表中的字段和User实体类一致
create table user(id int primary key auto_increment,username varchar(20),age int ,password varchar(20));

根据id查询用户信息(使用resultType指定结果类型)

  • 直接在UserMapper.xml中配置<select>即可
    • 使用resultType指定返回的结果类型
 <!-- 
    User findUserById(Integer id);
    resultType: 指定返回的结果类型
  -->
  <select id="findUserById" resultType="cn.tedu.spring.entity.User">
    select username,password,age,id from user where id=#{id}
  </select>
  • 上面的查询返回的结果字段和User实体类中的属性字段一致,因此只需要指定resultType即可对应。但是如果我们查询的语句如下:
 <!-- 
    User findUserById(Integer id);
    resultType: 指定返回的结果类型
  -->
  <select id="findUserById" resultType="cn.tedu.spring.entity.User">
    select username name,password pw,age,id from user where id=#{id}
  </select>
  • 那么此时返回的结果中,User类中的usernamepassword值为null,因为没有对应上,这里使用了别名

使用resultMap解决别名或者字段不对应的问题

  • 如果实体类中的字段和表中的字段一致,但是查询结果中使用了别名,那么需要使用<resultMap>来设置对应关系
  • 如果实体类中的字段和表中的字段不一致,那么返回的查询结果即使不使用别名也会不对应,因此此时还是需要使用<resultMap>来设置对应关系
<!-- 指定resultMap
    type: 指定java类的全名
    id: 唯一标识
  -->
 <resultMap type="cn.tedu.spring.entity.User" id="UserMap">
    <!-- id指定主键的对应关系,这里主键没有使用别名,因此不需要指定对应关系,可以自动对应上
    <id column="id" property="id"/> -->
    
    <!-- result : 指定主键之外的属性
        column: 查询结果中的字段
        property:java类中的对应属性
     -->
    <result column="name" property="username"/>
    <result column="pw" property="password"/>
 </resultMap>
 
 <!-- 
    User findUserById(Integer id);
    resultMap: 指定返回的结果类型为前面定义的resultMap
  -->
  <select id="findUserById" resultMap="UserMap">
    select username name,password pw,age,id from user where id=#{id}
  </select>
​
  • 测试方法
    @Test
    public void testFinduserById() {
        //加载Spring的配置文件
        AbstractApplicationContext ac
            = new ClassPathXmlApplicationContext(
                "spring-mvc.xml",
                "spring-dao.xml");
        
        //获取UserMapper的bean,这个是spring通过扫描mapper.xml文件自动为mybatis自动创建的,首字母小写
        UserMapper userMapper
            = ac.getBean(
                "userMapper", UserMapper.class);
        
        User user=userMapper.findUserById(3);
        System.out.println(user);
        
        ac.close();
    }

使用<resultMap>来解决多表之间的查询

  • 后面的多表关联查询会讲到

总结

  1. 实体类中的属性是和表中的属性一致的,普通的java类或许不相同
  2. 如果查询返回的结果字段和java类中的属性字段一致,那么就不需要使用resultMap,而是能够自动的对应上
  3. 如果返回查询结果字段和java类中的属性字段不一致,那么就需要使用resultMap来设置对应关系了

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java达人

sql server 获取每一个类别中值最大的一条数据

数据如下: name val memo a 2 a2(a的第二个值) a 1 a1--a的第一个值 a 3 a3:a的第三...

18590
来自专栏学习力

《Java从入门到放弃》框架入门篇:hibernate查询——HQL

21370
来自专栏Java大联盟

Java面试手册:数据库 ②

14720
来自专栏杨建荣的学习笔记

MySQL中需要注意的字段长度问题

在MySQL的表结构设计中,突然想起来几个地方碰到的问题比较多,大体来说一个就是字符集,一个就是数据类型。 而字符集和数据类型结合起来,就有一个蛮有意思的细节,...

41760
来自专栏IT可乐

Java设计模式之(一)------单例模式

1、什么是单例模式?   采取一定的办法保证在整个软件系统中,单例模式确保对于某个类只能存在一个实例。有如下三个特点:   ①、单例类只能有一个实例   ②、单...

22670
来自专栏chenssy

【死磕Sharding-jdbc】---重写

核心源码就在sharding-jdbc-core模块的com.dangdang.ddframe.rdb.sharding.rewrite目录下,包含两个文件SQ...

13630
来自专栏码洞

核心技术靠化缘是要不来的——自己动手写ORM框架

开源市场上的Java的ORM框架一个都不好用,所以花了几天时间自己撸了一个 OrmKids,欢迎大家下载学习。遇到问题请关注公众号进群大家一起讨论。

17720
来自专栏技术碎碎念

sql server T-SQL 基础

SQL语言按照用途可以分为如下3类: ①DDL(Data Definition Language)  数据定义语言:    定义修改和删除数据库、表、索引和视图...

29860
来自专栏JavaEdge

为什么java中用枚举实现单例模式会更好代码简洁

代码简洁 这是迄今为止最大的优点,如果你曾经在Java5之前写过单例模式代码,那么你会知道即使是使用双检锁你有时候也会返回不止一个实例对象。虽然这种问题通过...

61740
来自专栏GIS讲堂

数据库 连接(JOIN)

连接运算中有两种最为重要的连接,一种是等值连接(Equijoin),另一种是自然连接(Nature Join):等值连接是从关系R和S中的笛卡尔积中选取A,B属...

22330

扫码关注云+社区

领取腾讯云代金券