首先使用idea创建springboot项目

导入所需jar包

---
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.0</version>
        </dependency>
        <!--mysql连接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>

    </dependencies>

配置src/main/resources/application.properties文件

# one 数据源配置
spring.datasource.one.url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.one.username=root
spring.datasource.one.password=123456
spring.datasource.one.driverClassName=com.mysql.cj.jdbc.Driver

# two 数据源配置
spring.datasource.two.url=jdbc:mysql://localhost:3306/mytest2?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.two.username=root
spring.datasource.two.password=123456
spring.datasource.two.driverClassName=com.mysql.cj.jdbc.Driver

在项目文件com.example下创建mapper文件夹里面新增数据源配置再次新增文件夹one文件夹和two文件夹

具体如下图所示
5d3e064de9c4.png

在项目文件com.example下创建config文件夹里面新增数据源配置

新建class OneDataSourceConfig

package com.example.config.datasource;


import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 这里是第一数据源 其他数据源配置同第二数据源配置
 */

@Configuration
@MapperScan(basePackages = "com.example.mapper.one", sqlSessionFactoryRef = "oneSqlSessionFactory")
public class OneDataSourceConfig {


    //获取配置信息 记得设置时区&serverTimezone=Asia/Shanghai
    @Value("${spring.datasource.one.url}")
    private String url;
    @Value("${spring.datasource.one.username}")
    private String username;
    @Value("${spring.datasource.one.password}")
    private String password;
    @Value("${spring.datasource.one.driverClassName}")
    private String driverClassName;

    @Primary
    @Bean(name = "oneDataSource")
    public DataSource dataSource() {//创建连接数据信息配置
        return DataSourceBuilder.create()
                .url(url)
                .username(username)
                .password(password)
                .driverClassName(driverClassName).build();
    }
    @Primary
    @Bean(name = "oneSqlSessionFactory")//配置工厂(配置数据扫描服务)
    public SqlSessionFactory sqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception {
        //这里不可使用SqlSessionFactoryBean否则扫描会出很多问题
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/one/*.xml"));
//        bean.setMapperLocations(resolveMapperLocations());
        return bean.getObject();
    }
    public Resource[] resolveMapperLocations() {
        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
        List<String> mapperLocations = new ArrayList<>();
        mapperLocations.add("classpath*:mapper/one/*.xml");
        List<Resource> resources = new ArrayList<>();
        for (String mapperLocation : mapperLocations) {
            try {
                Resource[] mappers = resourceResolver.getResources(mapperLocation);
                resources.addAll(Arrays.asList(mappers));
            } catch (IOException e) {
                // ignore
            }
        }
        return resources.toArray(new Resource[0]);
    }
    @Primary
    @Bean(name = "oneTransactionManager")//创建事务
    public DataSourceTransactionManager transactionManager(@Qualifier("oneDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    @Primary
    @Bean(name = "oneSqlSessionTemplate")//创建模板
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("oneSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

新建class TwoDataSourceConfig

package com.example.config.datasource;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.example.mapper.two",sqlSessionFactoryRef = "twoSqlSessionFactory")
public class TwoDataSourceConfig {

    @Value("${spring.datasource.two.url}")
    private String url;
    @Value("${spring.datasource.two.username}")
    private String username;
    @Value("${spring.datasource.two.password}")
    private String password;
    @Value("${spring.datasource.two.driverClassName}")
    private String driverClassName;

    @Bean(name = "twoDataSource")
    public DataSource twoDataSource(){
        return DataSourceBuilder.create()
                .url(url)
                .username(username)
                .password(password)
                .driverClassName(driverClassName).build();
    }

    @Bean(name = "twoSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("twoDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
//        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/two/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "twoTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("twoDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "twoSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("twoSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

在数据库创建两个库 一个(mytest) 一个(mytest2) 新增表

/*
 Navicat Premium Data Transfer

 Source Server         : 本地MySQL
 Source Server Type    : MySQL
 Source Server Version : 80027
 Source Host           : localhost:3306
 Source Schema         : mytest2

 Target Server Type    : MySQL
 Target Server Version : 80027
 File Encoding         : 65001

 Date: 23/02/2023 09:18:04
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for data_one
-- ----------------------------
DROP TABLE IF EXISTS `data_one`;
CREATE TABLE `data_one`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `data` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

创建class DataBean

package com.example.bean;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("data_one")
public class DataBean {

    @TableId(type = IdType.AUTO)
    private Integer id;
    private String data;
}

创建interface com.example.mapper.one.DataOneMapper

package com.example.mapper.one;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.bean.DataBean;
import org.springframework.stereotype.Repository;

@Repository
public interface  DataOneMapper extends BaseMapper<DataBean> {
}

创建interface com.example.mapper.two.DataTwoMapper

package com.example.mapper.two;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.bean.DataBean;
import org.springframework.stereotype.Repository;

@Repository
public interface DataTwoMapper extends BaseMapper<DataBean> {
}

创建interface com.example.service.DataService

package com.example.service;

import com.example.bean.DataBean;

import java.util.List;

public interface DataService {
    //one数据插入
    String addOneData(String name);
    //two数据查询
    List<DataBean> getTwoData();
}

创建class com.example.service.impl.DataServiceImpl

package com.example.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.bean.DataBean;
import com.example.mapper.one.DataOneMapper;
import com.example.mapper.two.DataTwoMapper;
import com.example.service.DataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DataServiceImpl implements DataService {

    @Autowired
    public DataServiceImpl(DataOneMapper oneMapper, DataTwoMapper twoMapper) {
        this.oneMapper = oneMapper;
        this.twoMapper = twoMapper;
    }

    DataOneMapper oneMapper;
    DataTwoMapper twoMapper;

    @Override
    public String addOneData(String name) {
        DataBean dataBean = new DataBean();
        dataBean.setData(name);
        int insert = oneMapper.insert(dataBean);
        return insert>0?"插入成功":"插入失败";
    }

    @Override
    public List<DataBean> getTwoData() {
        return twoMapper.selectList(new QueryWrapper<DataBean>());
    }
}

创建class com.example.controller.DataController

package com.example.controller;

import com.example.bean.DataBean;
import com.example.service.DataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/data")
public class DataController {

    @Autowired
    public DataController(DataService dataService) {
        this.dataService = dataService;
    }
    DataService dataService;

    @GetMapping("/add")
    public String add(String name){
        return dataService.addOneData(name);
    }

    @GetMapping("/list")
    public List<DataBean> getList(){
        return dataService.getTwoData();
    }
}

运行com.example.Application 访问接口即可

最重要的是如果config里面配置了

bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/one/*.xml"));

则需要在src/main/resources/mapper/one/DataOneMapper.xml的项目创建one和two文件夹 ---上面图片有创建的所有文件示例

查询语句实例

SELECT * FROM test_1 WHERE (EXISTS (SELECT * FROM test_2 t WHERE t.status = 0 and t.d1 = 1 and t.id and d2.id)) LIMIT ?