背景:
原本开发其他项目我习惯在java类中添加@Select等sql注解,不喜欢使用xml定义的方法,如果正常简单的增删改成就直接调用mybatisplus的DRUD方法,然后新开发了一个项目是多数据源的项目定义的方法都能正常调用,但是一旦调用mybatisplus的DRUD方法就一直提示Invalid bound statement(not found),除了无法调用drud方法外项目启动mybatisplus的Banner也不打印
解决办法:
折腾半天才在网上找到多数据源创建SqlSessionFactoryBean实例必须使用MybatisSqlSessionFactoryBean来创建,否则就无法正常调用crud方法
@Primary // 指定为默认SqlSessionFactory
@Bean(name = "sqlSessionFactory") //默认数据源不能乱起名字,必须叫sqlSessionFactory
public SqlSessionFactory sqlSessionFactoryAssy(@Qualifier("dataSourceAssy") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例 ---这个就是重点,必须使用MybatisSqlSessionFactoryBean创建SqlSessionFactoryBean实例,否则就无法调用CRUD方法
factory.setDataSource(dataSource);// 设置数据源
factory.setTypeAliasesPackage("com.epson.vipwp.domain");
return factory.getObject();
}
也就是把SqlSessionFactoryBean factory = new SqlSessionFactoryBean ();
改成MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean ();即可
重点: 未用MybatisSqlSessionFactoryBean之前项目启动时mybatisplus的Banner不打印,如果你多个数据源都需要使用到mybatisplus的crud方法时就需要为每个数据源配置SqlSessionFactory 也就是要创建多个MybatisSqlSessionFactoryBean ,而创建后启动就会打印Banner,但是创建多少个就会打印多少个mybatisplus的Banner,这是因为MyBatisPlus在初始化时,会对SqlSessionFactory进行包装和增强,这个过程会在每个数据源创建SqlSessionFactory时执行一次,因此你就会看到对应数量的数据源就有多少次MyBatisPlus的Banner输出。
这是正常现象,只要你的数据源配置无误,不影响项目的正常运行。如果你想关闭这个Banner,可以在application.properties或application.yml文件中添加以下配置:
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
这其实是设置MyBatis的日志输出改为只输出到标准输出流(即控制台),并不会直接关闭MyBatisPlus的启动Banner。目前MyBatisPlus并未提供直接关闭启动Banner的配置项,但不影响程序的实际功能,也就是在正式环境运行时只在控制台打印sql,并不会在文件中显示banner