MyBatis 查询数据库返回集合的三种接收方式(附工具类封装)

说明 :本文基于新增 MyBatisUtil 工具类,演示如何通过三种不同方式将数据库查询结果映射为 Java 对象集合。随着项目代码量增加,未修改的文件不再重复贴出。


一、项目核心结构概览

  • ClientMapper.xml:定义 SQL 映射
  • MyBatisUtil.java:封装 SqlSession 获取与关闭
  • mybatis-config.xml:MyBatis 全局配置
  • JunitMybatisUtil.java:JUnit 测试用例
  • 实体类:TblClient.java(属性名如 cid, cname 等,与数据库字段 id, client_name 不一致)

二、三种查询结果映射方式详解

方式一:使用 <resultMap> 手动映射(推荐用于字段不一致或复杂关联)

复制代码
<resultMap type="com.charles.entity.TblClient" id="tblClientID">
    <id property="cid" column="id" />
    <result property="cname" column="client_name"/>
    <result property="caddress" column="client_address"/>
    <result property="cbirthday" column="client_birthday"/>
</resultMap>

<select id="getClientAll" resultMap="tblClientID">
    SELECT * FROM tbl_client
</select>

适用场景

  • 数据库字段名与实体类属性名不一致
  • 需要处理一对一/一对多等复杂关联查询

💡 注意:即使使用 resultMap,MyBatis 默认仍会开启 自动映射(autoMapping) ,级别为 PARTIAL(仅映射未在 resultMap 中显式声明的字段)。若需完全关闭自动映射,可在 <resultMap> 中设置 autoMapping="false"


方式二:使用 resultType + SQL 别名(字段名需手动对齐)

复制代码
<select id="getClientAll" resultType="com.charles.entity.TblClient">
    SELECT 
        id AS cid,
        client_name AS cname,
        client_address AS caddress,
        client_birthday AS cbirthday
    FROM tbl_client
</select>

适用场景

  • 字段数量不多,可通过 SQL 别名对齐
  • 不想写冗长的 resultMap

⚠️ 要求:SQL 查询结果的列别名必须与实体类属性名完全一致(区分大小写)。


方式三:使用 resultType + 类型别名(简化全限定类名)

首先在 mybatis-config.xml 中注册别名:

复制代码
<typeAliases>
    <typeAlias type="com.charles.entity.TblClient" alias="baitang"/>
</typeAliases>

然后在 Mapper 中使用别名:

复制代码
<select id="getClientAll" resultType="baitang">
    SELECT 
        id AS cid,
        client_name AS cname,
        client_address AS caddress,
        client_birthday AS cbirthday
    FROM tbl_client
</select>

优势

  • 减少 XML 中冗长的包路径
  • 提高可读性与维护性

🔔 注意:别名默认不区分大小写,但建议统一使用小写以避免混淆。


三、工具类封装:MyBatisUtil.java

复制代码
package com.charles.util;

import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {
    private static SqlSessionFactory factory = null;

    static {
        try {
            InputStream inputStream = Resources.getResourceAsStream("mybatis/mybatis-config.xml");
            factory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /** 获取 SqlSession(默认不自动提交事务) */
    public static SqlSession getSqlSession() {
        return factory.openSession(false);
    }

    /** 安全关闭 SqlSession */
    public static void closeSqlSession(SqlSession sqlSession) {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

四、单元测试验证:JunitMybatisUtil.java

复制代码
@Test
public void junitUnit() {
    SqlSession session = MyBatisUtil.getSqlSession();
    try {
        List<TblClient> list = session.selectList("com.charles.dao.ClientMapper.getClientAll");
        for (TblClient client : list) {
            System.out.println(client.getCid() + "\t" + 
                               client.getCname() + "\t" + 
                               client.getCaddress() + "\t" + 
                               client.getCbirthday());
        }
    } finally {
        MyBatisUtil.closeSqlSession(session);
    }
}

最佳实践 :使用 try-finally 确保资源一定被释放,避免连接泄漏。


五、总结对比

方式 是否需要配置 适用场景 可读性 维护成本
resultMap 字段不一致、复杂映射
resultType + 别名 简单映射、字段可对齐
resultType + 类型别名 需全局配置 同上,但类名较长时更简洁

如有疏漏,欢迎指正!希望本文能帮助你更好地理解和使用 MyBatis 的结果映射机制。

相关推荐
雨中飘荡的记忆3 小时前
MyBatis SQL解析模块详解
java·mybatis
undsky3 小时前
【RuoYi-SpringBoot3-Pro】:MyBatis-Plus 集成
spring boot·后端·mybatis
GISERLiu3 小时前
Mapper 怎么能找到实体和数据库
数据库·oracle·mybatis
乐之者v4 小时前
AI生成mybatis代码
java·mybatis
七夜zippoe4 小时前
MyBatis核心源码解析 从SqlSession到Mapper接口的绑定过程
java·mybatis·mapper·sqlsession·缓存机制
程序员侠客行1 天前
Mybatis的Executor和缓存体系
java·后端·架构·mybatis
雨中飘荡的记忆1 天前
MyBatis配置解析模块详解
java·mybatis
无名-CODING1 天前
MyBatis 从入门到精通(详解版)
mybatis
weixin_425023002 天前
Spring Boot + MyBatis Plus JOIN 分页多表查询项目文档
spring boot·后端·mybatis
undsky2 天前
【RuoYi-Eggjs】:多数据库与 MyBatis 特性详解
node.js·mybatis·egg.js