当一个表的某些字段过大,就需要将其拆成几个表,但是其拆出来的表最好在一个库中
也就是同一条完整的字段信息最好在一个库中(因为不能跨库操作) 

接下来对PositionDetail做的步骤:添加实体类、添加repository、添加配置信息、添加测试即可
1、开始编辑代码
a、追加实体类
package com.slin.entity;import javax.persistence.*;import java.io.Serializable;@Entity@Table(name = "position_detail")public class PositionDetail implements Serializable {@Id@Column(name = "id")@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;@Column(name = "pid")private long pid;@Column(name = "description")private String description;public long getId() {return id;}public void setId(long id) {this.id = id;}public long getPid() {return pid;}public void setPid(long pid) {this.pid = pid;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}}
b、添加repository
package com.slin.repository;
import com.slin.entity.PositionDetail;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PositionDetailRepository extends JpaRepository<PositionDetail,Long> {
}
c、添加配置信息
在application-sharding-database.properties中添加分片的配置信息
######datasource(数据源,有两个库)#######
spring.shardingsphere.datasource.names=ds0,ds1
######配置第一个库#######
#使用连接池
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
#使用驱动
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
#数据库连接(如果是服务器的就只需要把localhost改为服务器的ip即可)
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/lagou1
#数据库用户和密码
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root
######配置第二个库#######
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://localhost:3306/lagou2
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
###########sharding-database(切分的策略)########
#position表按库分(database-strategy),分片键是id
spring.shardingsphere.sharding.tables.position.database-strategy.inline.sharding-column=id
#如何定位呢,是根据ds$->{id % 2}来定位
spring.shardingsphere.sharding.tables.position.database-strategy.inline.algorithm-expression=ds$->{id % 2}
#position_detail表按库分(database-strategy),分片键是pid(其实是上面的id)
spring.shardingsphere.sharding.tables.position_detail.database-strategy.inline.sharding-column=pid
#如何定位呢,是根据ds$->{pid % 2}来定位
spring.shardingsphere.sharding.tables.position_detail.database-strategy.inline.algorithm-expression=ds$->{pid % 2}
########对position表的操作###########
#id的主键生成器(配置之后就会采用系统内置的雪花算法)
spring.shardingsphere.sharding.tables.position.key-generator.column=id
#spring.shardingsphere.sharding.tables.position.key-generator.type=SNOWFLAKE
#改为自定义的主键类型
spring.shardingsphere.sharding.tables.position.key-generator.type=LAGOUKEY
########对position_detail表的操作###########
#id的主键生成器(配置之后就会采用系统内置的雪花算法)
spring.shardingsphere.sharding.tables.position_detail.key-generator.column=id
spring.shardingsphere.sharding.tables.position_detail.key-generator.type=SNOWFLAKE
d、添加测试类
package com.slin.test;
import com.slin.RunBoot;
import com.slin.entity.Position;
import com.slin.entity.PositionDetail;
import com.slin.repository.PositionDetailRepository;
import com.slin.repository.PositionRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
//通过它来启动
@RunWith(SpringRunner.class)
//通过RunBoot来创建boot容器
@SpringBootTest(classes = RunBoot.class)
public class TestSharding {
    @Resource
    private PositionRepository positionRepository;
    @Resource
    private PositionDetailRepository positionDetailRepository;
    @Test
    public void testAdd2(){
        for(int i=1;i<=20;i++){
            Position position = new Position();
            // position.setId(i);
            position.setName("lagou"+i);
            position.setSalary("1000000");
            position.setCity("beijing");
            positionRepository.save(position);
            PositionDetail positionDetail = new PositionDetail();
            positionDetail.setPid(position.getId());
            positionDetail.setDescription("this is test"+i);
            positionDetailRepository.save(positionDetail);
        }
    }
}
e、效果图查看
一张大表成功拆到同一个库(lagou1库)的两张表
后面查询一条完整信息,就不用担心垮库的问题了
       
总结:表的分片规则很重要,必须在同一个库中(查询时候就还是相当于在一个表中)
f、查询SQL样例
在repository中可以添加以下信息,进行查询展示
 @Query(nativeQuery = true,value = “select p.id,p.name,p.salary,p.city,pd.description from position p join position_detail pd on(p.id=pd.pid) where p.id=:id”)     public Object findPositionsById(@Param(“id”) long id);
