踩坑记录:Invalid bound statement (not found)

问题场景

  • 在使用 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 官网也针对这种常见问题给了解决方法;点击查看

解决方案

  1. 检查 xml 文件所在的 package 名称是否和 interface 对应的 package 名称一一对应
  2. 检查 xml 文件的 namespace 是否和 xml 文件的 package 名称一一对应
  3. 检查定义的函数名称能否对应上
  4. 去掉 xml 文件中的中文注释
  5. 随意在 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>

以上相关配置文件仅供参考,本人是为了记坑,以免下次又踩到。

后端开发

泛型在使用 GSON 解析转换 LinkedTreeMap 无法正常解析

2020-7-11 18:33:16

后端开发

SpringBoot 集成 Jasypt 安全框架,配置文件内容加密

2019-5-8 11:47:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索