本人正在学习【Spring Boot】框架,无奈在集成Mybatis时踩到巨坑,不断抛出Invalid bound statement (not found)异常,查阅大量资料并且付诸实践后,得出如下结论:
1、 检查Mapper.xml文件中的namespace指定的路径是否正确
具体如下:
手动敲上去容易出错,建议直接对准mapper文件右键,选中copy reference再粘贴即可
2、检查application.properties(application.yml)文件中是否配置了mybatis的mapper-locations和type-aliases-package属性
3、是否有创建配置类,并且添加@MapperScan扫描所有Mapper接口(或者在每一个Mapper接口上添加@Mapper注解,两种方法可以相互替代)
1、配置类写法:
package smq666.learnspringboot.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
import smq666.learnspringboot.dao.BookMapper;
@Configuration
@MapperScan(basePackages = {"smq666.learnspringboot.dao"})
public class MapperConfig {
}
指定包路径时,使用的是字符串,可能出错,可用鼠标右键copy reference方法,也可以使用指定类的方法,指定了基础类后,会扫描被指定的基础类所在的包,代码如下
package smq666.learnspringboot.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
import smq666.learnspringboot.dao.AdminMapper;
import smq666.learnspringboot.dao.BookMapper;
@Configuration
/*也可以在需要扫描的包下创建一个空接口,例如一个叫
MapperTool的空接口,然后将下方代码中的AdminMapper.class
替换为MapperTool.class即可,当然最后结果都一样
*/
@MapperScan(basePackageClasses = {AdminMapper.class})
public class MapperConfig {
}
2、每个Mapper接口添加@Mapper注解
package smq666.learnspringboot.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import smq666.learnspringboot.model.Admin;
@Mapper
public interface AdminMapper {
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table admin
*
* @mbggenerated
*/
int deleteByPrimaryKey(Long id);
}
如上,在每一个Mapper接口上都添加@Mapper注解即可
4、还有一种本人很少用的注解@Repository,和@Mapper功能类似。如果使用的是@Repository注解(在每个Mapper接口上添加了@Repository而不是@Mapper),则必须使用配置类加@MapperScan的方法与其组合
配置类与上面的配置类一样,但是Mapper接口上方的注解变为@Repository
package smq666.learnspringboot.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import smq666.learnspringboot.model.Admin;
@Repository
public interface AdminMapper {
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table admin
*
* @mbggenerated
*/
int deleteByPrimaryKey(Long id);
}
5、resources目录下的文件夹名不能含有 “."(与eclipse不同)。 例如:
resources/mapper/AdminMapper.xml···········正确
resources/smq666.mapper/AdminMapper.xml····错误