当前位置:   article > 正文

Dynamic-DataSource多数据源配置mybatis/mybatis-plus_dynamic datasource

dynamic datasource

参考资料:


内容简介:

  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. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE 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):

  • 关于mybatis-plus的多数据源切换,同样也是导入依赖,然后使用@DS在类或者方法上控制数据源即可
  • 实在不会参考上述官方文档
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/677921
推荐阅读
相关标签
  

闽ICP备14008679号