# sharding-mybatis **Repository Path**: phial3/sharding-mybatis ## Basic Information - **Project Name**: sharding-mybatis - **Description**: No description available - **Primary Language**: Java - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-02-25 - **Last Updated**: 2024-03-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # starters-sharding Production ready simple sharding tool for mybatis. 生产可用的简单的基于mybatis的分库分表工具, 目前已经应用于生产环境。 为啥要使用他? - 支持不同种的数据源,只要实现了 标准的jdbc 和datasource相关接口都可以使用 - 支持不同类型数据源混用,分库分表 - 支持任何对应数据库的SQL语法, 这个是基于AST语法树的ShardingSphere不具备的 - 效率非常高, 整个组件在性能损耗方面可以忽略不计 ## 简介: ## 功能列表 - 多数据源支持 - 支持分库分表(仅支持long类型的sharding Key) - 支持只分库 - 支持只分表 - 支持使用事务 (参考示例) - 支持分库分表规则自定义(aviator 表达式引擎) - 支持不同数据源混用 ## 使用说明 ### 1. 引入依赖, 最好禁用掉spring-boot 的自身datasource装配,因为没用 ```xml com.winjeg.spring sharding-mybatis 1.0.0-SNAPSHOT ``` ### 2. 配置好数据源 ```yaml datasource: list: - name: demo-1 driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://10.10.10.10:3306/demo_1?useSSL=false&useUnicode=true&characterEncoding=UTF-8 username: demo_user password: 123456 - name: demo-2 driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://10.10.10.10:3306/demo_2?useSSL=false&useUnicode=true&characterEncoding=UTF-8 username: demo_user password: 123456 ``` ### 3. 开启分库分表支持的配置 ```java @SpringBootApplication @EnableSharding(packages = {"com.winjeg.spring.test.mapper", "com.winjeg.spring.test.dao"}) public class SpringApplicationDemo { public static void main(String[] args) { SpringApplication.run(SpringApplicationDemo.class, args); } } ``` ### 4. 在mapper上添加注解 & 标记出分表键, 如不需要分库分表, 仅配置datasource 和 mapperLocation ```java @Sharding(datasource = {"demo-1", "demo-2"}, mapperLocation = "classpath:mappers/demo/*.xml", dbRule = "'demo-' + (id % 16 / 8 + 1)", tableRule = "'user_' + (id % 16 % 4)", shardingKey = "id") public interface ShardingMapper { int updateUser(@ShardingKey @Param("id") final long id, @Param("name") final String name); } ``` > 样例Mapper ```xml INSERT INTO ${tableName} (id, name) VALUES(#{id}, #{name}) UPDATE ${tableName} SET name=#{name} WHERE id = #{id} ``` > 注: 在不分库分表的时候, datasource只能设置一个, 设置多个则无用 > 仅分库的时候,只设置 dbRule, 仅分表的时候设置 tableRule ### 5. 代码中使用 ```java @Autowired private NormalMapper testMapper; @Autowired private WonderMapper wonderMapper; @GetMapping("/normal") public List noneSharding(@RequestParam(value = "uid", defaultValue = "1") final long userId){ val tables=testMapper.getTables(); tables.add(wonderMapper.getUser()); return tables; } ``` 使用事务 ```java @GetMapping("/trans") public String Sharding(@RequestParam(value = "uid", defaultValue = "1") final long userId, @RequestParam(value = "name", defaultValue = "") final String name){ val manager=transactionManager.getTransactionManager(ShardingMapper.class,userId); TransactionStatus status=manager.getTransaction(definition); try{ if(shardingMapper.addUser(userId,name)< 1){ manager.rollback(status); return"add_trans_fail"; } if(shardingMapper.updateUser(userId,name+"updated")< 1){ manager.rollback(status); return"update_trans_fail"; } manager.commit(status); return"trans_success"; }catch(Exception e){ manager.rollback(status); } return"trans_fail"; } ```