不应用Spring

引入Maven依赖

<dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-jdbc-core</artifactId>    <version>${sharding-sphere.version}</version></dependency>

基于Java编码的规定配置

Sharding-JDBC的分库分表通过规定配置形容,以下例子是依据user_id取模分库, 且依据order_id取模分表的两库两表的配置。

    // 配置实在数据源    Map<String, DataSource> dataSourceMap = new HashMap<>();        // 配置第一个数据源    BasicDataSource dataSource1 = new BasicDataSource();    dataSource1.setDriverClassName("com.mysql.jdbc.Driver");    dataSource1.setUrl("jdbc:mysql://localhost:3306/ds0");    dataSource1.setUsername("root");    dataSource1.setPassword("");    dataSourceMap.put("ds0", dataSource1);        // 配置第二个数据源    BasicDataSource dataSource2 = new BasicDataSource();    dataSource2.setDriverClassName("com.mysql.jdbc.Driver");    dataSource2.setUrl("jdbc:mysql://localhost:3306/ds1");    dataSource2.setUsername("root");    dataSource2.setPassword("");    dataSourceMap.put("ds1", dataSource2);        // 配置Order表规定    TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order","ds${0..1}.t_order${0..1}");        // 配置分库 + 分表策略    orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}"));    orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}"));        // 配置分片规定    ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();    shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);        // 省略配置order_item表规定...    // ...        // 获取数据源对象    DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());

基于Yaml的规定配置

或通过Yaml形式配置,与以上配置等价:

dataSources:  ds0: !!org.apache.commons.dbcp.BasicDataSource    driverClassName: com.mysql.jdbc.Driver    url: jdbc:mysql://localhost:3306/ds0    username: root    password:   ds1: !!org.apache.commons.dbcp.BasicDataSource    driverClassName: com.mysql.jdbc.Driver    url: jdbc:mysql://localhost:3306/ds1    username: root    password:     shardingRule:  tables:    t_order:       actualDataNodes: ds${0..1}.t_order${0..1}      databaseStrategy:         inline:          shardingColumn: user_id          algorithmExpression: ds${user_id % 2}      tableStrategy:         inline:          shardingColumn: order_id          algorithmExpression: t_order${order_id % 2}    t_order_item:       actualDataNodes: ds${0..1}.t_order_item${0..1}      databaseStrategy:         inline:          shardingColumn: user_id          algorithmExpression: ds${user_id % 2}      tableStrategy:         inline:          shardingColumn: order_id          algorithmExpression: t_order_item${order_id % 2}
    DataSource dataSource = YamlShardingDataSourceFactory.createDataSource(yamlFile);

应用原生JDBC

通过ShardingDataSourceFactory或者YamlShardingDataSourceFactory工厂和规定配置对象获取ShardingDataSource,ShardingDataSource实现自JDBC的标准接口DataSource。而后可通过DataSource抉择应用原生JDBC开发,或者应用JPA, MyBatis等ORM工具。
以JDBC原生实现为例:

DataSource dataSource = YamlShardingDataSourceFactory.createDataSource(yamlFile);String sql = "SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.user_id=? AND o.order_id=?";try (        Connection conn = dataSource.getConnection();        PreparedStatement preparedStatement = conn.prepareStatement(sql)) {    preparedStatement.setInt(1, 10);    preparedStatement.setInt(2, 1001);    try (ResultSet rs = preparedStatement.executeQuery()) {        while(rs.next()) {            System.out.println(rs.getInt(1));            System.out.println(rs.getInt(2));        }    }}

应用Spring

引入Maven依赖

<!-- for spring boot --><dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>    <version>${sharding-sphere.version}</version></dependency><!-- for spring namespace --><dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-jdbc-spring-namespace</artifactId>    <version>${sharding-sphere.version}</version></dependency>

基于Spring boot的规定配置

spring.shardingsphere.datasource.names=ds0,ds1spring.shardingsphere.datasource.ds0.type=org.apache.commons.dbcp2.BasicDataSourcespring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds0spring.shardingsphere.datasource.ds0.username=rootspring.shardingsphere.datasource.ds0.password=spring.shardingsphere.datasource.ds1.type=org.apache.commons.dbcp2.BasicDataSourcespring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1spring.shardingsphere.datasource.ds1.username=rootspring.shardingsphere.datasource.ds1.password=spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_idspring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order$->{0..1}spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_idspring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order$->{order_id % 2}spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds$->{0..1}.t_order_item$->{0..1}spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_idspring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item$->{order_id % 2}

基于Spring boot + JNDI的规定配置

如果您打算应用Spring boot + JNDI的形式,在利用容器(如Tomcat)中应用Sharding-JDBC时,可应用spring.shardingsphere.datasource.${datasourceName}.jndiName来代替数据源的一系列配置。
如:

spring.shardingsphere.datasource.names=ds0,ds1spring.shardingsphere.datasource.ds0.jndi-name=java:comp/env/jdbc/ds0spring.shardingsphere.datasource.ds1.jndi-name=jdbc/ds1spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_idspring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order$->{0..1}spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_idspring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order$->{order_id % 2}spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds$->{0..1}.t_order_item$->{0..1}spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_idspring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item$->{order_id % 2}

基于Spring命名空间的规定配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:sharding="http://shardingsphere.apache.org/schema/shardingsphere/sharding"     xsi:schemaLocation="http://www.springframework.org/schema/beans                         http://www.springframework.org/schema/beans/spring-beans.xsd                        http://shardingsphere.apache.org/schema/shardingsphere/sharding                         http://shardingsphere.apache.org/schema/shardingsphere/sharding/sharding.xsd                         ">    <bean id="ds0" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">        <property name="driverClassName" value="com.mysql.jdbc.Driver" />        <property name="url" value="jdbc:mysql://localhost:3306/ds0" />        <property name="username" value="root" />        <property name="password" value="" />    </bean>    <bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">        <property name="driverClassName" value="com.mysql.jdbc.Driver" />        <property name="url" value="jdbc:mysql://localhost:3306/ds1" />        <property name="username" value="root" />        <property name="password" value="" />    </bean>        <sharding:inline-strategy id="databaseStrategy" sharding-column="user_id" algorithm-expression="ds$->{user_id % 2}" />    <sharding:inline-strategy id="orderTableStrategy" sharding-column="order_id" algorithm-expression="t_order$->{order_id % 2}" />    <sharding:inline-strategy id="orderItemTableStrategy" sharding-column="order_id" algorithm-expression="t_order_item$->{order_id % 2}" />        <sharding:data-source id="shardingDataSource">        <sharding:sharding-rule data-source-names="ds0,ds1">            <sharding:table-rules>                <sharding:table-rule logic-table="t_order" actual-data-nodes="ds$->{0..1}.t_order$->{0..1}" database-strategy-ref="databaseStrategy" table-strategy-ref="orderTableStrategy" />                <sharding:table-rule logic-table="t_order_item" actual-data-nodes="ds$->{0..1}.t_order_item$->{0..1}" database-strategy-ref="databaseStrategy" table-strategy-ref="orderItemTableStrategy" />            </sharding:table-rules>        </sharding:sharding-rule>    </sharding:data-source></beans>

在Spring中应用DataSource

间接通过注入的形式即可应用DataSource,或者将DataSource配置在JPA、Hibernate或MyBatis中应用。

@Resourceprivate DataSource dataSource;

规定配置包含数据源配置、表规定配置、分库策略和分表策略组成。这只是最简略的配置形式,理论应用可更加灵便,如:多分片键,分片策略间接和表规定配置绑定等。更多的具体配置请参考配置手册。