zoukankan      html  css  js  c++  java
  • 【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,操作的时候需要注意很多地方都需要带上分库分表字段,不然就无法操作
    • 配置其实并不难,但是很容易写错
  • 相关阅读:
    初探Object Pascal的类(一)
    初探Object Pascal的类(二)
    强制类型转换(Casting)
    初探Object Pascal的类(三)
    子界类型(Subrange types)
    浅析枚举类型(Enumerated types)
    指针(Pointer)
    浅谈WEBGIS运用栅格地图实现原理[更新:Google Maps带来的新型WebGIS设计模式]
    算我给Google本地和E都市做个广告吧
    Google地图的配色问题(以及MapBar和51ditu)
  • 原文地址:https://www.cnblogs.com/xlecho/p/14860087.html
Copyright © 2011-2022 走看看