问题场景
- 在使用
Mybatis
集成Mybatis Plus
,自定义了interface Mapper
,在使用Maven
打包的时候,就提示如下报错了org.springframework.security.authentication.InternalAuthenticationServiceException: Invalid bound statement (not found): com.izpan.service.system.mapper.SysUserMapper.findUserByUsername
- 这是个很常见的错误,就是提示你无法绑定到方法(因为找不到你的
xml
文件);其中 Mybatis Plus 官网也针对这种常见问题给了解决方法;点击查看
解决方案
- 检查
xml
文件所在的package
名称是否和interface
对应的package
名称一一对应 - 检查
xml
文件的namespace
是否和xml
文件的package
名称一一对应 - 检查定义的函数名称能否对应上
- 去掉
xml
文件中的中文注释 - 随意在
xml
文件中加一个空格或者空行然后保存(主要是触发了ide的自动编译功能)
请结合 Mybatis Plus 官网 + 以上解决点进行结合查找本身的解决方案;如再无法解决,请查看打包后的目录(本地的
target
中可直接查看)下有无xml
文件;
- 给出我本地
target
的生成目录,要跟项目的目录文件一一对应(我遇到的就是这个坑) - 在
pom
文件中添加
<build>
<resources>
<!-- 这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 -->
<resource>
<!-- 描述存放资源的目录,该路径相对POM路径 -->
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
项目配置文件
- application.yml
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/yourPackage/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath*:/com/izpan/service/*/mapper/*Mapper.xml
# 实体扫描,多个package用逗号或者分号分隔
type-aliases-package: com.izpan.core.entity,com.izpan.apis.*.model.entity
type-enums-package: com.izpan.core.enums
global-config:
db-config:
# 主键类型
id-type: id_worker
field-strategy: not_null
# 刷新mapper 调试神器(生产环境要关闭)
refresh: true
banner: false
- pom.xml
<build>
<resources>
<!-- 这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 -->
<resource>
<!-- 描述存放资源的目录,该路径相对POM路径 -->
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
- interface SysUserMapper
/**
* 查找用户
*
* @param username
* @return
*/
SysUserDO findUserByUsername(String username);
- SysUserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.izpan.service.system.mapper.SysUserMapper">
<!-- 表示你的sql查询结果和java类型的一个映射,java类型通常是java bean -->
<resultMap type="com.izpan.apis.system.model.entity.SysUserDO" id="SysUserMap">
<result property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
<result property="nickName" column="nick_na'me"/>
<result property="phone" column="phone"/>
<result property="salt" column="salt"/>
<result property="email" column="email"/>
<result property="sex" column="sex"/>
<result property="avatar" column="avatar"/>
<result property="deptId" column="dept_id"/>
<result property="status" column="status"/>
<result property="lastLoginTime" column="last_login_time"/>
<result property="lastResetTime" column="last_reset_time"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
</resultMap>
<select id="findUserByUsername" resultMap="SysUserMap">
SELECT * FROM sys_user WHERE USER_name = #{username}
</select>
</mapper>
以上相关配置文件仅供参考,本人是为了记坑,以免下次又踩到。