Sharding-JDBC学习(一)——创建一般ORM框架需要的DataSource接口

    引文:Sharding-Jdbc是通过ShardingDataSourceFactory工厂通过规则配置获取对象ShardingDataSourceShardingDataSource实现了自JDBC标准的DataSource接口,然后程序可以通过ShardingDataSource选择使用原生的JDBC或者使用JPA,MyBatis等ORM框架进行操作数据库的开发

0.pom文件-说明Sharding-JDBC版本

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <sharding-sphere.version>3.0.0.M4</sharding-sphere.version>
        <mybatis.version>3.4.2</mybatis.version>
        <mybatis-spring.version>1.3.0</mybatis-spring.version>
        <spring-framework.version>4.3.6.RELEASE</spring-framework.version>
        <mysql-connector-java.version>5.1.42</mysql-connector-java.version>
        <slf4j.version>1.7.7</slf4j.version>
        <logback.version>1.2.0</logback.version>
        <commons-dbcp.version>1.4</commons-dbcp.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>${commons-dbcp.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector-java.version}</version>
        </dependency>
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>${sharding-sphere.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

    </dependencies>

    <build>

        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

        </plugins>

    </build>

1.分片规则配置文件类——ShardingRuleConfiguration

属性名称 数据类型 说明
tableRuleConfigs Collection<TableRuleConfiguration>

分片规则列表,是集合类型,可以配置多张表的

分片规则

bindingTableGroups Collection<String>

绑定表规则列表 ,

关联多表查询的时候避免笛卡尔积的组合出现

defaultDatabaseShardingStrategyConfig ShardingStrategyConfiguration 默认分库策略
defaultTableShardingStrategyConfig ShardingStrategyConfiguration 默认分表策略
defaultKeyGeneratorClass String

默认自增列值生成器,缺省使用

io.shardingjdbc.core.keygen.DefaultKeyGenerator

masterSlaveRuleConfigs Collection<MasterSlaveRuleConfiguration> 读写分离规则,缺省表示不使用读写分离

        //  分库策略 - > 采用 user_id%2 来进行分库 主要定位数据库
        //  user_id是偶数存储到 0库
        //  user_id是奇数存储到 1库
        shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(
                new InlineShardingStrategyConfiguration(
                        "user_id",
                        "orders_${user_id%2}")
        );
        //  分表策略 - > 分片字段 使用 order_id
        shardingRuleConfig.setDefaultTableShardingStrategyConfig(
            new StandardShardingStrategyConfiguration(
                    "order_id",
                    new PreciseShardingAlgorithm<Long>() {
                        @Override
                        public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
                            for(String targetName : availableTargetNames){
                                String modVal = String.valueOf((shardingValue.getValue() % 2));
                                //奇数订单保存到1表
                                //偶数订单保存到0表
                                if(targetName.endsWith(modVal)){
                                    return targetName;
                                }
                            }
                            throw new UnsupportedOperationException();
                        }
                    }
            )
        );

2.表分片规则配置类——TableRuleConfiguration

属性名称 数据类型 说明
logicTable String 逻辑表名称
actualDataNodes String

1) 由数据源名 + 表名组成 以小数点分割,多个表以逗号隔开,支持inline表达式

2) 缺省时,以已知 数据源名称和逻辑表名称生成数据节点

3)用于广播表 --即每个库中都需要一个同样的表进行关联查询,多为字典表

4)只分库不分表且所有库的表结构完全一致的情况

databaseShardingStrategyConfig ShardingStrategyConfiguration

默认分库策略 缺省表示使用默认分库策略,

即ShardingRuleConfiguration中配置的分库策略

tableShardingStrategyConfig ShardingStrategyConfiguration 默认分表策略 缺省表示使用默认分表策略
keyGeneratorColumnName String 自增列 名称,缺省表示不使用自增主键生成器
keyGeneratorClass String 自增列值生成器,缺省表示使用默认自增主键生成器
logicIndex String 逻辑索引名称
    /**
     * 也就说配置,
     *      1) 有多少个库
     *      2) 逻辑表名
     *      3) 库名和表名的对应关系
     *      4) 分片键
     * @return
     */
    private static TableRuleConfiguration constOrderTableRuleConfig(){
        TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration();
        // 逻辑表
        tableRuleConfig.setLogicTable("t_order");
        // 物理表
        // orders_${0..1}   - > orders_0 orders_1 数据库名
        // t_order_${0..1}  - > t_order_0 t_order_1 表名
        // 数据库名和表名使用 . 连接符连接起来
        String actualDataNode = "orders_${0..1}.t_order_${0..1}";
        tableRuleConfig.setActualDataNodes(actualDataNode);
        // 分片键列名 - 订单ID
        tableRuleConfig.setKeyGeneratorColumnName("order_id");
        return tableRuleConfig;
    }

3.创建数据源

        Properties prop = new Properties();
        //打印SQL语句
        prop.setProperty("sql.show","true");
        DataSource dataSource = ShardingDataSourceFactory.createDataSource(
                dataSourceMap,// 多数据源信息
                shardingRuleConfig,// 分库分表规则配置
                new ConcurrentHashMap<>(),
                prop);

猜你喜欢

转载自blog.csdn.net/lihongtai/article/details/86062900
今日推荐