MyBatis基础入门《四》接口方式:Select查询集合

MyBatis基础入门《四》接口方式:Select查询集合

前情提要 :在 《MyBatis基础入门《二》Select查询》 中我们提到,SqlSession 有两种使用方式:

  1. 直接通过字符串调用 Mapper XML 中的 SQL(如 session.selectList("namespace.id"));
  2. 基于 Mapper 接口的方式(推荐)

本文将详细介绍 第二种方式 ------ 使用 Mapper 接口进行集合查询,这是 MyBatis 开发中最常用、最优雅的写法。


一、为什么推荐使用接口方式?

  • 类型安全:编译期即可检查方法是否存在,避免字符串硬编码出错。
  • 代码简洁:无需手动拼接 namespace + id,直接调用接口方法。
  • 易于维护:接口与 XML 职责分离,符合面向接口编程思想。

💡 MyBatis 会自动为接口生成代理实现类,你只需定义接口,剩下的交给框架!


二、核心实现步骤

1. 定义 Mapper 接口

复制代码
// com.charles.dao.ClientMapper.java
package com.charles.dao;

import java.util.List;
import com.charles.entity.TblClient;

public interface ClientMapper {
    
    /**
     * 查询所有客户信息
     * 注意:方法名必须与 ClientMapper.xml 中 <select> 标签的 id 一致!
     * @return 客户列表
     */
    List<TblClient> getClientAll();
}

🔔 关键规则

  • 接口中的方法名(如 getClientAll必须 与 XML 中 <select>id 属性值完全相同。
  • 方法返回类型需与 SQL 查询结果匹配(如 List<TblClient>)。
  • 若有参数,方法形参也需与 XML 中 parameterType#{} 占位符对应。

✅ 示例扩展:

若你在接口中定义了 void deleteById(int cid);

则 XML 中必须有:

复制代码
<delete id="deleteById" parameterType="int">
    DELETE FROM tbl_client WHERE id = #{cid}
</delete>

2. XML 映射文件(保持不变)

由于之前已配置好 ClientMapper.xml(支持三种映射方式),此处无需修改。

只需确保 <select id="getClientAll" ...> 存在即可。

例如使用别名方式(已在 mybatis-config.xml 中注册 baitang 别名):

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

3. 编写测试用例:通过接口调用

复制代码
// com.charles.junit.JunitMybaitsMapper.java
package com.charles.junit;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.charles.dao.ClientMapper;
import com.charles.entity.TblClient;
import com.charles.util.MyBatisUtil;

public class JunitMybaitsMapper {

    @Test
    public void junitMapper() {
        // 1. 获取 SqlSession
        SqlSession session = MyBatisUtil.getSqlSession();
        
        try {
            // 2. 获取 Mapper 接口的动态代理对象
            ClientMapper mapper = session.getMapper(ClientMapper.class);
            
            // 3. 调用接口方法执行查询
            List<TblClient> list = mapper.getClientAll();
            
            // 4. 输出结果
            for (TblClient client : list) {
                System.out.println(
                    client.getCid() + "\t" +
                    client.getCname() + "\t" +
                    client.getCaddress() + "\t" +
                    client.getCbirthday()
                );
            }
        } finally {
            // 5. 关闭资源(重要!)
            MyBatisUtil.closeSqlSession(session);
        }
    }
}

最佳实践 :使用 try-finally 确保 SqlSession 一定被关闭,防止连接泄漏。


三、运行结果(示例)

假设数据库中有以下数据:

id client_name client_address client_birthday
1 张三 北京 1990-05-20
2 李四 上海 1988-12-03

控制台输出:

复制代码
1	张三	北京	1990-05-20
2	李四	上海	1988-12-03

📸(此处可插入你的实际运行截图)


四、常见问题 & 注意事项

❓ Q1:接口方法找不到对应的 XML 语句?

  • 检查方法名是否与 XML 中 id 一致(区分大小写!)
  • 检查 XML 的 namespace 是否为接口的全限定名(如 com.charles.dao.ClientMapper

❓ Q2:报错 "BindingException: Invalid bound statement"?

  • 通常是 Mapper XML 未被正确加载。

  • 请确认 mybatis-config.xml 中已注册该 Mapper:

    复制代码
    <mappers>
        <mapper resource="com/charles/dao/ClientMapper.xml" />
    </mappers>

❓ Q3:能否不写 XML,只用注解?

  • 可以!但复杂 SQL(如多表关联、动态 SQL)仍推荐 XML。

  • 简单查询可用 @Select 注解,例如:

    复制代码
    @Select("SELECT * FROM tbl_client")
    List<TblClient> getClientAll();

五、总结

方式 优点 缺点 适用场景
字符串调用(session.selectList("xxx") 简单直接 易出错、难维护 快速测试
Mapper 接口方式 类型安全、代码优雅、IDE 支持好 需额外定义接口 生产项目首选

记住一句话
"接口方法名 = XML 中标签 id,namespace = 接口全路径" ------ 这是 MyBatis 接口绑定的核心规则!


如有疑问或发现错误,欢迎在评论区留言交流!

相关推荐
期待のcode14 小时前
MyBatis-Plus通用Service
java·后端·mybatis·springboot
无名小卒~≯15 小时前
mybatis重复查询导致内存地址相同bug
bug·mybatis
小二·16 小时前
MyBatis入门:环境搭建
mybatis
小小哭包17 小时前
Spring+MyBatis实现数据库读写分离方案
数据库·spring·mybatis
小二·21 小时前
MyBatis 查询数据库返回集合的三种接收方式(附工具类封装)
mybatis
SadSunset21 小时前
(16)MyBatis执行流程分析(偏上层架构)
java·架构·mybatis
张较瘦_1 天前
Springboot3 | MyBatis-Plus 多表查询极简实践:宠物管理系统场景落地
java·mybatis·宠物
小二·1 天前
MyBatis基础入门《七》ResultMap 高级映射:一对一 & 一对多关联查询
mybatis
qq_589568102 天前
mybatis-plus和springboot项目错误记录
spring boot·后端·mybatis