MyBatis的XML文件(三)--结果集(ResultMap)--简单

本文深入探讨MyBatis框架中的ResultMap元素,它是MyBatis最强大且重要的功能之一,能够极大简化从数据库结果集中抽取数据的过程,并支持复杂的映射场景。文章详细介绍了如何通过ResultMap将查询结果映射到JavaBean或POJO,包括直接映射、使用别名以及处理列名不匹配的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Result Maps

  ResultMap元素是MyBatis中最重要最强大的元素,它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那个东西,而且在一些情形下允许你做一些JDBC不支持的事情,事实上,编写相似于负载语句联合映射这些等同的代码,也许可以跨过上千行的代码,ResultMap 的设计 就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
  你已经看到简单映射语句的示例了,但没有明确的resultMap 比如:

    <select id = "selectUsers" resultType="map">
        SELECT id, username,hashedPassword
        FROM some_table
        WHERE id = #{id}
    </select>

  这样一个语句简单作用于所有列被自动映射到HashMap的键上,这由resultType 属性指定,这在很多情况下是有用的,但是HashMap 不能很好描述一个领域模型,那样你的应用程序将会使用JavaBeansPOJOS(Plain Old Java Objects,普通Java对象)来作用领域模型,MyBatis对两者都支持,看看下面这个JavaBean:

    package com.someapp.model;
    public class User {
        private int id;
        private String username;
        private String hashedPassword;

        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getHashedPassword() {
            return hashedPassword;
        }
        public void setHashedPassword(String hashedPassword) {
            this.hashedPassword = hashedPassword;
        }
    }

  基于JavaBean的规范,上面这个类有3个属性:id,username和hashPassword,这些在select语句中会精确匹配到列名。
  这样的一个JavaBean可以被映射到结果集,就像映射到HashMapy一行简单。

    <select id = "selectUsers" resultType = "com.someapp.model.User>
        SELECT id,username,hashedPassword
        FROM some_table
        WHERE id = #{id}
    </select>

要记住类型别名是你的伙伴,使用它们你可以不用输入类的全路径。比如:

    <!-- In mybatis-config.xml file -->
    <typeAlias type="com.someapp.model.User" alias="User"/>
    <!-- In SQL Mapping XML file -->
    <select id="selectUsers" resultType="User">
        select id, username, hashedPassword
        from some_table
        where id = #{id}
    </select>

这些情况下,MyBatis会在幕后自动创建一个ResultMap 基于属性名来映射列到javaBean的属性上,如果列名没有精确匹配,你可以在列名上使用select字句的别名(一个基本的SQL特性)来匹配标签。比如:

    <select id = "selectUsers" resultType = "User">
        SELECT 
            user_id as "id",
            user_name as "username",
            hashed_password as "hashedPassword"
        FROM some_table
        WHERE id = #{id}
    </select>

  ResultMap最优秀的地方你已经了解了很多,但是你还没有真正的看到一个,这些简单的示例不需要比你看到的更多东西,只是出于示例的原因,让我们来看看最后一个示例中外部的resultMap 是什么样子的,这也是解决列名不匹配的另外一种方式。

    <resultMap id = "userResultMap" type = "User">
        <id property = "id" column = "user_id"/>
        <result property = "username" cloumn = "user_name" />
        <result propety = "password" cloumn = "password" />
    </resultMap>

  引用它的语句使用resultMap 属性就行了(注意我们去掉了resultType属性)。比如:

    <select id = "selectUsers" resultMap = "userResultMap">
        SELECT user_id,user_name,hashed_passowrd
        FROM some_table
        WHERE id = #{id}
    </select>

如果世界总是这么简单就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦修的木鱼

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值