項目原來是mybatis,之后由於生成代碼不方便,覺得替換成mybatisplus,引入mybatisplus后,啟動項目報錯mybatisplus Invalid bound statement (not found):
解決方法:
1.根據錯誤信息發現是MapperMethord中MappedStatement返回結果為null,原來是新加入的dao中的方法沒有被掃描到,導致調用該方法是,報錯mybatisplus Invalid bound statement (not found):
private MappedStatement resolveMappedStatement(Class<?> mapperInterface, String methodName, Class<?> declaringClass, Configuration configuration) { String statementId = mapperInterface.getName() + "." + methodName; if (configuration.hasStatement(statementId)) { return configuration.getMappedStatement(statementId); } else if (mapperInterface.equals(declaringClass)) { return null; } else { Class[] var6 = mapperInterface.getInterfaces(); int var7 = var6.length; for(int var8 = 0; var8 < var7; ++var8) { Class<?> superInterface = var6[var8]; if (declaringClass.isAssignableFrom(superInterface)) { MappedStatement ms = this.resolveMappedStatement(superInterface, methodName, declaringClass, configuration); if (ms != null) { return ms; } } } return null; } } }
2.網絡上搜索相關問題,排除掉MapperScan問題后認為是MybatisSqlSessionFactoryBean沒有創建,因為依賴包中引用了底層依賴包,其中一個包還有mabatis。網上嘗試集中創建MybatisSqlSessionFactoryBean的方法,最終下面的方式成功。
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.boot.autoconfigure.MybatisProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver; import org.apache.ibatis.mapping.DatabaseIdProvider; import org.apache.ibatis.plugin.Interceptor; import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; import org.springframework.core.env.Environment; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import javax.sql.DataSource; import java.io.IOException; /** * Mybatis Plus 分頁攔截器配置 * * @author Josh */ //@EnableTransactionManagement @Configuration @EnableConfigurationProperties(MybatisProperties.class) @MapperScan(basePackages={"com.xxx.xxxx.**.dao.*"}) public class MybatisPlusConfig { @Autowired private Environment env; @Autowired private DataSource dataSource; @Autowired private MybatisProperties properties; @Autowired private ResourceLoader resourceLoader = new DefaultResourceLoader(); @Autowired(required = false) private Interceptor[] interceptors; @Autowired(required = false) private DatabaseIdProvider databaseIdProvider; @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 設置請求的頁面大於最大頁后操作, true調回到首頁,false 繼續請求 默認false // paginationInterceptor.setOverflow(false); // 設置最大單頁限制數量,默認 500 條,-1 不受限制 // paginationInterceptor.setLimit(500); // 開啟 count 的 join 優化,只針對部分 left join paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; } @Bean public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() throws IOException { MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean(); mybatisPlus.setDataSource(dataSource); mybatisPlus.setVfs(SpringBootVFS.class); String configLocation = this.properties.getConfigLocation(); if (org.apache.commons.lang.StringUtils.isNotBlank(configLocation)) { mybatisPlus.setConfigLocation(this.resourceLoader.getResource(configLocation)); } mybatisPlus.setPlugins(this.interceptors); MybatisConfiguration mc = new MybatisConfiguration(); mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class); // 數據庫和java都是駝峰,就不需要, //mc.setMapUnderscoreToCamelCase(false); mybatisPlus.setConfiguration(mc); if (this.databaseIdProvider != null) { mybatisPlus.setDatabaseIdProvider(this.databaseIdProvider); } mybatisPlus.setTypeAliasesPackage(this.properties.getTypeAliasesPackage()); mybatisPlus.setTypeHandlersPackage(this.properties.getTypeHandlersPackage()); mybatisPlus.setMapperLocations(this.properties.resolveMapperLocations()); // 設置mapper.xml文件的路徑 String mapperLocations = env.getProperty("mybatis-plus.mapper-locations"); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resource = resolver.getResources(mapperLocations); mybatisPlus.setMapperLocations(resource); return mybatisPlus; } }
3.mybatisplus版本為3.3.2,其中依賴的mybatis版本為3.5.4,而依賴的底層jar中mybatis版本為3.4.2,所以在pom文件中將底層jar中的myabatis排除
<!--Mybatis Plus 提供Mybatis封裝,支持分頁--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.5</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>${mybatis.plus.version}</version> <exclusions> </exclusions> </dependency> <dependency> <groupId>com.xxx.xxxx</groupId> <artifactId>xxx-xxxx-model</artifactId> <version>${project.version}</version> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot.version}</version> </dependency>
4.配置文件中加入xml文件的地址
mybatis-plus.mapper-locations=classpath*:com/xxx/xxxx/**/mapping/*.xml #實體掃描,多個package用逗號或者分號分隔 mybatis-plus.typeAliasesPackage=com.cfas.cloud.**.entity mybatis-plus.configuration.mapUnderscoreToCamelCase=true mybatis-plus.configuration.call-setters-on-nulls=true mybatis-plus.configuration.return-instance-for-empty-row=false
5.如果xml文件在java目錄里,而不是在resources下,需要在pom文件中加入下面配置
<build> <!-- 產生的構件的文件名,默認值是${artifactId}-${version}。 --> <finalName>${project.artifactId}</finalName> <resources> <resource> <directory>src\main\java</directory> <includes> <include>**/*.xml</include> </includes> <targetPath>${build.outputDirectory}</targetPath> </resource> </resources> </build>
至此問題解決,總計花費10h左右解決。