MyBatis基础入门《四》接口方式:Select查询集合
前情提要 :在 《MyBatis基础入门《二》Select查询》 中我们提到,
SqlSession有两种使用方式:
- 直接通过字符串调用 Mapper XML 中的 SQL(如
session.selectList("namespace.id"));- 基于 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 接口绑定的核心规则!
如有疑问或发现错误,欢迎在评论区留言交流!