【ShardingSphere】springboot整合shardingjdbc+mybatis进行增删改查

888 阅读3分钟

上文我们已经完成了springboot整合shardingjdbc并且拿到了有效的DataSource,那证明我们已经可以通过shardingjdbc的连接来操作数据库。本文我们将使用springboot整合shardingjdbc+mybatis,真正的实现分库分表的操作。大佬请略过


整合mybatis

  • 添加mybatis依赖
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>
  • 构建好项目结构,添加mybatis的配置 在这里插入图片描述
mybatis.mapper-locations=classpath:mapping/*.xml
mybatis.type-aliases-package=com.echo.shardingjdbc.po
  • 启动类上添加dao扫描配置
@MapperScan("com.echo.shardingjdbc.dao")
  • 逆向生成相应代码,主要编写增删改代码,代码如下:
/**
 * @author tang.sl
 * @date 2021/6/3 0003 下午 16:37
 */
@RestController
@RequestMapping("/order")
public class TOrderController {

    @Autowired
    private TOrderService tOrderService;

    @PostMapping("/save")
    public String save(@RequestBody TOrder tOrder) {
        tOrderService.save(tOrder);
        return "success";
    }

    @PostMapping("/delete")
    public String delete(@RequestParam(value = "id") Long id) {
        tOrderService.delete(id);
        return "success";
    }

    @PostMapping("/update")
    public int update(@RequestBody TOrder tOrder) {
        return tOrderService.update(tOrder);
    }

    @GetMapping("/getList")
    public List<TOrder> getList() {
        return tOrderService.getList();
    }

}

public interface TOrderService {
    void save(TOrder tOrder);

    void delete(Long id);

    int update(TOrder tOrder);

    List<TOrder> getList();
}

@Service
public class TOrderServiceImpl implements TOrderService {

    @Autowired
    private TOrderDao tOrderDao;

    @Override
    public void save(TOrder tOrder) {
        tOrderDao.insert(tOrder);
    }

    @Override
    public void delete(Long id) {
        tOrderDao.delete(id);
    }

    @Override
    public int update(TOrder tOrder) {
        return tOrderDao.update(tOrder);
    }

    @Override
    public List<TOrder> getList() {
        return tOrderDao.getList();
    }

}

public interface TOrderDao {

    void insert(TOrder tOrder);

    List<TOrder> getList();

    void delete(Long id);

    int update(TOrder tOrder);
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.echo.shardingjdbc.dao.TOrderDao">
    <resultMap id="BaseResultMap" type="com.echo.shardingjdbc.po.TOrder">
        <id column="id" jdbcType="BIGINT" property="id"/>
        <result column="user_id" jdbcType="INTEGER" property="userId"/>
        <result column="order_id" jdbcType="INTEGER" property="orderId"/>
        <result column="cloumn" jdbcType="VARCHAR" property="cloumn"/>
    </resultMap>
    <sql id="Base_Column_List">
        id, user_id, order_id, cloumn
    </sql>

    <insert id="insert" parameterType="com.echo.shardingjdbc.po.TOrder">
        insert into t_order (user_id, order_id, cloumn) value (#{userId}, #{orderId}, #{cloumn})
    </insert>

    <select id="getList" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from t_order
    </select>

    <delete id="delete" parameterType="java.lang.Long">
        delete from t_order
        where id = #{id,jdbcType=BIGINT}
    </delete>

    <update id="update" parameterType="com.echo.shardingjdbc.po.TOrder">
        update t_order
        set
          cloumn = #{cloumn,jdbcType=VARCHAR},
          order_id = #{orderId,jdbcType=INTEGER},
          user_id = #{userId,jdbcType=INTEGER}
        where id = #{id,jdbcType=BIGINT}
    </update>
</mapper>

项目结构如下 在这里插入图片描述

添加主键生成策略

spring.shardingsphere.sharding.tables.t_order.key-generator.column=id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE

调整分库分表策略

注意:多个字段来决定分库分表,对于入门来说会增加难度,也不好理清楚逻辑关系,所以这里先直接使用id来分库分表。具体配置如下:

# 配置分库策略
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{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=id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order$->{id % 2}

添加日志输出配置,方便观察shardingjdbc的具体操作

spring.shardingsphere.props.sql.show = true
logging.level.com.echo.shardingjdbc.dao=DEBUG

到这里我们就已经完成了基本的代码编写,我们可以启动项目来看看,是否能够启动成功,如果失败,需要检查配置。如果成功,那我们就可以做一些操作来观察shardingjdbc的操作

进入测试流程

  • 使用postman造点数据来调用我们之前编写好的接口 在这里插入图片描述

这里并不需要我们去手动输入id,我们在配置中配置了id生成策略,他会自动生成,最终我们可以看到程序会根据我们的分库规则,对id%2如果为0那么就会进入到ds0的库里面,如果为1那就会进入到ds1的库里面。那么如果id%2的时候,结果等于0那他就会进入t_order0表,等于1就会进入t_order1表。

在这里插入图片描述

我们可以看到id是4结尾,那就符合id%2等于0,所以他进入了ds0和t_order0跟我们上面说的规则一致

  • 测试update流程

update流程这里有一个注意事项,如果你是使用id分库分表的,那么更新的时候,一定需要有id作为条件,不然它会早不到库表。 在这里插入图片描述

使用这个实例来测试,最终我们可以看到shardingjdbc帮组我们把信息推送到了对应库里面,并且有效的进行了更新 在这里插入图片描述

当我们的条件是id的时候,可以看到它帮我们找到了库和表,但是如果更新的信息里面没有id那就会报错 在这里插入图片描述

原因就是,分库分表之后,如果更新,不用分库分表字段作为条件,它根本找不到需要更新的表

  • 删除和更新是一样的,这里就不赘述了

  • 查询 查询其实是相对简单的,我们可以根据分库分表字段去查询,也可以直接查全部,当查全部的时候,我们可以看到,它把对应的库表里面的信息全部拿出来了 在这里插入图片描述

截图的原因这里只显示了两条

总结

  • 使用shardingjdbc,操作的时候需要注意很多地方都需要带上分库分表字段,不然就无法操作
  • 配置其实并不难,但是很容易写错