Sharding-jdbc 分库分表专题内容(二)springboot+mybatis+Hikari

摘要:
一、单库分表pom.xml配置˂?

一、单库分表

pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!--lookup parent from repository -->
    </parent>
    <groupId>com.payne</groupId>
    <artifactId>sprintboot-sharding</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <mybatis.version>2.1.0</mybatis.version>
        <sharding.jdbc.version>3.0.0</sharding.jdbc.version>
        <druid.version>1.1.10</druid.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>${sharding.jdbc.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!--lookup parent from repository -->
    </parent>
    <groupId>com.payne</groupId>
    <artifactId>sprintboot-sharding</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <mybatis.version>2.1.0</mybatis.version>
        <sharding.jdbc.version>3.0.0</sharding.jdbc.version>
        <druid.version>1.1.10</druid.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>${sharding.jdbc.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

添加实体类

@Getter
@Setter
@ToString
public classUser {
    privateLong id;
    privateString name;
    privateLong cityId;
    privateString sex;
}

创建Mapper

public interfaceUserMapper {
    /*** 保存
     */
    voidsave(User user);

    /*** 查询
     * @paramid
     * @return
     */User get(Long id);
}
<?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.payne.user.mapper.UserMapper">
    <insert id="save"parameterType="com.payne.user.model.User">INSERT INTO t_user(name,city_id,sex)
        VALUES
        (
        #{name},#{cityId},#{sex}
        )
    </insert>

    <select id="get"parameterType="long"resultType="com.payne.user.model.User">select * from t_user where id = #{id}
    </select>
</mapper>

Controller

@RestController
@RequestMapping("/user")
public classUserController {

    @Autowired
    privateUserMapper userMapper;

    @GetMapping("/save")
    publicString save() {
        for (int i = 0; i <10 ; i++) {
            User user=newUser();
            user.setName("test"+i);
            user.setSex(i%2==0?"M":"F");
            userMapper.save(user);
        }

        return "success";
    }

    @GetMapping("/get/{id}")
    publicUser get(@PathVariable Long id) {
        User user =userMapper.get(id);
        System.out.println(user.getId());
        returnuser;
    }
}

application.properties

spring.application.name=sharding-springboot-mybatis
# mybatis
mybatis.mapper-locations=classpath*:mapper/**/*.xml
# 数据源 db0,db1,db2
sharding.jdbc.datasource.names=db0
# 数据源ds0
sharding.jdbc.datasource.db0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.db0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.db0.jdbc-url=jdbc:mysql://localhost:3306/db0?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
sharding.jdbc.datasource.db0.username=root
sharding.jdbc.datasource.db0.password=1234

sharding.jdbc.config.sharding.default-data-source-name=db0
sharding.jdbc.config.sharding.binding-tables=t_user
#数据节点,均匀分布
sharding.jdbc.config.sharding.tables.t_user.actualDataNodes=db0.t_user${0..1}
#指定主键名称,sharding-jdbc默认生成主键策略为雪花算法(SnowFlake)
sharding.jdbc.config.sharding.tables.t_user.keyGeneratorColumnName=id
#分表策略 行表达式
sharding.jdbc.config.sharding.tables.t_user.tableStrategy.inline.shardingColumn=sex
#分表策略 按条件运算 性别等于M的存入t_user0表,其它存入t_user1表
sharding.jdbc.config.sharding.tables.t_user.tableStrategy.inline.algorithmExpression=t_user$->{sex.equalsIgnoreCase("M")?0:1}

# 打印执行的数据库以及语句
sharding.jdbc.config.sharding.props.sql.show=true

初始化sql

CREATE TABLE`t_user0` (
  `id` bigint(20) NOT NULL,
  `name` varchar(64) DEFAULT NULL COMMENT '名称',
  `sex` varchar(2) DEFAULT NULL COMMENT '性别',
  `city_id` int(12) DEFAULT NULL COMMENT '城市',
  PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE`t_user1` (
  `id` bigint(20) NOT NULL,
  `name` varchar(64) DEFAULT NULL COMMENT '名称',
  `sex` varchar(2) DEFAULT NULL COMMENT '性别',
  `city_id` int(12) DEFAULT NULL COMMENT '城市',
  PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

分析执行结果

分片策略:sharding.jdbc.config.sharding.tables.t_user.tableStrategy.inline.algorithmExpression=t_user$->{sex.equalsIgnoreCase(“M”)?0:1}

http://localhost:8080/user/save

一个简单的水平分片单库分表就完成了。进行测试就发现数据分别存储到t_user0和t_user1两个表中。这里采用的事按照字段sex类型分片存储。
在这里插入图片描述

二、分库分表

application.properties

# 第二个数据库
sharding.jdbc.datasource.db1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.db1.jdbc-url=jdbc:mysql://localhost:3306/db1?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
sharding.jdbc.datasource.db1.username=root
sharding.jdbc.datasource.db1.password=1234

# 水平拆分的数据库(表) 配置分库 +分表策略 行表达式分片策略
# 分库策略
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=db$->{id % 2}
#数据节点,均匀分布
sharding.jdbc.config.sharding.tables.t_user.actualDataNodes=db$->{0..1}.t_user${0..1}
@GetMapping("/save")
publicString save() {
    for (int i = 0; i <10 ; i++) {
        User user=newUser();
        #设置id
        user.setId(Long.valueOf(i));
        user.setName("test"+i);
        user.setSex(i%2==0?"M":"F");
        userMapper.save(user);
    }

    return "success";
}

分析结果

在这里插入图片描述
根据sharding-jdbc日志,可以看出sharding-jdbc的执行步骤:

SQL解析sql改写sql路由sql执行结果合并

ShardingSphere 官方文档

集成PageHelper进行分页操作

<dependency>
     <groupId>com.github.pagehelper</groupId>
     <artifactId>pagehelper-spring-boot-starter</artifactId>
     <version>1.2.12</version>
 </dependency>
@GetMapping("/all")
public List<User>selectAll() {
    PageHelper.startPage(2, 5);
    List<User> list =userMapper.selectAll();
    returnlist;
}

Sharding-jdbc 分库分表专题内容(二)springboot+mybatis+Hikari第3张

Sharding-jdbc 完全支持Pagehelp分页操作。

转载于:https://blog.csdn.net/weixin_42338555/article/details/104818990?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

免责声明:文章转载自《Sharding-jdbc 分库分表专题内容(二)springboot+mybatis+Hikari》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ASP操作COOKIEMongoDB 3.4.2 安装填坑下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JDBC 基础入门

由于我也是初学参考的是网上的或者是培训机构的资料所以可能会有错误的信息,仅供参考 一、什么是JDBC(Java Data Base Connectivity)? java程序连接数据库,JDBC是由SUN公司提出的一组规范,这组规范主要由一组接口构成,主要作用就是访问数据库。 二、JDBC核心思想【思想重要】     三、核心API【重点】      ...

springboot postgresql druid连接池和jpa,jdbctemplate执行sql查询

1.maven依赖配置(pom.xml) 1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter</...

JDBC高级特性(一)结果集,批量更新

一、ResultSet的高级特性 1 可滚动ResultSet    1)向前和向后滚动    滚动特性 在JDBC初期版本号中, ResultSet仅能向前滚动 在JDBC兴许版本号中, ResultSet默认能向前滚动或前后滚动 迟缓滚动:记录集可前后滚动。不受数据库数据更新影响 灵敏滚动:记录集可前后滚动,受数据库数据更新影响 由结果集类型设定 c...

Flink实战(八十三):FLINK-SQL应用场景(一)维表join(五)Flink SQL之维表join之Temporal Table Join

https://zhuanlan.zhihu.com/p/165962937?utm_source=qq 维表是数仓中的一个概念,维表中的维度属性是观察数据的角度,在建设离线数仓的时候,通常是将维表与事实表进行关联构建星型模型。在实时数仓中,同样也有维表与事实表的概念,其中事实表通常存储在kafka中,维表通常存储在外部设备中(比如MySQL,HBase)...

Weblogic常用监控指标

JMSRuntime JMSServersCurrentCount 返回当前JMS服务的连接数ConnectionsCurrentCount 返回本JMS服务器上当前的连接数JMSServersHighCount 返回自服务器启动后JMS服务的最大连接数ConnectionsHighCount 返回本JMS服务器自上次重置后的最大连接数 JVMRuntim...

浅谈Slick(4)- Slick301:我的Slick开发项目设置

前面几篇介绍里尝试了一些Slick的功能和使用方式,看来基本可以满足用scala语言进行数据库操作编程的要求,而且有些代码可以通过函数式编程模式来实现。我想,如果把Slick当作数据库操作编程主要方式的话,可能需要先制定一套比较规范的模式来应付日常开发(也要考虑团队开发)、测试和维护。首先从项目结构来说,我发现由Intellij-Idea IDE界面直接产...