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

上文我们已经完成了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,操作的时候需要注意很多地方都需要带上分库分表字段,不然就无法操作
  • 配置其实并不难,但是很容易写错
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 我可以为你提供一些关于使用SpringBoot ShardingJDBC MyBatis进行分库分表的建议,例如:1. 使用ShardingSphere框架定义数据库分片策略;2. 使用MyBatis实现MyBatis SQL脚本;3. 使用SpringBoot注解的方式定义数据源和ShardingJDBC的配置。 ### 回答2: 使用SpringBoot ShardingJDBCMyBatis可以很方便地实现分库分表功能。首先,ShardingJDBC是一个轻量级的数据库中间件,可以将数据分散到不同的数据库实例中,从而实现分库的效果。其次,MyBatis是一个流行的持久层框架,可以通过XML或注解的方式与数据库进行交互。 在使用SpringBoot ShardingJDBCMyBatis分库分表时,首先需要配置ShardingJDBC的数据源和分片规则。可以通过编写一个配置类来配置分库分表的规则,例如可以根据某个字段的取值来确定数据应该分散到哪个库或表中。配置完成后,就可以在MyBatis的Mapper接口中直接使用分库分表的数据源,从而实现对不同数据库或表的访问。 在编写Mapper接口时,可以使用MyBatis提供的注解或XML方式来编写SQL语句。在SQL语句中,可以使用ShardingJDBC提供的分片键来实现对特定库或表的访问。例如,在需要查询特定表的数据时,可以使用ShardingJDBC提供的Hint注解将查询操作路由到相应的表上。 总的来说,使用SpringBoot ShardingJDBCMyBatis可以实现简单、高效的分库分表功能。通过配置ShardingJDBC的分片规则和使用MyBatis编写SQL语句,可以将数据分散到不同的数据库实例和表中,从而实现了水平扩展和负载均衡的效果。这种方式能够帮助我们提高数据库的性能和容量,从而更好地应对大规模的数据存储需求。 ### 回答3: 使用SpringBoot ShardingJDBC MyBatis可以轻松实现分库分表。 首先,ShardingJDBC是一个分库分表的开源框架,它可以通过数据库中间件实现数据的分散存储。而SpringBoot是一个快速构建项目的框架,可以帮助开发者轻松集成各种组件。 使用SpringBoot ShardingJDBC MyBatis进行分库分表,首先需要配置ShardingJDBC的数据源、分片策略以及分表策略。可以通过配置文件或者编程方式来完成配置。配置数据源时,可以指定多个数据库的连接信息,并使用分片策略将数据分配到不同的数据库中。配置分表策略时,可以指定不同的分表规则,将数据根据一定的规则分散存储在不同的表中。 在具体的业务逻辑中,可以使用MyBatis来操作数据库MyBatis是一个简化数据库访问的持久层框架,通过编写SQL语句和映射文件,可以轻松实现数据库增删改查操作。 在访问数据库时,ShardingJDBC会根据配置的分片策略和分表策略,自动将数据路由到指定的数据库和表中。开发者不需要关心数据的具体存储位置,只需要使用MyBatis的API进行数据操作即可。 使用SpringBoot ShardingJDBC MyBatis进行分库分表,可以提高数据库的读写性能,增加数据的存储容量,并且可以实现数据的动态扩容和迁移。此外,由于SpringBootMyBatis的高度集成,开发者可以更加方便地进行开发和维护。 总之,使用SpringBoot ShardingJDBC MyBatis进行分库分表可以帮助开发者更好地管理数据,提升系统的性能和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xlecho

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值