前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0基础学习Mybatis系列数据库操作框架——字段映射

0基础学习Mybatis系列数据库操作框架——字段映射

作者头像
方亮
发布2024-05-24 19:30:55
1000
发布2024-05-24 19:30:55
举报
文章被收录于专栏:方亮
大纲

  • AS绑定法
    • 测试代码
  • resultMap法
    • 测试代码
  • 参考资料

《0基础学习Mybatis系列数据库操作框架——增删改操作》的更新操作中,我们定义的SQL Mapper是

代码语言:javascript
复制
<update id="updateElems">
    update all_type set info_tint = #{info_tint}, info_sint = #{info_sint} where info_int &gt; #{info_int}
</update>

Mapper接口新增的方法是

代码语言:javascript
复制
    long updateElems(AllType item);

可以看到SQL Mapper自动将info_tint映射到AllType.info_tint。这种映射成功的前提是AllType定义的字段名和表中列名一致:

代码语言:javascript
复制
public class AllType {
……
    private int info_int;

    private byte info_tint;

    private short info_sint;
}
代码语言:javascript
复制
create table all_type(
        info_int int(10) comment 'int',
        info_tint tinyint comment 'tinyint',
        info_sint smallint comment 'smallint',
……
}

但是不同语言的编程规范不同,导致表中字段名和编程语言中的字段名无法一致。比如我们希望通过下面这个类来表达表中数据。

代码语言:javascript
复制
package org.example.model;

public class AllTypeRename {
    public int getIntInfo() {
        return intInfo;
    }

    public void setIntInfo(int intInfo) {
        this.intInfo = intInfo;
    }

    public byte getByteInfo() {
        return byteInfo;
    }

    public void setByteInfo(byte byteInfo) {
        this.byteInfo = byteInfo;
    }

    public short getShortInfo() {
        return shortInfo;
    }

    public void setShortInfo(short shortInfo) {
        this.shortInfo = shortInfo;
    }

    private int intInfo;
    private byte byteInfo;
    private short shortInfo;
}

intInfo对应表中的info_int;byteInfo对应info_tint;shortInfo对应info_sint。

我们如何将这样的映射关系告诉Mybatis呢?

AS绑定法

一种简单的办法就是在SQL中绑定。

代码语言:javascript
复制
    <select id="findRenameOne" resultType="AllTypeRename">
        select
            info_int as "intInfo",
            info_tint as "byteInfo",
            info_sint as "shortInfo"
        from all_type where info_int = #{intInfo}
    </select>

SQL的select部分,as关键字前是表中列名,后面是Java类AllTypeRename的字段名

Mapper接口中我们新增如下代码

代码语言:javascript
复制
    AllTypeRename findRenameOne(int intInfo);

测试代码

代码语言:javascript
复制
    @Test
    void testRenameOne() {
        InputStream in = null;
        try {
            in = Resources.getResourceAsStream("mybatis/config/mybatis-config-rename.xml");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        SqlSessionFactory sqlSFLocal = new SqlSessionFactoryBuilder().build(in);
        try (SqlSession s = sqlSFLocal.openSession()) {
            AllTypeMapper all_type_mapper = s.getMapper(AllTypeMapper.class);
            AllTypeRename a = all_type_mapper.findRenameOne(1);
            if (a != null) {
                System.out.println(a.getShortInfo());
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

resultMap法

AS方法虽然很直接明确,但是存在几个问题:

  • 多个SQL需要配多次映射关系。
  • 不能解决通配符的问题。比如Select * from table。

为了解决这类问题,可以使用本节介绍的方法。

代码语言:javascript
复制
    <resultMap id="allTypeRenameResultMap" type="AllTypeRename">
        <result property="intInfo" column="info_int"/>
        <result property="byteInfo" column="info_tint"/>
        <result property="shortInfo" column="info_sint"/>
    </resultMap>

resultMap的type字段是需要映射的类名AllTypeRename,这儿我们使用了简称,因为我们在Mybatis的Config中新增了别名

代码语言:javascript
复制
    <typeAliases>
        <typeAlias type="org.example.model.AllTypeRename" alias="AllTypeRename"/>
    </typeAliases>

result 的property是类的成员变量名;column是表中列名。

这样我们配置SQL Mapper时只要如下书写即可。

代码语言:javascript
复制
    <select id="findRenameList" resultMap="allTypeRenameResultMap">
        select * from all_type where info_int != #{intInfo}
    </select>

需要注意的是,此时select要使用resultMap属性,而不是之前的resultType。

Mapper接口中新增

代码语言:javascript
复制
    AllTypeRename findRenameOne(int intInfo);

就可以访问数据库了

测试代码

代码语言:javascript
复制
    @Test
    void testRenameList() {
        InputStream in = null;
        try {
            in = Resources.getResourceAsStream("mybatis/config/mybatis-config-rename.xml");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        SqlSessionFactory sqlSFLocal = new SqlSessionFactoryBuilder().build(in);
        try (SqlSession s = sqlSFLocal.openSession()) {
            AllTypeMapper all_type_mapper = s.getMapper(AllTypeMapper.class);
            List<AllTypeRename> all = null;
            all = all_type_mapper.findRenameList(1);
            for (AllTypeRename a : Objects.requireNonNull(all)) {
                System.out.println(a.getShortInfo());
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

代码样例见:https://github.com/f304646673/mybatis_demo.git

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大纲
  • AS绑定法
    • 测试代码
    • resultMap法
      • 测试代码
      • 参考资料
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档