上文我们已经完成了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,操作的时候需要注意很多地方都需要带上分库分表字段,不然就无法操作
- 配置其实并不难,但是很容易写错