SpringBoot项目中MyBatis无法找到mapper.xml中指定的refid

项目场景:

SpringBoot项目,MyBatis 异常:xxxMapper.xml 中无法找到 refid 为 xxx 的 片段;更正之后,多次重新启动仍然无法消除这个异常。

问题描述:

org.apache.ibatis.builder.IncompleteElementException: Could not find SQL statement to include with refid 'org.peanutvideo.system.mapper.AppUserInfoMapper.selectAppUser'
java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for org.peanutvideo.system.mapper.AppUserInfoMapper.selectAppUser
	at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:888) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.builder.xml.XMLIncludeTransformer.findSqlFragment(XMLIncludeTransformer.java:96) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:61) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:83) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:51) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:88) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:788) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:758) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:753) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.binding.MapperMethod$SqlCommand.resolveMappedStatement(MapperMethod.java:249) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:219) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:49) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65) ~[mybatis-3.4.6.jar:3.4.6]
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58) ~[mybatis-3.4.6.jar:3.4.6]
	at com.sun.proxy.$Proxy62.selectAppUserCounter(Unknown Source) ~[na:na]
	at org.peanutvideo.system.service.app.impl.AppUserServiceImpl.selectAppUserCounter(AppUserServiceImpl.java:30) ~[classes/:na]
	at org.peanutvideo.web.controller.app.AppUserController.loginByCode(AppUserController.java:32) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_202]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_202]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_202]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_202]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at ………………………………………………………………………………

原因分析:

查看异常的 xxxMapper.xml 文件,找到问题片段, 片段确实在 引用之前, 中的 id 和 中的 refid 完全一样。
在这里插入图片描述

打开 target 目录下的 xxxMapper.xml 文件发现错误片段,项目重启后并没有更新代码到 target 目录,引起了这次异常。

注: target 目录是编译后文件存放的地方


解决方案:

方法 I

每次更新代码后,build 一下。
在这里插入图片描述
方法 II

在 maven 的 pom.xml 中配置 build 选项。

具体参见:解决idea spring boot项目中target中没有同步更新最新目录文件及资源

### 关于 MyBatis Plus 中 `mapper.xml` 文件的配置 MyBatis Plus 是基于 MyBatis 进行二次封装的一个框架,简化了开发流程并提供了更多便捷的功能。尽管如此,在某些情况下仍然需要通过自定义 SQL 来满足特定需求,这时就需要用到 `mapper.xml` 文件。 #### 配置基础结构 在 MyBatis Plus 中,`<mapper>` 元素依然是映射文件的根元素[^4]。为了使 MyBatis Plus 和传统的 MyBatis 映射文件兼容,通常会保持相同的命名空间(namespace),该命名空间应对应实体类对应的 Mapper 接口全限定名: ```xml <mapper namespace="com.example.demo.mapper.UserMapper"> <!-- SQL 语句 --> </mapper> ``` #### 定义 CRUD 方法 对于简单的增删改查操作,MyBatis Plus 提供了一套默认实现,无需额外编写 SQL 语句即可完成大部分工作。然而当遇到复杂业务逻辑时,则需手动添加相应的 `<insert>`, `<update>`, `<delete>` 或者 `<select>` 标签来描述具体的操作过程[^1]。 例如,下面是一个用于查询用户的例子: ```xml <select id="getUserById" resultType="com.example.entity.User"> SELECT * FROM user WHERE id=#{id} </select> ``` 这里需要注意的是参数类型(`parameterType`)和返回结果类型(`resultType`)的选择要与实际使用的 Java 类型相匹配。 #### 使用动态SQL 除了静态 SQL 外,还可以利用 MyBatis 的动态 SQL 特性来增强灵活性。比如条件判断、循环遍历等功能都可以借助内置标签如 `<if>`, `<choose>`, `<when>`, `<otherwise>`, `<foreach>` 等轻松实现[^2]。 示例中展示了一个带有多个可选过滤条件的查询语句片段: ```xml <select id="getUsersByConditions" parameterType="map" resultMap="BaseResultMap"> SELECT <include refid="allColumns"/> FROM users u <where> <if test="name != null and name != '' "> AND u.name LIKE CONCAT('%',#{name},'%') </if> <if test="age != null"> AND u.age >= #{age} </if> </where> </select> ``` 此部分代码展示了如何根据传入的不同参数组合灵活调整最终执行的 SQL 文本。 #### 结合全局配置项 最后值得一提的是,MyBatis Plus 支持多种方式来自定义全局设置,这些设定可以影响整个应用程序的行为模式,包括但不限于分页插件(PageHelper)集成、乐观锁机制启用等特性[^3]。虽然这部分内容主要集中在应用层面而非具体的 `mapper.xml` 文件内,但对于理解整体架构依然非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆papa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值