精华内容
下载资源
问答
  • 这是mybatis 的基础教程 里面的test包含增删改查总共4,5种,里面数据库的脚本是txt文件,直接复制粘贴就行了
  • mybatisplus数据源的切换的两种方式

    千次阅读 2019-12-11 16:35:04
    一种是注解的方式来切换数据源 1.引入dynamic-datasource-spring-boot-starter。 <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter...

    一种是注解的方式来切换数据源

    1.引入dynamic-datasource-spring-boot-starter。

    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
      <version>${version}</version>
    </dependency>

    2.配置数据源

    spring:
      datasource:
        dynamic:
          primary: master #设置默认的数据源或者数据源组,默认值即为master
          datasource:
            master:
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver
              url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
            slave_1:
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver
              url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
            slave_2:
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver
              url: jdbc:mysql://xx.xx.xx.xx:3308/dynamic
           #......省略
           #以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2

    3. 使用 @DS 切换数据源。

     以上都摘自mybatisplus官网的动态切换数据源的模块,有兴趣的可以去看看。

    现在重点说下另一种切换数据源的方法

    是通过代码的形式手动切换数据源

    主要就是这个类来切换的

    public final class DynamicDataSourceContextHolder {

      /**
       * 为什么要用链表存储(准确的是栈)
       * <pre>
       * 为了支持嵌套切换,如ABC三个service都是不同的数据源
       * 其中A的某个业务要调B的方法,B的方法需要调用C的方法。一级一级调用切换,形成了链。
       * 传统的只设置当前线程的方式不能满足此业务需求,必须模拟栈,后进先出。
       * </pre>
       */
      @SuppressWarnings("unchecked")
      private static final ThreadLocal<Deque<String>> LOOKUP_KEY_HOLDER = new ThreadLocal() {
        @Override
        protected Object initialValue() {
          return new ArrayDeque();
        }
      };

      private DynamicDataSourceContextHolder() {
      }

      /**
       * 获得当前线程数据源
       *
       * @return 数据源名称
       */
      public static String peek() {
        return LOOKUP_KEY_HOLDER.get().peek();
      }

      /**
       * 设置当前线程数据源
       * <p>
       * 如非必要不要手动调用,调用后确保最终清除
       * </p>
       *
       * @param ds 数据源名称
       */
      public static void push(String ds) {
        LOOKUP_KEY_HOLDER.get().push(StringUtils.isEmpty(ds) ? "" : ds);
      }

      /**
       * 清空当前线程数据源
       * <p>
       * 如果当前线程是连续切换数据源 只会移除掉当前线程的数据源名称
       * </p>
       */
      public static void poll() {
        Deque<String> deque = LOOKUP_KEY_HOLDER.get();
        deque.poll();
        if (deque.isEmpty()) {
          LOOKUP_KEY_HOLDER.remove();
        }
      }

      /**
       * 强制清空本地线程
       * <p>
       * 防止内存泄漏,如手动调用了push可调用此方法确保清除
       * </p>
       */
      public static void clear() {
        LOOKUP_KEY_HOLDER.remove();
      }
    }

     首先通过调用改类的push方法将要传入的dbName,下面写你的业务的逻辑,完成后,最好再调用改类的poll方法或者clear方法(需要注意的是这个poll方法和clear方法是一定要调用的,最好写再final里面)

    这样就可以通过代码来手动切换数据源啦。

    展开全文
  • 一般多数据源的配置方式有两种 - 静态的多数据源:每个数据源配置一套mapper - 动态的多数据源:多个数据源通用一套mapper

    好记性不如烂笔头,把自己做过的记录一下。一般多数据源的配置方式有两种

    • 静态的多数据源:每个数据源配置一套mapper
    • 动态的多数据源:多个数据源通用一套mapper

    静态多数据源

    1. application.yml配置
      (这里的demo.datasource.master、demo.datasource.slave是自定义的配置,可以修改)
    #多数据源配置
    demo:
       datasource:
         #主数据库 master库
         master:
            jdbc-url: jdbc:mysql://192.168.75.99:3307/database1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
            username: master
            password: pass
         # 从库数据源 slave库
         slave:
            jdbc-url: jdbc:mysql://192.168.75.99:3307/database2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
            username: slave
            password: pass
    
    1. 新建两个数据源配置
      MasterDataSourceConfig、SlaveDataSourceConfig
    @Configuration
    @MapperScan(basePackages = "com.xinhuo.demo.mapper.master",sqlSessionFactoryRef = "masterSqlSessionFactory")
    public class MasterDataSourceConfig {
        @Primary
        @Bean(name = "masterDataSource")
        @ConfigurationProperties("demo.datasource.master")
        public DataSource masterDataSource(){
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "masterSqlSessionFactory")
        public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
            MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
            sessionFactoryBean.setDataSource(dataSource);
    
            return sessionFactoryBean.getObject();
        }
    }
    
    @Configuration
    @MapperScan(basePackages = "com.xinhuo.demo.mapper.slave",sqlSessionFactoryRef = "slaveSqlSessionFactory")
    public class SlaveDataSourceConfig {
        @Bean(name = "slaveDataSource")
        @ConfigurationProperties("demo.datasource.slave")
        public DataSource slaveDataSource(){
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "slaveSqlSessionFactory")
        public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
            MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
            sessionFactoryBean.setDataSource(dataSource);
    
            return sessionFactoryBean.getObject();
        }
    }
    

    在这里插入图片描述

    1. 新建两套mapper,一个数据源使用一套mapper
      在这里插入图片描述
    public interface StudentMapper extends BaseMapper<Student> {
    }
    
    public interface Teacher extends BaseMapper<Teacher> {
    }
    
    
    1. main方法使用使用exclude
      禁用默认加载的application.properties单数据源配置
      以及关闭mybatisPlus的一些自动注入
    /**
     * 使用exclude = {DataSourceAutoConfiguration.class}
     * 禁用springboot默认加载的application.properties单数据源配置
     * 关闭springBoot关于mybatisPlus的一些自动注入
     */
    @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisPlusAutoConfiguration.class})
    @SpringBootApplication
    public class SpringDatasourceDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringDatasourceDemoApplication.class, args);
        }
    
    }
    
    1. 验证多数据源的使用
    @RestController
    @RequestMapping("/base")
    public class BaseController {
        @Autowired
        private StudentService studentService;
        @Autowired
        private TeacherService teacherService;
    
        @PostMapping("/addStudentAndTeacher")
        public ResultMsg addStudentAndTeacher(String studentName,String teacherName){
            //新增一个学生
            Student student = new Student();
            student.setName(studentName);
            studentService.save(student);
            //新增一个教师
            Teacher teacher = new Teacher();
            teacher.setName(teacherName);
            teacherService.save(teacher);
            return ResultMsg.ok();
        }
    
        @RequestMapping("/find")
        public ResultMsg find(){
            //查询student表所有的学生
            List<Student> studentList = studentService.list();
            //查询teacher表所有的教师
            List<Teacher> teacherList = teacherService.list();
            JSONObject data = new JSONObject();
            data.put("studentList",studentList);
            data.put("teacherList",teacherList);
            ResultMsg resultMsg = new ResultMsg();
            resultMsg.setData(data);
            return resultMsg;
        }
    }
    

    6.用postman测试,新增不同数据源的学生和教师表记录,然后查询出来在这里插入图片描述
    在这里插入图片描述

    可以看到静态的多数据源就配置成功了

    动态的多数据源
    动态的多数据源利用aop在service层或者dao层动态切换当前线程的数据源

    springboot动态多数据源配置和使用(二)
    springboot动态多数据源配置和使用(从数据库读取数据源配置)(三)

    注:

    • 多个数据库的application.yml文件,数据库连接用jdbcUrl或者jdbc-url,单个数据源可以用url
    • SqlSessionFactoryBean需要改成MybatisSqlSessionFactoryBean,否则baseMapper自带的方法不能访问,但能访问*Mapper.xml中定义的方法或者接口注解的自定义sql的方法

    项目源码:https://gitee.com/zhangxinlin/spring-datasource-demo

    展开全文
  • {DataSourceAutoConfiguration.class}) 无法生效 datasource: druid: stat-view-servlet: loginUsername: admin loginPassword: 123456 dynamic: druid: #以下是全局默认值,可以全局更改 initial-size: max-active:...
    #服务器配置
    server:
      port: 8083
      undertow:
        io-threads: 16
        worker-threads: 400
        buffer-size: 1024
        direct-buffers: true
    spring:
      autoconfigure:
        exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure  # 为了某些版本的springboot  @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}) 无法生效
      datasource:
        druid:
          stat-view-servlet:
            loginUsername: admin
            loginPassword: 123456
        dynamic:
          druid: #以下是全局默认值,可以全局更改
            initial-size:
            max-active:
            min-idle:
            max-wait:
            time-between-eviction-runs-millis:
            time-between-log-stats-millis:
            stat-sqlmax-size:
            min-evictable-idle-time-millis:
            max-evictable-idle-time-millis:
            test-while-idle:
            test-on-borrow:
            test-on-return:
            validation-query:
            validation-query-timeout:
            use-global-datasource-stat:
            async-init:
            clear-filters-enable:
            reset-stat-enable:
            not-full-timeout-retry-count:
            max-wait-thread-count:
            fail-fast:
            phyTimeout-millis:
            keep-alive:
            pool-prepared-statements:
            init-variants:
            init-global-variants:
            use-unfair-lock:
            kill-when-socket-read-timeout:
            connection-properties:
            max-pool-prepared-statement-per-connection-size:
            init-connection-sqls:
            share-prepared-statements:
            connection-errorretry-attempts:
            break-after-acquire-failure:
            filters: stat,wall # 注意这个值和druid原生不一致,默认启动了stat,wall
          primary: master #默认数据源
          datasource:
            master:
              driver-class-name: com.mysql.cj.jdbc.Driver
              url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
              username: root
              password: 123456
    
            slave:
              driver-class-name: com.mysql.cj.jdbc.Driver
              url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
              username: root
              password: 123456
      thymeleaf:
        prefix: classpath:templates/
        suffix: .html
        mode: HTML5
        cache: false
    
    
    mybatis-plus:
      mapper-locations: classpath:com/jdk18/demo/dao/*Mapper.xml
      typeAliasesPackage: com.jdk18.demo.entity
      typeEnumsPackage: com.jdk18.demo.entity.enums
      global-config:
        banner: false
        db-config:
          id-type: id_worker
          insert-strategy: not_null
          update-strategy: not_null
          select-strategy: not_null
          table-underline: true  #全局逻辑删除字段值 3.3.0开始支持,详情看下面。
          logic-delete-value: 1 # 逻辑已删除值(默认为 1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    
      configuration:
        map-underscore-to-camel-case: true
        cache-enabled: false
    
    

     

    展开全文
  • mybatisplus数据源切换 踩坑笔记

    千次阅读 2019-09-12 10:05:21
    原来的需求是两个数据库表结构会有所不同,现在的需求变成不同数据库的要同步的两张表结构相同,再mybatisplus的基础利用service发觉数据源并没有注入,找了资料后更改了MybatisConfig里面的Mybatis...

    继上一篇关于多数据源切换https://blog.csdn.net/qq_42170268/article/details/100120520,原来的需求是两个数据库表结构会有所不同,现在的需求变成不同数据库的要同步的两张表结构相同,再mybatisplus的基础利用service发觉数据源并没有注入,找了资料后更改了MybatisConfig里面的MybatisSqlSessionFactoryBean sqlSessionFactoryBean()

    截图里框出来的内容保持不变修改mybatisplusConfig里的部分,注释的部分是原来的(两图对比,具体原理还需要去深入了解)

    之后的@DataSource("master")  @DataSource("slave1")  具体根据个人情况在serviceImpl里使用

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 本文主要用atomikos的AtomikosDataSourceBean+druid配置连接池,另一个是AtomikosNonXADataSourceBean具体参考我的另一篇文章:超简单 springboot+ mybatisplus+atomikos实现多数据源分布式事务 1、...
  • 二、update 1、根据Id更新操作 注意:update时生成的sql自动是动态sql:UPDATE user SET age=?... //修改操作 @Test public void updateUser() { User user = new User(); user.setId(2L); ...
  • @ApiOperation("修改员工报名") @PutMapping public R update(@RequestParam("ids") String ids, @RequestParam("staus") Integer staus) { if(StringUtils.isBlank(ids)){ return R.failed("传入的id为空"); } ...
  • * 说明:这个类中包含了许多默认配置,若这些配置符合您的情况,您可以不用管,若不符合,建议不要修改本类,建议直接在"application.yml"中配置即可 * */ @Component @ConfigurationProperties (prefix = ...
  • -- 多数据源配置--> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.3.1</version>...
  • Spring+SpringMvc+MybatisPlus实现多数据源切换、利用自定义Aop注解,只需要在需要切换数据库的方法上加上注解即可实现、极大避免了代码冗余。
  • springboot简易集成mybatisPlus+多数据

    万次阅读 2019-04-30 14:37:08
    该项目主要实现mybatisplus、多数据源、lombok、druid的集成 主要参考 https://mp.baomidou.com/guide/quick-start.html 项目地址:https://github.com/Blankwhiter/mybatisplus-springboot 一、创建表以及测试数据 ...
  • 自动填充MyBatisPlus自动填充@TableField(fill = FieldFill.INSERT) 插入的时候填充@TableField(fill = FieldFill.INSERT_UPDATE)插入和更新的时候填充importcom.baomidou.mybatisplus.annotation.*;通过实现...
  • } 自动填充 创建时间、更改时间! 这些操作一遍都是自动化完成的, 我们不希望手动更新!阿里巴巴开发手册:所有的数据表:gm_create、 gmt_modified 几乎所有的表都需要配置上!而且需要自动化! 方式一 数据库级别 在...
  • springboot+mybatisplus +yml 配置多数据源遇到的问题 1yml配置多数据源 spring: datasource: dynamic: druid: filters: stat primary: tbm datasource: tbm: username: xxx password: xxxx driver-...
  • MybatisPlus 敏感数据加解密

    千次阅读 2020-08-21 17:53:50
    1.添加AESEncoder、AESDecoder、AESEncryptHandler import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey;...
  • 在之前项目小示例的基础上配置多数据源,项目结构如下: 参考代码地址:链接:https://pan.baidu.com/s/1k3AaH_FI9UiGgdKkffbEQw 提取码:muav 1、创建一个Maven项目,修改pom.xml文件增加对spring boot、...
  • mybatisplus修改操作

    2021-07-14 12:45:11
    mybatisplus 实现修改操作 public void updateUser() { User user = new User; User.setId(2L); User.setAge(120); int row = userMapper.updateById(user); System.out.println(row); } 创建User对象 调用...
  • SpringBoot2.0.8版本整合MybatisPlus实现多数据源很简单,但是事务总是不生效?MybatisPlus提供了多数据源插件( 链接 ),我可不可以不用?其实多数据源挺好配的,就是事务一直不生效。今天终于解决了。项目结构:主要...
  • 其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。 主键自增 实体...
  • 「项目纪实」——mybatisplus数据源读写分离为什么有这个需求怎么解决开始试验创建demo开始测试 为什么有这个需求 ​ 最近我们有个线上项目因为读写数据量比较大,导致数据库压力增大,所以现在打算上读写分离的...
  • --MybatisPlus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1</version> </...
  • SpringBoot+mybatisPlus实现多数据源curd 适用场景:一个项目需要连接多个数据库的时候 dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。 其支持 Jdk 1.7+, SpringBoot...
  • #MyBatisPlus mybatis-plus: mapper-locations: classpath*:/mapper/*.xml type-aliases-package: com.gourd.hu type-aliases-super-type: com.gourd.hu.base.data.BaseEntity type-handlers-package: ...
  • MybatisPlus特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 强大的 CRUD 操作:内置通用 Mapper、通用 ...
  • 数据源配置: 静态配置:每个数据源配置一套mapper 动态配置:多个数据源通用一套mapper 一、静态配置 1、properties配置文件 #数据库配置 spring.datasource.druid.master.type=...
  • 先说第一个问题,多数据源 导致 逻辑删除 等全局配置失效。 先看配置, 很常规的 mybatis-plus 的配置 #mybatis-plus 配置信息 mybatis-plus: configuration: #开启驼峰功能 map-underscore-to-camel-case: ...
  • companyService.lambdaUpdate( new CompanyEntity(), Wrappers.lambdaUpdate() .set(CompanyEntity::getStatus, cCompany.getStatus()) .set(CompanyEntity::getAccountTypeId, cCompany.getAccountTypeId()) ...
  • 解决MybatisPlus修改时空字段不修改问题
  • 传送门:SpringBoot接入MybatisPlus 配置相关 pom.xml中添加依赖 <!--动态数据源--> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,278
精华内容 3,311
关键字:

mybatisplus修改数据