SpringBoot 3.x+Mybatis Plus多数据源极简配置

news2024/9/20 16:34:48

1. 创建项目

创建一个名为mybatis-plus-demo的项目,使用Maven+JDK17。不会的请看 IntelliJ IDEA快速创建Spring Boot项目,最终项目结构,如下图。
在这里插入图片描述

2. 编写代码

根据最终项目结构,从下往上依次列出各个文件的代码。

2.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>mybatis-plus-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--  为Spring Boot项目提供一系列默认的配置和依赖管理-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.2</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!--  Spring Boot核心依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- Spring Boot单元测试和集成测试的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Spring Boot构建Web应用程序的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- mysql驱动-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>
        <!-- mybatis-plus核心依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.7</version>
        </dependency>

        <!--  动态数据源依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
            <version>4.3.1</version>
        </dependency>

    </dependencies>

</project>

2.2 application.properties

# 默认的数据源
spring.datasource.dynamic.primary=master
# 严格匹配数据源,默认false
spring.datasource.dynamic.strict=false
# 取消druid自动配置
spring.autoconfigure.exclude=com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure

# 主库
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://127.0.0.1:33066/test
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=123456
# 从库
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://127.0.0.1:33067/test
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=123456
#显示sql
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

2.3 mapper/UserMapperSlave.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.UserMapperSlave">

    <select id="selectAllPage" parameterType="java.util.Map" resultType="java.util.Map">
        select * from t_user_a
        <where>
            <if test="param.name != null and param.name != ''">
                INSTR(CONCAT(IFNULL(name,'')),#{param.name})>0
            </if>
        </where>
    </select>

</mapper>

2.4 org/example/Main.java

package org.example;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement // 启用事务管理
@MapperScan("org.example.mapper") // 扫描mapper
@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }

}

2.5 org/example/mapper/UserMapperSlave.java

注意@DS(“slave”)注解,与配置文件中数据源名称相对应

package org.example.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import org.example.entity.User;

import java.util.List;
import java.util.Map;


@DS("slave")
public interface UserMapperSlave extends BaseMapper<User> {

    @MapKey("")
    List<Map<String, Object>> selectAllPage(Page<?> page, @Param("param") Map<String, Object> param);
}

2.6 org/example/mapper/UserMapperMaster.java

package org.example.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.example.entity.User;

@DS("master")
public interface UserMapperMaster extends BaseMapper<User> {


}

2.7 org/example/entity/User.java

package org.example.entity;

import com.baomidou.mybatisplus.annotation.*;

import java.util.Date;

@TableName("t_user_a")
public class User {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private String phone;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

}

2.8 org/example/controller/UserController.java

package org.example.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.example.entity.User;
import org.example.mapper.UserMapperMaster;
import org.example.mapper.UserMapperSlave;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Controller
@RequestMapping("/UserController")
public class UserController {


    @Autowired
    private UserMapperMaster userMapperMaster;

    @Autowired
    private UserMapperSlave userMapperSlave;

    @RequestMapping(value = "/insertMaster")
    @ResponseBody
    @Transactional
    public Object insertMaster() {
        for (int i = 0; i < 20; i++) {
            User user = new User();
            user.setName("张"+i);
            user.setPhone(new Date().getTime()+"");
            userMapperMaster.insert(user);
        }
        return "数据插入成功";
    }


    @RequestMapping(value = "/listAllMaster")
    @ResponseBody
    public Object listAllMaster() {
        QueryWrapper<User> q = new QueryWrapper<>();
        q.like("name", "张1");
        List<User> list = userMapperMaster.selectList(q);
        return list;
    }

    @RequestMapping(value = "/listAllSlave")
    @ResponseBody
    public Object listAllSlave() {
        QueryWrapper<User> q = new QueryWrapper<>();
        q.like("name", "张1");
        List<User> list = userMapperSlave.selectList(q);
        return list;
    }

    @RequestMapping(value = "/listPageSlave")
    @ResponseBody
    public Object listPageSlave() {
        Page<?> page = new Page<>(1, 3);
        Map<String, Object> param = new HashMap<>();
        param.put("name", "张");
        List<Map<String, Object>> list = userMapperSlave.selectAllPage(page, param);
        return list;
    }


}

2.9 org/example/conf/MyMetaObjectHandler.java

package org.example.conf;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/*
 MyBatis-Plus 提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

3.0 org/example/conf/MybatisPlusConfig.java

package org.example.conf;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/*
 MyBatis-Plus 配置
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}
 

3. 测试

3.1 创建表

分别在两个数据库创建表t_user_a。

-- test.t_user_a definition

CREATE TABLE `t_user_a` (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.2 master插入数据

启动项目,然后访问:http://localhost:8080/UserController/insertMaster,可以看到master数据库已经插入成功。
在这里插入图片描述

3.3 slave查询数据

访问:http://localhost:8080/UserController/listAllSlave,可以看到从slave数据库查询出来的数据。由于我这里做了MySQL主从复制,因此没有手动往slave添加数据,您可以自行插入几条数据测试。不会MySQL主从复制的请看MySQL主从复制。
在这里插入图片描述

INSERT INTO test.t_user_a
(id, name, phone, create_time, update_time)
VALUES(0, '张1', '1724409931630', '2024-08-23 18:45:31', '2024-08-23 18:45:31');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

迷雾大陆攻略:VMOS云手机流派辅助和技能加持助力!

在《迷雾大陆》这款游戏中&#xff0c;选择一个合适的流派和技能加点至关重要。使用VMOS云手机&#xff0c;玩家可以享受到专属定制的云手机&#xff0c;内置游戏安装包&#xff0c;无需重新下载安装游戏。同时&#xff0c;VMOS云手机能够24小时不间断运行&#xff0c;自动完成…

STM32(F103ZET6)第二十课:FreeRtos操作系统的应用

目录 调试方式一、任务堆栈溢出检测二、任务管理方式三、二值信号量(任务同步)四、计数信号量五、互斥信号量六、队列 调试方式 问题&#xff1a;传感器数据获取问题&#xff0c;有的DHT11能获取到&#xff0c;有的获取不到 两种方式&#xff1a;调优先级或者进临界区&#xf…

Docker原理及实例

目录 一 Docker简介及部署方法 1.1 Docker简介 1.1.1 什么是docker&#xff1f; 1.1.2 docker在企业中的应用场景 1.1.3 docker与虚拟化的对比 1.1.4 docker的优势 2 部署docker 2.1 容器工作方法 2.2 部署第一个容器 2.2.1 配置软件仓库 2.2.2 安装docker-ce并启动服…

排序算法见解(2)

1.快速排序 1.1基本思想&#xff1a; 快速排序是通过一趟排序将待排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序&#xff0c;整个排序过程可以递归进行&#xff0c;以…

如何构建Java SpringBoot文献检索系统:高效管理学术资料,掌握数据库核心技术

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

搭上“跨境电商”便车,中国家居在海外越杀越勇

文&#xff5c;新熔财经 作者&#xff5c;楷楷 从去年至今&#xff0c;已有多家跨境家居企业谋求IPO&#xff0c;包括近期启动IPO辅导的圣奥科技&#xff1b;今年4月正式向港交所递交招股说明书的傲基科技&#xff1b;去年11月启动A股IPO的跨境家居品牌杰西亚&#xff0c;还有…

vulhub xxe靶机通关教程

首先我们进行端口扫描 扫出来端口之后去尝试得出地址为183 发现robots.txt文件 由此我们就得到了两个目录 我们先进入xxe目录&#xff0c;并开始登录抓包 并进入重放器在xml里面构造语句 <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY admin SYSTEM "php://filt…

【在Linux世界中追寻伟大的One Piece】传输层协议UDP

目录 1 -> 传输层 2 -> 端口号 2.1 -> 端口号范围划分 2.2 -> 知名端口号 3 -> UDP协议 3.1 -> UDP协议端格式 3.2 -> UDP的特点 3.2.1 -> 面向数据报 3.3 -> UDP的缓冲区 3.4 -> UDP使用注意事项 3.5 -> 基于UDP的应用层协议 1 -…

Vue实战:轻松掌握输入框@功能实现技巧

成员列表 创建 实现成员列表的方式比较简单&#xff0c;其实就是一个列表&#xff0c;一个简单的v-for循环就可以搞定&#xff0c;点击时将当前选择的成员项回调给父组件。 新增一个AtPop.vue文件&#xff1a; <template> <div class"at-pop-index">…

DIFFUSION 系列笔记| Latent Diffusion Model、Stable Diffusion基础概念、数学原理、代码分析、案例展示

目录 Latent Diffusion Model LDM 主要思想 LDM使用示例 LDM Pipeline LDM 中的 UNET 准备时间步 time steps 预处理阶段 pre-process 下采样过程 down sampling 中间处理 mid processing 上采样 upsampling 后处理 post-process LDM Super Resolution Pipeline…

海康视觉二次开发学习笔记8-从回调函数获取结果

回调函数使用方法 通常在方案或流程执行完成后,就可以获取到流程运行的结果.运行一次流程后,我们就可以获取到流程的渲染结果以及流程的数据结果.那么使用通讯或硬件进行外部触发时,如何获取结果呢? 这种时候就要用到回调函数. 1. 注释原获取结果代码 2. 注册回调函数 在构…

【文献及模型、制图分享】数字技术力量下传统村落景观修复演进的特征与机制研究——以岳阳市张谷英村为例(GIS空间分析、点云提取)

文献介绍 景观修复作为弘扬中华优秀传统文化的重要方式&#xff0c;如何在乡村数字化新时代背景下&#xff0c;把握传统村落景观修复的数字赋能&#xff0c;已成为推动中华优秀传统文化创造性转化与创新性发展亟需解决的科学问题。运用深度访谈、GIS空间分析、点云数据提取等方…

html+css+js网页设计 婚庆类型12个页面

htmlcssjs网页设计 婚庆类型12个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xf…

FreeRTOS 低功耗模式

正如STM32的裸机编程一样&#xff0c;FreeRTOS通用提供了低功耗模式。 前面说的很明白&#xff0c;FreeRTOS的低功耗模式实际上还是基于STM32的低功耗模式指令进入睡眠模式来实现的&#xff0c;并且只要中断来临&#xff0c;就会退出低功耗&#xff0c;FreeRTOS的系统时钟是最底…

猫头虎分享:Python库 Statsmodels 的简介、安装、用法详解入门教程

猫头虎分享&#xff1a;Python库 Statsmodels 的简介、安装、用法详解入门教程 &#x1f42f; 引言 &#x1f3af; 今天猫头虎带您 深入探讨 Statsmodels 这个在数据分析和统计建模领域非常重要的Python库。最近有粉丝在评论区问道&#xff1a;“猫哥&#xff0c;如何使用 St…

USB端点

USB端点 各端点使用循环冗余校验&#xff08;CRC&#xff09;来检测传输中发生的错误。 根据 USB 规范&#xff0c;设备端点是 USB 设备中一个独特的可寻址部分&#xff0c;它作为主机和设备间通信流的信息源或库。 USB 枚举和配置一节介绍了设备向默认地址做出响应的步骤。 枚…

能进大厂的自动化测试面试题

前言 每次到金九银十都避免不了要聊一聊面试题了&#xff0c;如今九月已经是中下旬了&#xff0c;马上就要到十月份了&#xff0c;还在投简历找工作的小伙伴可以看看我这几天发的文章&#xff0c;最近发的都是面试题&#xff0c;如果需要笔者教一下大家怎么写简历的小伙伴可以…

光伏高压并网升压箱变

在当今能源领域的变革浪潮中&#xff0c;光伏能源以其清洁、可再生的显著优势&#xff0c;成为了备受瞩目的焦点。而光伏高压并网升压箱变&#xff0c;则是实现光伏电能顺利接入高压电网的核心设备。 光伏高压并网升压箱变宛如光伏能源系统中的一位“大力士”&#xff0c;承担着…

一张图浏览CSS Functions

点我CSS Functions思维导图下载 函数文章链接示例属性函数var attr env介绍访问文章示例地址

银河麒麟编译opencv库并配置qt环境

1.opencv下载版本:opencv4.5.5,qt安装的是qt5.12.11,系统版本: 2.首先应该安装cmake工具: 下载地址:https://cmake.org/download/ 安装步骤: 1)解压; 2)进入解压后的文件夹cd cmake-3.30.2 3)./bootstrap 4)sudo make 5)sudo make install 3.下载opencv,下…