坑:Mybatis-Plus 使用 @DS注解 做多数据源切换 mapper代理失败

部署运行你感兴趣的模型镜像
Method threw 'java.lang.IllegalArgumentException' exception. Cannot evaluate com.sun.proxy.$Proxy


原先的mapper:

@DS("db3")
public interface TestUserDriverManagementBizMapper extends BaseMapper<UserDriverManagement> {

    @Select("select * from user_driver_management")
    List<UserDriverManagement> getByUid();
}

网上大多数的教程是@DS注解可以直接写在mapper上面,但是由于mapper用了@Select注解,

@Select不可能识别到切换后的数据源,所以把@DS放在Service里面,他就先切换了,然后@Select就知道啦
改后:

@Service
public class TestUserDriverManagementBizService {

    @Resource
    private TestUserDriverManagementBizMapper mapper;


    @DS("db3")
    public List<UserDriverManagement> getByUid1() {
        return mapper.getByUid();
    }
}

这个@DS注解放在class上和method都可以

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think> 我们使用dynamic-datasource-spring-boot-starter这个starter来简化多数据源配置,它支持使用@DS注解在Service或Mapper层指定数据源。 步骤: 1. 引入依赖 2. 配置多数据源 3. 使用@DS注解指定数据源 详细步骤: 1. 引入依赖(在pom.xml中): 注意:我们使用MyBatis-Plus和Druid,所以需要引入相应的starter。dynamic-datasource-spring-boot-starter已经内置了Druid,所以我们可以直接使用。 2. 在application.yml中配置多数据源: 配置格式如下: 3. 在需要切换数据源的方法或类上使用@DS注解。 具体实现: 一、引入依赖 在pom.xml中添加以下依赖(注意版本兼容性): ```xml <dependencies> <!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency> <!-- dynamic-datasource --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>最新版本</version> </dependency> <!-- Druid(如果dynamic-datasource内置的Druid版本不合适,可以单独引入并排除内置的) --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> </dependencies> ``` 二、配置多数据源 在application.yml中配置: ```yaml spring: datasource: dynamic: primary: master # 设置默认的数据源或者数据源组,默认值即为master strict: false # 设置严格模式,默认false。开启严格模式后,未匹配到指定数据源时回退使用默认数据源,否则抛出异常 datasource: master: url: jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave_1: url: jdbc:mysql://localhost:3306/slave1?useUnicode=true&characterEncoding=utf8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave_2: url: jdbc:mysql://localhost:3306/slave2?useUnicode=true&characterEncoding=utf8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver druid: # druid相关配置(这里可以配置druid专有配置,比如连接池等) initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 validation-query: SELECT 1 FROM DUAL test-while-idle: true test-on-borrow: false test-on-return: false pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 filters: stat,wall,slf4j use-global-data-source-stat: true connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 ``` 三、使用@DS注解 1. 在Service或Mapper使用@DS注解指定数据源名称(如"slave_1")或组名(如"slave",如果配置了组的话,组内可以有多个数据源,默认负载均衡方式为轮询)。 示例1:在Service方法上使用 ```java import com.baomidou.dynamic.datasource.annotation.DS; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override @DS("master") // 指定使用master数据源 public void addUser(User user) { userMapper.insert(user); } @Override @DS("slave_1") // 指定使用slave_1数据源 public List<User> selectUsers() { return userMapper.selectList(null); } } ``` 示例2:在Mapper接口上使用 ```java import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @DS("slave") // 整个Mapper接口默认使用slave数据源(组),如果方法上指定了@DS,则以方法上的为准 public interface UserMapper extends BaseMapper<User> { @DS("master") // 这个方法使用master数据源 int insertUser(User user); } ``` 注意: - @DS注解可以标注在方法上或类上,同时存在时方法注解优先于类注解- 如果没有指定@DS,则使用默认数据源(配置的primary数据源)。 四、事务管理 使用@DSTransactional注解可以支持多数据源事务(分布式事务,基于JTA),但需要注意,它只能用于主从数据源(即一个主库操作和多个从库操作)的事务,如果是多个主库则需要使用其他分布式事务解决方案(如Seata)。 示例: ```java @Service public class OrderService { @DSTransactional // 开启多数据源事务(分布式事务) public void placeOrder(Order order) { // 操作主库 orderMapper.insert(order); // 操作从库(或其他数据源) logService.insertLog(order); } } ``` 五、Druid监控配置 如果使用了Druid,可以配置监控页面: 在配置类中添加: ```java @Configuration public class DruidConfig { @Bean public ServletRegistrationBean<StatViewServlet> druidServlet() { ServletRegistrationBean<StatViewServlet> servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); // 添加IP白名单 servletRegistrationBean.addInitParameter("allow", ""); // 添加IP黑名单,优先级高于白名单 servletRegistrationBean.addInitParameter("deny", ""); // 控制台管理用户 servletRegistrationBean.addInitParameter("loginUsername", "admin"); servletRegistrationBean.addInitParameter("loginPassword", "admin"); // 是否能够重置数据 servletRegistrationBean.addInitParameter("resetEnable", "false"); return servletRegistrationBean; } @Bean public FilterRegistrationBean<WebStatFilter> filterRegistrationBean() { FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } } ``` 这样就可以通过http://localhost:8080/druid 访问监控页面。 总结: 使用dynamic-datasource-spring-boot-starter可以非常方便地实现多数据源配置,通过@DS注解在方法或类上指定数据源,同时支持Druid连接池和监控。 注意:以上步骤基于引用[1]和[2]的内容,并结合了实际使用经验。 参考文献: [^1]: Spring Boot入门(20):使用Mybatis-plus实现Spring Boot多数据源配置,轻松实现数据库读写分离!。 [^2]: MyBatis-Plus&Druid数据。 §§相关问题§§ 1. 如何配置多数据源的事务管理? 2. 如何监控Druid多数据源的运行状态? 3. 使用@DS注解时如何避免数据源切换失败? </think>### 使用MyBatis-Plus和Druid配置多数据源并指定数据源的方法 通过集成`dynamic-datasource-spring-boot-starter`,可快速实现多数据源配置,并在Mapper或Service层使用`@DS`注解指定数据源。以下是具体实现步骤: --- ### 1. 添加依赖 在`pom.xml`中引入核心依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.5.0</version> <!-- 使用最新版本 --> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> ``` > 该组件已集成MyBatis-Plus和Druid,无需额外配置[^1]。 --- ### 2. 配置多数据源 在`application.yml`中配置数据源: ```yaml spring: datasource: dynamic: primary: master # 默认数据源 datasource: master: # 主库 url: jdbc:mysql://localhost:3306/master_db username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave1: # 从库1 url: jdbc:mysql://localhost:3306/slave_db1 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave2: # 从库2 url: jdbc:mysql://localhost:3306/slave_db2 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver druid: # Druid连接池配置 initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000 ``` --- ### 3.Mapper或Service中指定数据源 使用`@DS`注解动态切换数据源: #### 在Service层指定 ```java @Service public class UserServiceImpl implements UserService { @DS("slave1") // 指定使用slave1数据源 @Override public List<User> queryUsers() { return userMapper.selectList(null); } @DS("master") // 指定使用master数据源 @Override public void addUser(User user) { userMapper.insert(user); } } ``` #### 在Mapper层指定 ```java public interface OrderMapper extends BaseMapper<Order> { @DS("slave2") // 指定使用slave2数据源 List<Order> selectLargeOrders(); } ``` --- ### 4. 注解使用规则 - **优先级**:方法注解 > 类注解 - **无注解时**:使用默认数据源(`primary`配置) - **支持SpEL表达式**:动态选择数据源 ```java @DS("#header.datasource") // 从请求头获取数据源名 ``` --- ### 5. 事务管理 使用`@DSTransactional`注解支持跨数据源事务: ```java @Service public class OrderService { @DSTransactional // 多数据源事务 public void createOrder(Order order) { orderMapper.insert(order); // 操作master库 inventoryMapper.reduceStock(order); // 操作slave1库 } } ``` > 注意:分布式事务需额外集成Seata等框架[^1]。 --- ### 6. 监控配置(Druid) 启用Druid监控: ```yaml spring: datasource: druid: stat-view-servlet: enabled: true login-username: admin login-password: admin url-pattern: /druid/* ``` 访问 `http://localhost:8080/druid` 查看监控数据。 --- ### 优势总结 1. **零侵入**:无需修改Mapper XML文件 2. **开箱即用**:10分钟完成多数据源配置 3. **灵活切换**:支持方法/类级数据源指定 4. **读写分离**:天然支持主从库分离场景[^1] 通过`dynamic-datasource-spring-boot-starter`,MyBatis-Plus多数据源配置变得极其简单,大幅提升开发效率[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值