sharding-jdbc-spring-boot-starter最简单使用

前言

网上已经有很多的关于sharding-jdbc的使用,但是很多都是抄来抄去,说的也不是特别的完整,作者本来是闲来无事想跑起来试一下效果,但是找了一些文档都不是说的很明白。而且很多都是使用的是sharding-jdbc-core ,但是我们现在开发应该很少用spring mvc开发吧,大部分都是springboot开发,所以还是想用starter的方式。经历不断试错后搭建起最简单的、配置代码最少的测试案例。如果帮助到了你帮忙点赞啊。

一、引入依赖

  1. mybatis-spring-boot-starter
  2. sharding-jdbc-spring-boot-starter
  3. druid
<!-- 核心依赖-mybatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>
<!-- 核心依赖-mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- 核心依赖-sharding-jdbc -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.1</version>
</dependency>
<!-- 核心依赖-数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.22</version>
</dependency>

需要注意的是,在这里使用的druid数据库连接池必须要用这个,如果用了druid的starter引用,需要将自动装配的类排除掉,否则也会自动去构建数据源,导致失败。

二、数据库表结构

这里演示的是分库且分表,所以会有两个数据库,且每个数据库中有两个表,表结构都一致
db1: t_user_1 、 t_user_2
db2: t_user_1 、 t_user_2

数据库结构
表结构为:
表结构

三、配置文件



# 应用服务 WEB 访问端口
server:
  port: 8080

  # 应用名称
spring:
  application:
    name: sharding-jdbc-test
  shardingsphere:
    # 是否打印sql
    props:
      sql:
        show: true
    datasource:
      # 有几个库
      names: db1,db2
      # 库1 的配置
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/db1?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
        username: root
        password: 123456
      # 库2 的配置
      db2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/db2?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
        username: root
        password: 123456
    sharding:
      # 默认的库
      default-data-source-name: db1
      # 绑定的表 不配置也没找出啥问题
      binding-tables: t_user
      # 配置表的分片规则
      tables:
        # 指定某个表的分片配置
        t_user:
          # 这个配置是告诉sharding有多少个库和多少个表
          actual-data-nodes: db$->{
    
    1..2}.t_user_$->{
    
    1..2}
          #分库策略
          database-strategy:
            # 行表达式模式
            inline:
              # 选择需要分库的字段,根据那个字段进行区分
              sharding-column: age
              # 表达式,分库的算法,这个是通过年龄取模然后决定落到哪个库
              algorithm-expression: db$->{
    
    age % 2 + 1}
          # 主键生成策略(如果是自动生成的,在插入数据的sql中就不要传id,null也不行,直接插入字段中就不要有主键的字段)
          key-generator: 
            # 对应的数据库表的主键
            column: id
            # 生成方式, 雪花模式
            type: SNOWFLAKE
          # 配置表分片策略
          table-strategy:
            # 行表达式
            inline:
              # 配置表分片的字段
              sharding-column: id
              # 配置表分片算法
              algorithm-expression: t_user_$->{
    
    id % 2 +1}


mybatis.configuration.map-underscore-to-camel-case: true

四、代码配置

实际上到此为止,关于sharding-jdbc的配置已经完事了,剩下的就是mybatis的配置,可以和正常的CURD都一样了

mapper接口

public interface UserMapper {
    
    
    
    /** 如果是主键自动生成的,切记不要传入id,否则会报错 */
    @Insert("insert into t_user(name,age) values(#{name},#{age})")
    void insert(UserModel user);


    @Select("select * from t_user")
    List<UserModel> selectAll();


    @Select("select * from t_user where name like #{name}")
    List<UserModel> selectLike(String name);


    @Select("select * from t_user where name like #{name} limit 1")
    List<UserModel> selectLikePage(String name);

}

model

@Data
public class UserModel {
    
    
    
    private Long id;

    private String name;

    private Integer age;
}

启动类以及测试方法

@SpringBootApplication
@MapperScan(basePackages = "com.xxx.shard.shardingjdbctest.mapper")
public class ShardingJdbcTestApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(ShardingJdbcTestApplication.class, args);
    }
    
    @RestController
    class TestController{
    
    
        
        @Resource
        UserMapper userMapper;

        @GetMapping("/add")
        public Object add(){
    
    

            UserModel model = new UserModel();
//            model.setId(2);
            model.setName("test2");
            model.setAge(1);
            userMapper.insert(model);
            return "ok";
        }


        @GetMapping("/list")
        public Object list(){
    
    

            return userMapper.selectAll();
        }


        @GetMapping("/like")
        public Object like(){
    
    

            return userMapper.selectLike("%2%");
        }

        @GetMapping("/page")
        public Object page(){
    
    

            return userMapper.selectLikePage("%2%");
        }

    }
}

整体项目结构

五、总结

这里的测试案例是分库分表最简单的配置,主要是为了初学者使用时体会一下效果,入门的搭建起来后面的公司项目才能一点一点进行复杂配置。

猜你喜欢

转载自blog.csdn.net/weixin_33613947/article/details/121124755