背景:springboot整合mybatisplus自定义datasource(不用自动注入的datasource)
产生的吐血问题是:整合好了,mapper里面自己写的sql可以操作数据库,但是用mybatis本身的方法(我想用basemapper里面的selectList方法)用不了,一直报以下错误org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.pratice.mapper.UserMapper.selectList
以下是代码:
configuration:
@Configuration
public class DataSourceLin {
@Bean(name="data1Source")
@Primary//主数据源
@ConfigurationProperties("spring.datasource.data1")
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
/*
* 返回data1数据库的会话工厂
* @param ds
* @return
* @throws Exception
**/
@Bean(name = "sqlSessionFactoryRef1")
public SqlSessionFactory sqlSessionFactory(@Qualifier("data1Source") DataSource ds) throws Exception{
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(ds);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**.xml"));
return bean.getObject();
}
/* * 返回data1数据库的会话模板
* @param sessionFactory
* @return
* @throws Exception
**/
@Bean(name = "data1SqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactoryRef1") SqlSessionFactory sessionFactory) throws Exception{
return new SqlSessionTemplate(sessionFactory);
}
/* * 返回data1数据库的事务
* @param ds
* @return
**/
@Bean(name = "data1TransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("data1Source") DataSource ds){
return new DataSourceTransactionManager(ds);
}
}
mapper:
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
yml文件:
server:
port: 8088
servlet:
context-path: /lin
aop:
proxy-target-class: true
spring:
datasource:
data1:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
auto-mapping-behavior: full
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath*:mapper/**/*Mapper.xml
global-config:
# 逻辑删除配置
db-config:
# 删除前
logic-not-delete-value: 1
# 删除后
logic-delete-value: 0
启动类:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class PraticemybatisApplication {
public static void main(String[] args) {
SpringApplication.run(PraticemybatisApplication.class, args);
}
}
测试controller:
@RestController
public class UserController {
@Autowired(required = false)
private UserMapper userMapper;
@RequestMapping("test")
public String test(){
List<User> users = userMapper.selectList(new QueryWrapper<>());
for (User user : users) {
System.out.println(user.getName());
}
return "jldjks";
}
}
解决:定位在自定义datasource配置文件那里,起初以为是代理对象生成失败,以为是哪里没配置好,mapper路径,mapper.xml路径等,看得眼珠都凸出来了,没错啊。
最后,在一位神人的注释里看到了这样一句话,(//使用MybatisSqlSessionFactoryBean 可以使用mybatis-BaseMapper中的方法)
吐血。。。。。。。这是在创建SqlSessionFactory时用的一个类,我是用的原生的SqlSessionFactoryBean没有用MybatisSqlSessionFactoryBean,呜呜呜,搞了一上午,
吐血。最后用了MybatisSqlSessionFactoryBean就可以使用basemapper的方法了。。
这是configuration修改的部分:
@Bean(name = "sqlSessionFactoryRef1")
public SqlSessionFactory sqlSessionFactory(@Qualifier("data1Source") DataSource ds) throws Exception{
//使用MybatisSqlSessionFactoryBean 可以使用mybatis-BaseMapper中的方法
// SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(ds);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**.xml"));
return bean.getObject();
}
总结:千万记得,集成框架或者自定义配置的时候,一定要知道每行代码所代表的含义,-,不然出问题都不知道错在哪里,特此记录本次经验,望大家莫踩坑
本文介绍在SpringBoot中整合MyBatisPlus并自定义DataSource时遇到的问题及解决方案。通过调整SqlSessionFactoryBean为MybatisSqlSessionFactoryBean,成功启用BaseMapper中的方法。
1151

被折叠的 条评论
为什么被折叠?



