Parsed configuration file class path resource Configuration.xml

本文通过解决一个实际项目中MyBatis配置错误导致的启动问题,深入探讨了resultMap与resultType的使用场景及区别。指出当返回对象需要二次封装时,必须使用resultMap,而非resultType。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近开发项目遇到一个小的问题,困扰了我好大一会时间,现象是项目启动的过程中控制台一直输出mybatis的配置文件,但是一直没有结束,不停的输出,导致项目无法正常启动成功!

[org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed configuration file: 'class path resource [mybatisConfiguration.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/admis/AdmisEquelMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/admis/EquBefChangeMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/admis/EqumsIntFormDeMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/admis/EqumsReFormMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/assetClassiFication/AssetClassMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/assetMaintenanceRepair/AssetMaintenanceRepairMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/assetsinventory/AsDetailedFormMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/assetsinventory/AssetsInventoryMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/attach/AfBindTbMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/attach/CommonBasePhotosMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/attributeChanges/AssetAttributeChangeMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/attributeChanges/AsTrafficVolumesMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/billMaterial/BillMaterialMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/change/ChangesMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/common/AsRelMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/common/CommonBaseNameMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/contractProject/ContractProjectMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/earlierstage/EarlierStageMapper.xml]'
  2020-05-21 11:01:23 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/edm2eam/InterfaceMdmBaseDataMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed configuration file: 'class path resource [mybatisConfiguration.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/admis/AdmisEquelMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/admis/EquBefChangeMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/admis/EqumsIntFormDeMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/admis/EqumsReFormMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/assetClassiFication/AssetClassMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/assetMaintenanceRepair/AssetMaintenanceRepairMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/assetsinventory/AsDetailedFormMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/assetsinventory/AssetsInventoryMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/attach/AfBindTbMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/attach/CommonBasePhotosMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/attributeChanges/AssetAttributeChangeMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/attributeChanges/AsTrafficVolumesMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/billMaterial/BillMaterialMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/change/ChangesMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/common/AsRelMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/common/CommonBaseNameMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/contractProject/ContractProjectMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/earlierstage/EarlierStageMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed mapper file: 'URL [jar:file:/F:/apache-tomcat-8.0.33/webapps/eam%23api/WEB-INF/lib/eam-query-1.0-SNAPSHOT.jar!/com/ncic/eam/query/mapper/edm2eam/InterfaceMdmBaseDataMapper.xml]'
  2020-05-21 11:01:24 [org.mybatis.spring.SqlSessionFactoryBean]-[DEBUG] Parsed configuration file: 'class path resource [mybatisConfiguration.xml]'
................................
................................
................................

搞的我头大,问题在自己刚增加的代码有关系,因为昨天还正常启动,今天改了点东西就这样了,经过仔细检查发现问题。

<resultMap id="queryEquBaseInfoResultMap" type="map">
        <id property="id" column="ID"/>
        <result property="assetNumber" column="ASSET_NUMBER"/>
        <result property="depreciationPeriod" column="DEPRECIATION_PERIOD"/>
        <result property="methodDepreciationId" column="METHOD_DEPRECIATION_ID"/>
        <association property="methodDepreciationName" javaType="map">
        <result property="text" column="METHOD_DEPRECIATION_ID"/>
        <result property="value" column="METHOD_DEPRECIATION_NAME"/>
        </association>
</resultMap>
<select id="queryEquBaseInfoById" parameterType="java.lang.String" resultType="queryEquBaseInfoResultMap">
..........
........
</select>

大家仔细看我上面的mybatis配置有什么问题?对了,问题就出现在resultType,因为queryEquBaseInfoResultMap是我自定义的一个集合对象,必须要使用resultMap才可以!
下面的才是正确的代码:

<select id="queryEquBaseInfoById" parameterType="java.lang.String" resultMap="queryEquBaseInfoResultMap">

总结:resultType 和 parameterType都可以直接定义成map,表示输出和输入的对象全部集合对象,这个没有问题,但一旦我们对返回的集合对象进行二次封装的时候,就必须改成resultMap,可能是因为mybatis在解析的时候,发现如果是resultType的话,自然认为是一种常见的类型或者是自己定义的java实体,不会去找配置文件里的对象吧!
以前面试的时候也有面试官问过这类问题,resultType和resultMap有什么区别,以前用mybatis也没在意这种情况,这种写法也不多见,记录下来这样的小问题,下次遇到面试的话,直接可以甩给面试官!

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception with message: class path resource [Mapper/*.xml] cannot be opened because it does not exist at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1361) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1191) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:346) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.3.jar:
03-11
### MyBatis 日志初始化过程及 StdOutImpl 适配器解析 MyBatis日志功能通过 `org.apache.ibatis.logging` 包中的实现完成,其中 `StdOutImpl` 是一种简单的标准输出日志适配器。当配置文件中指定 `log-impl: org.apache.ibatis.logging.stdout.StdOutImpl`[^1] 后,MyBatis使用该适配器打印 SQL 执行的日志信息。 #### 日志初始化流程 在 MyBatis 初始化过程中,会加载全局配置并设置日志工厂 (`LogFactory`)。以下是具体步骤: 1. **读取配置** 当 MyBatis 解析 XML 配置文件时,如果发现 `<settings>` 中存在 `logImpl` 属性,则将其映射为对应的日志实现类[^3]。例如,在 YAML 文件中: ```yaml mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 2. **创建 Log 实例** 在 MyBatis 内部,`BaseExecutor` 和其他组件会调用 `LogFactory.getLog(Class<?> clazz)` 创建具体的日志实例。对于 `StdOutImpl`,它会在控制台直接输出调试信息。 3. **执行 SQL 并记录日志** 每次执行查询或更新操作时,MyBatis 使用当前绑定的 `Log` 对象记录 SQL 文本及其参数值。这使得开发者可以轻松跟踪数据库交互细节。 #### Parsed Mapper File (Mapper 文件解析) MyBatis 在启动阶段会对所有的 Mapper 映射文件进行扫描和注册。这一过程涉及以下几个核心环节: 1. **定位 Mapper 资源路径** - 如果在 Spring Boot 应用程序中启用了 MyBatis 支持,则可以通过如下方式指明 Mapper 文件的位置: ```yaml mybatis: mapper-locations: classpath:mapper/*.xml ``` - 若未提供此属性,可能会触发警告消息 `"Property 'mapperLocations' was not specified"`[^4]。 2. **构建 SqlSessionFactory** - FactoryBean 类型的对象(如 `MapperFactoryBean`)负责动态代理目标 Mapper 接口,并关联底层 Session 工作流[^2]。 - 关键方法 `getObject()` 返回由 MyBatis 提供的实际 Mapper 实现对象。 3. **验证 Mapper 定义的有效性** - MyBatis 自动校验每个 XML 文件内的语句节点 (<select>, <insert> 等),并与 Java Interface 方法签名匹配。 - 错误通常源于命名冲突、SQL 片段缺失或其他语法违规情况。 --- ### 示例代码片段展示如何启用日志解析 Mapper 文件 以下是一个完整的 Spring Boot + MyBatis 集成案例,演示了如何正确配置日志以及处理 Mapper 文件位置。 ```java // Application Configuration @Configuration @MapperScan(basePackages = "com.example.mapper", sqlSessionFactoryRef = "sqlSessionFactory") public class MyBatisConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/testdb"); dataSource.setUsername("root"); dataSource.setPassword("password"); return dataSource; } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); factoryBean.setTypeAliasesPackage("com.example.model"); // 设置实体别名包 factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath*:mapper/**/*.xml")); // 加载 Mapper 文件 return factoryBean.getObject(); } } ``` YAML 配置部分可补充如下内容以便增强可观测性: ```yaml logging: level: com.example.mapper: DEBUG # 开启特定 Mapper 的 Debug 输出 mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值