# springboot整合sharding-jdbc **Repository Path**: zhanglujun2018/sharding-jdbc ## Basic Information - **Project Name**: springboot整合sharding-jdbc - **Description**: 基于springboot整合sharding-jdbc 项目,实现分库分表案例 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2020-03-18 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # sharding-jdbc-demo ## sharding-jdbc 简单介绍 **官方介绍** `sharding-jdbc`将自身定义为轻量级`Java`框架,该框架在`Java` `JDBC`层提供额外的服务。客户端直接连接到数据库时,它以`jar`形式提供服务,并且不需要额外的部署和依赖性。它可以被认为是增强的`JDBC`驱动程序,它与`JDBC`和各种`ORM`框架完全兼容 [官方 Gitee 地址]() ## 代码实例 `4.0.0-RC1`版本,官网地址[shardingsphere.apache.org]()。 ### 前期准备 **开发环境** > MySQL 5.7 > Mven 3.6 > Java 1.8 > SpringBoot 2.0.6.RELEASE **pom.xml** ```xml org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test com.baomidou mybatis-plus-boot-starter 3.2.0 mysql mysql-connector-java com.alibaba druid-spring-boot-starter 1.1.17 org.projectlombok lombok 1.18.8 org.apache.shardingsphere sharding-jdbc-spring-boot-starter 4.0.0-RC1 ``` # ### 配置yml 配置多个数据源并将表分配到不同的数据源,并配置分表策略和主键策略(稍有改动,以代码为准) ```yml 代码内附带sql server: port: 18101 spring: shardingsphere: # 配置多个数据源 datasource: names: ds0,ds1,ds2 ds0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://....:3306/acs_dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: password: initial-size: 4 # 初始化时建立物理连接的个数 min-idle: 1 # 最小连接池数量 max-active: 40 # 最大连接数量 query-timeout: 60000 #查询超时 filters: stat,config # stat表示sql合并 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效 ds1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://....:3306/sharding_jdbc_01?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: password: initial-size: 4 # 初始化时建立物理连接的个数 min-idle: 1 # 最小连接池数量 max-active: 40 # 最大连接数量 query-timeout: 60000 #查询超时 filters: stat,config # stat表示sql合并 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效 ds2: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://....:3306/sharding_jdbc_02?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: password: initial-size: 4 # 初始化时建立物理连接的个数 min-idle: 1 # 最小连接池数量 max-active: 40 # 最大连接数量 query-timeout: 60000 #查询超时 filters: stat,config # stat表示sql合并 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效 # (不同的表在不同的库中) sharding: tables: menu: #(该表只会存在于一个数据库中的单表) # defaultDataSourceName: ds0.user_info # 配置单表数据源(该表只会存在于一个数据库中) actual-data-nodes: ds0.menu #既不分库也不分表 只存在当前配置的库中 # 配置主键策略 key-generator-column-name: id key-generator: type: SNOWFLAKE column: id user: # 只分库不分表 # 配置主键策略 key-generator-column-name: id key-generator: type: SNOWFLAKE column: id actual-data-nodes: ds$->{['0','1','2']}.user #数据节点 注意 只分库不分表 database-strategy: #分库策略 inline: #行表达式 sharding-column: dept_id #列名称,多个列以逗号分隔 algorithm-expression: ds$->{dept_id % 3} #按模运算分配 # table-strategy: #分表策略 # inline: #行表达式 # sharding-column: dept_id #分表字段 # algorithm-expression: user$->{dept_id % 3} #按模运算分配 department: # 配置分库数据源(分表处理) actual-data-nodes: ds$->{['0','1','2']}.department${['0','1','2']} #数据节点 即分库也分表 # 配置主键策略 key-generator-column-name: id key-generator: type: SNOWFLAKE column: id #分库策略 database-strategy: inline: sharding-column: id #分库字段 algorithm-expression: ds$->{id % 3} # 多个库进行取模运算 ## 分表策略 table-strategy: # inline 表达式配置分表 inline: sharding-column: id #分表字段 algorithm-expression: department$->{id % 3} # 多张表进行取模运算 # binding-tables: user,department${['0','1','2']} ##如果有关联表没配置绑定有可能会出现笛卡尔积 broadcast-tables: t_config props: sql.show: true # 显示sql #mybatis 配置 mybatis-plus: # xml存放地址 mapper-locations: classpath:mapper/*/*.xml #typeEnumsPackage: com.baomidou.springboot.entity.enums type-aliases-package: com.example.sharding.domain.entity.* global-config: #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; id-type: 1 #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" field-strategy: 2 #驼峰下划线转换 db-column-underline: true #刷新mapper 调试神器 refresh-mapper: true refresh: true #数据库大写下划线转换 #capital-mode: true #序列接口实现类配置 #key-generator: com.baomidou.springboot.xxx #逻辑删除配置 logic-delete-value: 0 logic-not-delete-value: 1 #自定义填充策略接口实现 #meta-object-handler: com.baomidou.springboot.xxx #自定义SQL注入器 #sql-injector: com.baomidou.springboot.xxx configuration: map-underscore-to-camel-case: true # cache-enabled: false #设置查询resultType为map时空字段允许查出来 callSettersOnNulls: true # 可以参考生产环境可以注释掉该项(打印sql执行日志) log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 遗留问题: 未解决的问题 mybatisplus 3.1.1的api对分库分表的数据进行查询映射时还存在问题,目前的解决方案是利用mybatis来进行映射查询可以解决此问题,希望看到以及想使用的大神能够继续优化此架构,开源共享,我为人人,人人为我,共建开源社区 ```