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

上文我们已经完成了springboot整合jdbc>shardingjdbc并且拿到了有效的DataSource,那证明我们已经可以通过jdbc>shardingjdbc的连接来操作数据库。本文我们将使用springboot整合jdbc>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.jdbc>shardingjdbc.po
  • 启动类上添加dao扫描配置
@MapperScan("com.echo.jdbc>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.jdbc>shardingjdbc.dao.TOrderDao">
    <resultMap id="BaseResultMap" type="com.echo.jdbc>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.jdbc>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.jdbc>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}

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

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

到这里我们就已经完成了基本的代码编写,我们可以启动项目来看看,是否能够启动成功,如果失败,需要检查配置。如果成功,那我们就可以做一些操作来观察jdbc>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作为条件,不然它会早不到库表。
在这里插入图片描述

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

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

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

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

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

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

总结

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

http://www.niftyadmin.cn/n/1638647.html

相关文章

周末没来

家里没有装宽带&#xff0c;所以周末没有上来&#xff0c;今天周一&#xff0c;有点疲倦。转载于:https://www.cnblogs.com/liang_jumps/archive/2004/10/18/53851.html

摄像机的工作原理

摄像机是一种把景物光像转变为电信号的装置。其结构大致可分为三部分&#xff1a;光学系统&#xff08;主要指镜头&#xff09;、光电转换系统&#xff08;主要指摄像管或固体摄像器件&#xff09;以及电路系统&#xff08;主要指视频处理电路&#xff09;。光学系统的主要部件…

有趣

今天发现一个很有趣的事情&#xff1a;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />两个座位相邻的同事&#xff0c;居然一个英文名叫Gump&#xff0c;另一个叫Jenny&#xff0c;我汗死了...转载于:https://www.cnblogs.com/…

【ShardingSphere】springboot整合shardingjdbc按照年月分库分表

上文中我们实现了SpringBoot整合shardingjdbcmybatis&#xff0c;其中我们分库分表的时候选择的是根据id取模来进行分库分表。这种分库分表的形式是比较经典的方式&#xff0c;但是也有很多其他的分表的方式&#xff0c;比如按照年月日分库分表。本文将详细讲述按照年月日分表 …

YUV采样格式

1、YUV存储格式 YUV格式有两大类&#xff1a;planar和packed。 对于planar的YUV格式&#xff0c;先连续存储所有像素点的Y&#xff0c;紧接着存储所有像素点的U&#xff0c;随后是所有像素点的V。 对于packed的YUV格式&#xff0c;每个像素点的Y,U,V是连续交*存储的。 2、YUV分…

XML HTTP Request object简单使用

在Web开发中&#xff0c;有时我们希望页面提交但又不刷新当前页&#xff0c;此时可以使用XML HTTP Request object来做处理&#xff0c;例如如下代码&#xff1a; <HTML><HEAD><TITLE></TITLE><script language"javascript"> function…

HttpClient实战爬虫B站番剧

准备 我们打开一个b站首页&#xff0c;选择番剧索引。 https://www.bilibili.com/anime/index/#season_version-1&area-1&is_finish-1&copyright-1&season_status-1&season_month-1&year-1&style_id-1&order3&st1&sort0&page1 …

【ShardingSphere】springboot整合shardingjdbc使用精确分片算法自定义分库分表

上两篇文章讲到了两种分库分表的方式&#xff0c;这两种方式可以归结为一种类型&#xff0c;都是通过配置的形式来分片数据。本文我们继续讲解一种新的方式来分片数据&#xff0c;除了配置的形式外&#xff0c;shardingjdbc还支持通过代码来自定义规则。 自定义规则 之前我们实…