Spring整合MyBatis开发CRUD应用时SQL Mapper配置解析错误排查求助
从错误栈和代码来看,你遇到的核心问题是类路径解析错误,同时还有Mapper调用不匹配、Spring整合MyBatis姿势不当的问题,下面一步步给你拆解:
1. 最直接的报错根源:包名前缀写错了
错误提示里明确显示Could not resolve type alias 'java.com.model.Siswa',这是因为你在Mapper XML里把实体类的包名写错了——咱们自己的业务类绝不会放在java.开头的包下,正确的包名应该是com.model.Siswa。
修改你的Student.xml里的parameterType:
<insert id="insert" parameterType="com.model.Siswa">
2. Mapper命名空间与代码调用不匹配
你的Mapper XML里设置的namespace="Siswa",但在Repository代码里调用SQL时写的是session.insert("Student.insert", siswa1);——这里的Student和Mapper的namespace完全不一致,MyBatis根本找不到对应的SQL语句。
把Repository里的调用改成:
session.insert("Siswa.insert", siswa1); // 下面那条insert也同步改成Siswa.insert
3. Spring整合MyBatis的方式完全错了
你现在在Repository里每次调用saveSiswa都重新读取配置文件、创建SqlSessionFactory,这完全违背了Spring依赖注入的核心思想,不仅效率极低,还容易引发各种资源问题。正确的姿势是:
- 在Spring配置类/XML中提前配置好
SqlSessionFactory - 通过依赖注入把
SqlSessionFactory或者SqlSessionTemplate给到Repository使用
修改后的Repository示例(遵循Spring规范):
@Repository public class SiswaRepo { private final SqlSessionFactory sqlSessionFactory; // 构造方法注入SqlSessionFactory public SiswaRepo(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Override public void saveSiswa(Siswa siswa) throws IIOException { // 用try-with-resources自动关闭会话 try (SqlSession session = sqlSessionFactory.openSession(true)) { // 直接用传入的完整siswa对象即可,不需要拆分 session.insert("Siswa.insert", siswa); System.out.println("Records Saved Successfully "); } catch (Exception e) { e.printStackTrace(); throw new IIOException("保存数据失败", e); } } }
4. 业务逻辑的小bug
你在Repository里把一个完整的Siswa对象拆成了siswa1和siswa2分别插入,这会导致数据库里出现两条不完整的记录(第一条只有基本信息,第二条只有分数)。其实你的SQL已经包含了两个表的插入语句,直接用传入的完整siswa对象就能完成批量插入。
总结
先修复包名和Mapper调用的问题,这两个是导致当前报错的直接原因;然后调整Spring整合MyBatis的方式,遵循依赖注入规范;最后修正业务逻辑,避免插入无效数据。
内容的提问来源于stack exchange,提问作者JS24

