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

大纲

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

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

Mapper接口新增的方法是

java 复制代码
    long updateElems(AllType item);

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

java 复制代码
public class AllType {
......
    private int info_int;

    private byte info_tint;

    private short info_sint;
}
bash 复制代码
create table all_type(
        info_int int(10) comment 'int',
        info_tint tinyint comment 'tinyint',
        info_sint smallint comment 'smallint',
......
}

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

java 复制代码
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中绑定。

xml 复制代码
    <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接口中我们新增如下代码

java 复制代码
    AllTypeRename findRenameOne(int intInfo);

测试代码

java 复制代码
    @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。

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

xml 复制代码
    <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中新增了别名

xml 复制代码
    <typeAliases>
        <typeAlias type="org.example.model.AllTypeRename" alias="AllTypeRename"/>
    </typeAliases>

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

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

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

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

Mapper接口中新增

java 复制代码
    AllTypeRename findRenameOne(int intInfo);

就可以访问数据库了

测试代码

java 复制代码
    @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

参考资料

相关推荐
桦说编程1 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅3 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者4 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺4 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
倔强的石头_4 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
Derek_Smart5 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP6 小时前
MyBatis-mybatis入门与增删改查
java
孟陬10 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌10 小时前
一站式了解四种限流算法
java·后端·go