一、错误信息头:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
二、框架:spring+springmvc+mybatis
三、报错时间点:启动spring容器时、执行指定方法时。
四、先说下spring集成mybatis的个人理解,如下:
1)假定你配置好了数据源
2)下一步是设置SqlSessionFactory的时候,这个时候需要将可扫描的mapper相关文件放入config最后放入factory来管理。在构造这个扫描路径的时候,你可以选择几种方法,也是根据自己的项目而定,笔者所知道的,mybatis.xml配置、java代码编写和springboot默认方式mapperScan来扫描。
3)mapper.xml和mapper.java接口类存在的形式分为三种
1: mapperScan扫描 配对儿的mapper.java和mapper.xml 在同一路径下,类似springboot默认的扫描方式。
2:不同路径下,可以采用在自定义datasource后的 自定义SqlSessionFactory时,构造PathMatchingResourcePatternResolver 将xml文件配置进去,例子如下:
@MapperScan(basePackages = PrimaryDataSourceConfig.INTERFACEPACKAGE, sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig{
@Bean(name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DruidDataSource primaryDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath:/"+XMLPACKAGE));
sessionFactory.setDataSource(primaryDataSource);
logger.info("PrimaryDataSourceConfig.primarySqlSessionFactory.init()");
return sessionFactory.getObject();
}
3:还有一种是mybatis.xml文件的形式,网上很多,笔者就不重复写了,不过用的类和逻辑和上述两种方式雷同。
(注:还有一种方式,是用mapperProvider的形式来配置,上网查询关键字“mybatis Provider”即可)
4)这一步,说一下Spring是怎么集成mybatis的,怎么将mapper.java和xml转化成我们在service里注入的那些bean。
::(这里以mapper.java+mapper.xml来举例)启动spring容器,扫描指定包下的所有mapper文件 (接口还是xml 根据自己用的类来区分),扫描到之后,他会根据你的xml文件里,标签中namespace属性来找到待生成子类所需要实现的接口类(一个mapper.xml可以存在多个标签,一个标签只能有一个namespace属性,namespace的值就是mapper接口类的全类名),mapper接口类中的每个方法签名要和xml中的标签id及其他属性保持一致,大小写敏感。这里如果xml中存在而接口中不存在,就会报出我们标题中的错误。如果没有错误,将会通过xml中的sql标签等生成接口中每一个方法的方法体, 也就是生成 一个mapper.java的子类 ,然后DI进你的ioc容器中 ,这样 你在service里 才可以@Autowired 或者@Resource 取到这个bean。如果在调用方法时,xml中设置的标签属性和返回值不对应 也将报错标题中的错误。
(5)这里也多说一点关于resultMap和resultType:
resultMap:在xml文件中,resultMap标签的声明,是将实体类中的属性字段对应上数据库表的字段名,需要指定实体类的全限定名,但不需要指定表。然后在sql标签中用到的时候直接使用resultMap属性。
resultType: mybatis默认给我们实现了常用的集合类型,如list map等都是小写的。自己也可以自拟(需读友自己科普了)。
总结:标题中的错误,就是mapper.java与mapper.xml映射或mapper.xml文件内部,不对或不对应而产生的错误。大部分属于低级错误,也是我们很难发现的错误。
祝:身体健康~
网友评论