• Dynamic-DataSource多数据源配置mybatis/mybatis-plus


    参考资料:


    内容简介:

    1. Dynamic-DataSource 可以和绝大多是连接层插件搭配使用,比如:mybatis,mybatis-plus,hibernate等
    2. 如果公司不允许使用Dynamic-DataSource,可以参考上述视频进行原生代码的编写
    3. 本示例仅讲就基本的使用(多数据源及事务),如果还需要更多功能,可参考上述官方文档进行编码

    搭建示例(mybatis):

    • 首先搭建一个springBoot框架,参考
    • 然后创建两个数据库,模拟读写分离,每个数据库有个user表
    1. CREATE TABLE `user` (
    2. `id` int(0) NOT NULL AUTO_INCREMENT,
    3. `userName` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    4. `passWord` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    5. `realName` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    6. PRIMARY KEY (`id`) USING BTREE,
    7. INDEX `userName_index`(`userName`) USING BTREE
    8. ) ENGINE = InnoDB AUTO_INCREMENT = 975224 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

    •  导入数据库
    1. <dependency>
    2. <groupId>com.baomidou</groupId>
    3. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    4. <version>3.5.2</version>
    5. </dependency>
    • 配置数据源 
    1. server:
    2. port: 8088
    3. spring:
    4. datasource:
    5. dynamic:
    6. #设置默认的数据源或者数据源组,默认值即为master
    7. primary: master
    8. #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
    9. strict: false
    10. datasource:
    11. master:
    12. url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    13. username: root
    14. password: 123888
    15. driver-class-name: com.mysql.jdbc.Driver
    16. slave_1:
    17. url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    18. username: root
    19. password: 123888
    20. driver-class-name: com.mysql.jdbc.Driver
    21. mybatis:
    22. mapper-locations: classpath:mapper/*.xml
    23. type-aliases-package: com.example.demo.model
    24. #idea配置文件默认不允许有中文注释
    25. logging:
    26. level:
    27. com.example.demo.dao: debug
    • 其他的MVC层,正尝写就行,只需要在对应的类,方法或接口上添加@DS注解来进行数据源的切换即可 ,关于DS注解详情,可参考上面的官方文档

    @DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解

    注解结果
    没有@DS默认数据源
    @DS("dsName")dsName可以为组名也可以为具体某个库的名称
    • UserMapping.xml
    1. "1.0" encoding="UTF-8"?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.example.dynamicdatasourcemybatis.dao.UserMapper">
    4. <resultMap id="BaseResultMap" type="com.example.dynamicdatasourcemybatis.model.User">
    5. <result column="id" jdbcType="INTEGER" property="id" />
    6. <result column="userName" jdbcType="VARCHAR" property="userName" />
    7. <result column="passWord" jdbcType="VARCHAR" property="passWord" />
    8. <result column="realName" jdbcType="VARCHAR" property="realName" />
    9. resultMap>
    10. <select id="Sel" resultType="com.example.dynamicdatasourcemybatis.model.User">
    11. select * from user where id = #{id}
    12. select>
    13. <insert id="insertUser" parameterType="com.example.dynamicdatasourcemybatis.model.User">
    14. insert into user(id,userName,passWord,realName) values(#{id},#{userName},#{passWord},#{realName})
    15. insert>
    16. mapper>
    • dao层   (这里通过@DS来选择数据源)
    1. package com.example.dynamicdatasourcemybatis.dao;
    2. import com.baomidou.dynamic.datasource.annotation.DS;
    3. import com.example.dynamicdatasourcemybatis.model.User;
    4. import org.apache.ibatis.annotations.Mapper;
    5. @Mapper
    6. public interface UserMapper {
    7. //通过@DS 来选择 配置文件中的master 数据源
    8. @DS("master")
    9. User Sel(int id);
    10. //通过@DS 来选择 配置文件中的master 数据源
    11. @DS("slave_1")
    12. Integer insertUser(User u);
    13. }
    • service层,这里也可以在方法上加@DS 来选择数据源,这里就不演示了
    1. package com.example.dynamicdatasourcemybatis.service;
    2. import com.baomidou.dynamic.datasource.annotation.DS;
    3. import com.example.dynamicdatasourcemybatis.dao.UserMapper;
    4. import com.example.dynamicdatasourcemybatis.model.User;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. import java.util.Random;
    8. import java.util.UUID;
    9. @Service
    10. //@DS("master") 这里指定整个类使用的数据源
    11. public class UserService {
    12. @Autowired
    13. UserMapper userMapper;
    14. //分库分表 中 从 test 库中查找
    15. //@DS("master") 这里指定整个方法使用的数据源
    16. public User Sel(int id){
    17. return userMapper.Sel(id);
    18. }
    19. //分库分表 中 存入 user 库
    20. //@DS("master") 这里指定整个方法使用的数据源
    21. public Integer insertUser(){
    22. User user = new User();
    23. user.setId(1000+new Random().nextInt());
    24. user.setPassWord(UUID.randomUUID().toString());
    25. user.setUserName("张老三");
    26. user.setRealName("张三");
    27. return userMapper.insertUser(user);
    28. }
    29. //@DS("master") 这里指定整个方法使用的数据源
    30. public Integer testTrans(){
    31. User user = new User();
    32. user.setId(1000+new Random().nextInt());
    33. user.setPassWord(UUID.randomUUID().toString());
    34. user.setUserName("李老四");
    35. user.setRealName("李四");
    36. userMapper.insertUser(user);
    37. System.out.println("==========构建错误,测试回滚==============");
    38. System.out.println(1/0);
    39. return 0;
    40. }
    41. }
    • controller层  这里也可以在方法或者类上 使用@DS来选择数据源
    1. package com.example.dynamicdatasourcemybatis.controller;
    2. import com.example.dynamicdatasourcemybatis.model.User;
    3. import com.example.dynamicdatasourcemybatis.service.UserService;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Controller;
    6. import org.springframework.transaction.annotation.Transactional;
    7. import org.springframework.ui.Model;
    8. import org.springframework.web.bind.annotation.PathVariable;
    9. import org.springframework.web.bind.annotation.RequestMapping;
    10. import org.springframework.web.bind.annotation.ResponseBody;
    11. /**
    12. * @Author:wjup
    13. * @Date: 2018/9/26 0026
    14. * @Time: 14:42
    15. * 用多数据源来模拟分库分表 master 负责 读 操作 slave_1 负责 写操作
    16. */
    17. @Controller
    18. @RequestMapping("/testBoot")
    19. public class UserController {
    20. @Autowired
    21. private UserService userService;
    22. @RequestMapping("getUser/{id}")
    23. public String GetUser(@PathVariable int id,Model model){
    24. User user = userService.Sel(id);
    25. model.addAttribute("user", user);
    26. System.out.println("xxxxxxxxxxxxxxxxxx"+user.toString());
    27. return "index";
    28. }
    29. @RequestMapping("getUser/insert")
    30. @ResponseBody
    31. public String GetUser(){
    32. return String.valueOf(userService.insertUser());
    33. }
    34. //测试事务
    35. @RequestMapping("getUser/testTrans")
    36. @Transactional
    37. @ResponseBody
    38. public String testTrans(){
    39. return String.valueOf(userService.testTrans());
    40. }
    41. }
    • 如果需要事务的话,用@Transactional   即可,同上
    • 然后最后的就是上面的参考demo


    功能扩展(mybatis-plus):

  • 相关阅读:
    电脑开机屏幕闪烁,怎么解决
    PAT 乙级1070结绳
    IDEA 高分辨率卡顿优化
    约瑟夫环问题——《算法》1.1.37的解法
    java并发问题记录
    Flink 数据源
    初次使用IntelliJ IDEA从零开始学习创建maven项目
    【App自动化测试】(七)移动端自动化中常见控件交互方法
    Ubuntu22.04系统 Cgroup v2 切换成v1
    DC-DC模块升压电源直流隔离低压升高压正负输出变换器
  • 原文地址:https://blog.csdn.net/qq_23095607/article/details/127031349