【Sharding-JDBC】(二) 整合mybatis-plus 一主一從 讀寫分離

一.搭建數據庫環境(一主一從 讀寫分離)

參考: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-examples
  http:
    encoding:
      enabled: true
      charset: utf-8
      force: true
  main:
    allow-bean-definition-overriding: true
  #shardingsphere相關配置
  shardingsphere:
    datasource:
      names: m1,s1   #配置庫的名字,隨意
      m1:   #配置目前m1庫的數據源信息
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.87.133:3306/user_db?useUnicode=true
        username: root
        password: 123456
      s1:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.87.134:3306/user_db?useUnicode=true
        username: root
        password: 123456
    sharding:
      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_robin
    props:
      sql:
        show: true   #打印sql


#日誌打印
logging:
  level:
    root: info
    org.springframework.web: info
    com.lucifer.sharding.dao: debug
    druid.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 {

    @Resource
    UserDao userDao;

    @Test
    public void add(){
        for (int i = 0; i <10 ; i++) {
            User user=new User();
            user.setFullname("張三");
            user.setUserType("1");
            userDao.insert(user);
        }

    }

    @Test
    public 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的值是隨便給的,兩個庫中都沒有

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章