网站做菠菜,开发平台游戏,怎么做网站在谷歌,应用商城app开发场景
因为引用了baomidou主从数据源#xff0c;因为业务场景特殊#xff0c;需要查询语句强制走主库#xff0c;把解决方案分享出来#xff0c;帮助大家少走弯路
pom依赖
dependencygroupIdcom.baomidou/groupIdartifactIddynamic-data…场景
因为引用了baomidou主从数据源因为业务场景特殊需要查询语句强制走主库把解决方案分享出来帮助大家少走弯路
pom依赖
dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion3.6.1/version
/dependency主从配置
package com.baomidou.config;import com.baomidou.dynamic.datasource.plugin.MasterSlaveAutoRoutingPlugin;
import com.baomidou.interceptor.MasterSlaveAutoRoutingOrSelectByRulePlugin;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 主从配置*/
Configuration
public class MasterSlaveAutoRoutingPluginConfig {/*** xml文件sql语句标签名包含FromMaster 会去主库查询*/Beanpublic MasterSlaveAutoRoutingOrSelectByRulePlugin masterSlaveAutoRoutingPlugin(){return new MasterSlaveAutoRoutingOrSelectByRulePlugin();}}拦截器
package com.baomidou.interceptor;import com.baomidou.dynamic.datasource.support.DdConstants;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Properties;/*** 根据 baomidou MasterSlaveAutoRoutingPlugin 修改符合自己的调用规则(目前根据sql方法的唯一id来判断)* 自动切换主从或者根据方法名指定路由*/
Intercepts({Signature(type Executor.class, method query, args {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),Signature(type Executor.class, method query, args {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),Signature(type Executor.class, method update, args {MappedStatement.class, Object.class})})
Slf4j
public class MasterSlaveAutoRoutingOrSelectByRulePlugin implements Interceptor {/*** xml文件sql语句标签名包含FromMaster 会去主库查询* 如 select idfind***FromMaster ...*/public static final String FROM_MASTER FromMaster;Overridepublic Object intercept(Invocation invocation) throws Throwable {Object[] args invocation.getArgs();MappedStatement ms (MappedStatement) args[0];String pushedDataSource null;try {if (ms.getId().contains(MasterSlaveAutoRoutingOrSelectByRulePlugin.FROM_MASTER_HT) SqlCommandType.SELECT ms.getSqlCommandType()) {pushedDataSource DynamicDataSourceContextHolder.push(DdConstants.MASTER);return invocation.proceed();}String dataSource SqlCommandType.SELECT ms.getSqlCommandType() ? DdConstants.SLAVE : DdConstants.MASTER;pushedDataSource DynamicDataSourceContextHolder.push(dataSource);return invocation.proceed();} finally {if (pushedDataSource ! null) {DynamicDataSourceContextHolder.poll();}}}Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}Overridepublic void setProperties(Properties properties) {}
}dao
package com.baomidou.mapper;import com.baomidou.entity.TOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;/*** p* Mapper 接口* /p*/
public interface TOrderMapper extends BaseMapperTOrder {TOrder findOrderFromMaster();}
xml
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.baomidou.mapper.TOrderMapperselect idfindOrderFromMaster resultTypecom.baomidou.entity.TOrder-- 根据名称使sql强制走主库/select/mapper
Yml
server:port: 9914servlet:context-path: /baomidou
logging:level:com.baomidou.dynamic: debug
spring:datasource:dynamic:primary: master # 这里需要修改strict: truehikari:pool-name: Yi_HikariCPminimum-idle: 5maximum-pool-size: 20datasource:# 测试master:type: com.zaxxer.hikari.HikariDataSourceurl: jdbc:mysql://localhost:3396/test?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLfalseserverTimezoneGMT%2B8username: adminpassword: ufcz2b8x3bas4c5m$%332driver-class-name: com.mysql.cj.jdbc.Driverslave_1:type: com.zaxxer.hikari.HikariDataSourceurl: jdbc:mysql://localhost:3397/test?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLfalseserverTimezoneGMT%2B8username: readonlypassword: 123qwe!#driver-class-name: com.mysql.cj.jdbc.Driverslave_2:type: com.zaxxer.hikari.HikariDataSourceurl: jdbc:mysql://localhost:3397/test?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLfalseserverTimezoneGMT%2B8username: readonlypassword: 123qwe!#driver-class-name: com.mysql.cj.jdbc.Driver#seata事务生效seata: trueseata-mode: atseata:enabled: trueapplication-id: baomidou-seata#不使用自动代理数据源enable-auto-data-source-proxy: false
mybatis-plus:
# mybatis-plus start # classpath:/mapper/*Mapper.xmlmapper-locations: classpath*:/mapper/*.xml# 实体扫描多个package用逗号或者分号分隔type-aliases-package: com.user.entityconfiguration:# 这个配置会将执行的sql打印出来在开发或测试的时候可以用log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 驼峰下划线转换map-underscore-to-camel-case: truecache-enabled: false# 如果查询结果中包含空值的列则 MyBatis 在映射的时候不会映射这个字段call-setters-on-nulls: falseglobal-config:# 刷新mapper 调试神器refresh: truebanner: false#数据库大写下划线转换#capital-mode: true#序列接口实现类配置#key-generator: com.baomidou.springboot.xxx# 数据库相关配置db-config:db-type: mysql# 主键类型 AUTO:数据库ID自增, INPUT:用户输入ID,ID_WORKER:全局唯一ID (数字类型唯一ID), UUID:全局唯一ID UUID;id-type: UUID# 字段策略 IGNORED:忽略判断,NOT_NULL:非 NULL 判断),NOT_EMPTY:非空判断field-strategy: NOT_EMPTYcapital-mode: true#逻辑删除配置logic-delete-value: 1logic-not-delete-value: 0
# mybatis-plus end 完结撒花 ✿✿ヽ(°▽°)ノ✿