美文网首页
org.apache.ibatis.binding.Bindin

org.apache.ibatis.binding.Bindin

作者: 私奔_1f4f | 来源:发表于2018-01-25 14:03 被阅读0次

    一、错误信息头: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文件内部,不对或不对应而产生的错误。大部分属于低级错误,也是我们很难发现的错误。

    祝:身体健康~

    相关文章

      网友评论

          本文标题:org.apache.ibatis.binding.Bindin

          本文链接:https://www.haomeiwen.com/subject/yunelxtx.html