记一次springboot整合mybatisplus自定义datasource数据源吐血总结

本文介绍在SpringBoot中整合MyBatisPlus并自定义DataSource时遇到的问题及解决方案。通过调整SqlSessionFactoryBean为MybatisSqlSessionFactoryBean,成功启用BaseMapper中的方法。
摘要由CSDN通过智能技术生成

背景: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();
    }

总结:千万记得,集成框架或者自定义配置的时候,一定要知道每行代码所代表的含义,-,不然出问题都不知道错在哪里,特此记录本次经验,望大家莫踩坑

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值