Mybatis学习日记-day4-ResultMap

一、学习目标

        在之前的学习博客里对数据进行增删改查的操作,都是基于数据库表的列名Java对象的属性名一致的情况下,但是,这个世界并不是这么美好。

        当数据库表的列名与Java对象的属性名不一致,或者数据类型需要特殊处理;此外,如果数据库中的某个列是枚举类型,并且需要将这个列的值映射到Java的枚举类型;,如果查询结果需要映射到一个包含多个属性、嵌套对象或集合的复杂Java对象中。这些情况就需要使用结果映射来定义它们之间的对应关系。

二、ResultMap

        在mybatis官方文档中提到,resultmap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。由此可见,resultmap在mybatis学习中的重要性。

        在官方文档中提到,ResultMap 的设计思想是:对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

        以之前的博客为例,数据库中的users表,与实体类user对应,其中列名与name,age等属性的命名也是一致的,然而如果出现列名与java实体类的属性名不一致的情况呢?        

        在之前的博客的情况下,我们进行一些改动

        数据库的设计

        

        实体类:

        

public class User {
    private int id;
    private String name;
    private int uage;

    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.uage = age;
    }

    public int getUid() {
        return id;
    }

    public void setUid(int uid) {
        this.id = uid;
    }

    public String getUname() {
        return name;
    }

    public void setUname(String uname) {
        this.name = uname;
    }

    public int getUage() {
        return uage;
    }
    public void setUage(int uage) {
        this.uage = uage;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + uage +
                '}';
    }
}

1.为列名指定别名 , 别名和java实体类的属性名一致 

   例子中,age为列名,uage为别名和实体类的属性名

<select id="selectUser" resultType="User">
    select id , name , age as uage from users where id = #{id}
</select>

2.使用结果集映射->ResultMap 

<resultMap id="UserMap" type="User">
        <id column="age" property="uage"/>
</resultMap>
<select id="selectUser" resultMap="UserMap">
        select * from users
 </select>

        

        其中,column是数据库表的列名 , property是对应实体类的属性名

        但是,在mybatis官方文档也提到,MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样。 如果能有一种数据库映射模式,完美适配所有的应用程序,那就太好了,但可惜也没有。 而 ResultMap 就是 MyBatis 对这个问题的答案。

3.测试

@Test
    public void selectUser() {
        
        // 通过MybatisUtils工具类获取SqlSession对象,SqlSession是MyBatis的核心接口,用于执行SQL语句
        SqlSession session = MybatisUtils.getSession();
        // 通过SqlSession的getMapper方法获取UserMapper接口的代理对象,该对象用于执行与User表相关的数据库操作
        UserMapper mapper = session.getMapper(UserMapper.class);
        // 调用UserMapper接口的selectUser方法,该方法应该返回User对象的列表
        List<User> users = mapper.selectUser();
        // 遍历返回的User对象列表
        for (User user : users) {
            // 打印每个User对象的信息到控制台
            System.out.println(user);
        }
        // 关闭SqlSession,释放数据库连接资源
        session.close();
    }

(预先写入了的数据)

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值