当前位置: 代码迷 >> 综合 >> 【Sharding-JDBC】(二) 整合mybatis-plus 一主一从 读写分离
  详细解决方案

【Sharding-JDBC】(二) 整合mybatis-plus 一主一从 读写分离

热度:101   发布时间:2023-11-17 12:50:56.0

一.搭建数据库环境(一主一从 读写分离)

参考:MySQL5.7 主从同步环境搭建

在(一)Sharding-JDBC 整合mybatis-plus 单库分表的基础上增加了一台虚拟机,也创建了一个user_db库,并均创建t_user表。在/etc/my.cnf的mysql配置文件中配置主从同步。

数据库脚本:

(1)创建数据库
#创建数据库user_db
CREATE DATABASE `t_user` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';(2)在user_db中创建t_user表
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`user_id` bigint(20) NOT NULL COMMENT '用户id',
`fullname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户姓名',
`user_type` char(1) DEFAULT NULL COMMENT '用户类型',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

二、对(一)Sharding-JDBC 整合mybatis-plus 单库分表代码进行修改,完成Sharding-JDBC 整合mybatis-plus 一主一从 读写分离

1.application.yml(重要

############################一主一从,读写分离#################################
#服务端口
server:port: 56081
#服务名
spring:application:name: sharding-jdbc-exampleshttp:encoding:enabled: truecharset: utf-8force: truemain:allow-bean-definition-overriding: true#shardingsphere相关配置shardingsphere:datasource:names: m1,s1   #配置库的名字,随意m1:   #配置目前m1库的数据源信息type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.87.133:3306/user_db?useUnicode=trueusername: rootpassword: 123456s1:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.87.134:3306/user_db?useUnicode=trueusername: rootpassword: 123456sharding:master-slave-rules: #配置主从库的规则ms:   #随便起名,对应下面即可master-data-source-name: m1  #主库slave-data-source-names: s1  #从库,如果是多从库,以逗号结尾tables:t_user:actual-data-nodes: ms.t_user    #对应实际的真实表#masterslave:  # 主库从库逻辑数据源定义# name: ms# master-data-source-name: m1#  slave-data-source-names: s1# load-balance-algorithm-type: round_robinprops:sql:show: true   #打印sql#日志打印
logging:level:root: infoorg.springframework.web: infocom.lucifer.sharding.dao: debugdruid.sql: debug

2.实体类

新增一个user实体类,指定对应表名。

并添加将属性userId上添加@TableId(type=IdType.ID_WORKER);因为userId对应注解user_id,所以设置注解由mybatis-plus提供的雪花算法生成;

package com.lucifer.sharding.pojo;import java.io.Serializable;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;/*** t_user* @author */
@TableName(value = "t_user")
@Data
public class User implements Serializable {/*** 用户id*/@TableId(type= IdType.ID_WORKER)private Long userId;/*** 用户姓名*/private String fullname;/*** 用户类型*/private String userType;private static final long serialVersionUID = 1L;
}

3.UserDao接口

package com.lucifer.sharding.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lucifer.sharding.pojo.User;public interface UserDao extends BaseMapper<User> {
}

4.测试类

package com.lucifer.sharding;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lucifer.sharding.dao.UserDao;
import com.lucifer.sharding.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ShardingJdbcExamplesApplication.class})
public class ShardingJdbcExamplesApplicationTests {@ResourceUserDao userDao;@Testpublic void add(){for (int i = 0; i <10 ; i++) {User user=new User();user.setFullname("张三");user.setUserType("1");userDao.insert(user);}}@Testpublic void find(){for (int i = 0; i <10 ; i++) {QueryWrapper<User> queryWrapper=new QueryWrapper<>();queryWrapper.eq("user_id",1111);userDao.selectList(queryWrapper);}}}

这里就不写controller和service了,直接使用测试类来测试。

三、测试

1.测试add:

这里的m1就是在application.yml中配置的主库。然后打开数据库图形界面工具,这里用的是navicat,查看主库192.168.87.133;有10条数据;

然后打开192.168.87.134,打开user_db.t_user表。刷新即可看到:相同数据出现了。

2.测试find

用for循环 10次查询,就是看是否每次都是查询同一个库,看配置是否生效;

这里的s1是application.yml中配置的从库。可以看到查询的是从库。上面测试用的user_id的值是随便给的,两个库中都没有

 

 

 

 

  相关解决方案