springboot操作mysql数据库(多数据源+sql写在mapper文件)

 

1.数据库和表情况

数据库:db_test

表:user

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;

 

数据库:db_test01

表:sys_log

CREATE TABLE `sys_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `oper_name` varchar(32) DEFAULT NULL,
  `oper_content` varchar(32) DEFAULT NULL,
  `createtime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

 

项目结构

image

 

 

 

2.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.18</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>org.hxl</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>demo</name>
  <description>mybatis测试</description>

  <dependencies>
    <!-- SpringWeb核心依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Lombok(简化实体类) -->
    <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>

    <!-- MySQL 驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
      <version>8.0.33</version> <!-- 适配 MySQL 8.x,5.x 可改用 5.1.49 -->
    </dependency>

    <!-- MyBatis 整合 Spring Boot 启动器 -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.3.1</version> <!-- 适配 Spring Boot 2.7 的版本 -->
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <!-- 关键:明确指定插件版本为 2.7.18,与 parent 版本一致 -->
        <version>2.7.18</version>
        <configuration>
          <excludes>
            <exclude>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
            </exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

 

3.配置文件application.yml

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
  # 配置两个数据源:primary(主业务库)、secondary(日志库)
  datasource:
    primary:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://192.168.1.14:3306/db_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: mysql
    secondary:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://192.168.1.14:3306/db_test01?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: mysql

# Mybatis全局配置(通用,驼峰转换、日志打印)
mybatis:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

 

4.各java文件

PrimaryDataSourceConfig.java

package org.hxl.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;

/**
 * 主库(primary)数据源配置类
 * 1. @Primary 表示:这个是主数据源,当有多个同类型Bean时,优先注入这个
 * 2. @MapperScan 核心:指定该数据源对应的Mapper包路径 + SqlSessionFactory
 */
@Configuration
@MapperScan(basePackages = "org.hxl.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {

    // 1. 创建 主库 数据源对象
    @Bean("primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    // 2. 创建 主库 SqlSessionFactory,绑定主库数据源
    @Bean("primarySqlSessionFactory")
    @Primary
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // 加载当前数据源对应的Mapper.xml文件(如果有),路径:resources/mapper/primary
        //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/primary/*.xml"));
        return bean.getObject();
    }

    // 3. 创建 主库 SqlSessionTemplate,绑定主库SqlSessionFactory
    @Bean("primarySqlSessionTemplate")
    @Primary
    public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

 

SecondaryDataSourceConfig.java

package org.hxl.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;

/**
 * 日志库(secondary)数据源配置类
 * 注意:不能加 @Primary 注解,一个项目中只能有一个@Primary的数据源
 */
@Configuration
@MapperScan(basePackages = "org.hxl.mapper.secondary", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig {

    // 1. 创建 日志库 数据源对象
    @Bean("secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    // 2. 创建 日志库 SqlSessionFactory,绑定日志库数据源
    @Bean("secondarySqlSessionFactory")
    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // 加载当前数据源对应的Mapper.xml文件(如果有),路径:resources/mapper/secondary
        //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/secondary/*.xml"));
        return bean.getObject();
    }

    // 3. 创建 日志库 SqlSessionTemplate,绑定日志库SqlSessionFactory
    @Bean("secondarySqlSessionTemplate")
    public SqlSessionTemplate secondarySqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

 

SysLogController.java

package org.hxl.controller;

import org.hxl.entity.SysLog;
import org.hxl.service.LogService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 系统日志模块控制器 - 操作【日志库log_db】
 * 数据源自动绑定:mapper在secondary包下 → 自动使用secondary数据源
 */
@RestController
@RequestMapping("/sysLog")
public class SysLogController {

    @Resource
    private LogService logService;

    // 新增操作日志 - POST请求
    @PostMapping
    public String addLog(@RequestBody SysLog sysLog) {
        int result = logService.addLog(sysLog);
        return result > 0 ? "日志新增成功" : "日志新增失败";
    }

    // 查询所有日志 - GET请求
    @GetMapping
    public List<SysLog> getAllLog() {
        return logService.getAllLog();
    }
}

 

UserController.java

package org.hxl.controller;

import org.hxl.entity.User;
import org.hxl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * User 控制层,提供 HTTP 接口
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 新增用户
    @PostMapping
    public String addUser(@RequestBody User user) {
        int result = userService.addUser(user);
        return result > 0 ? "新增成功" : "新增失败";
    }
    // 查询所有
    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUser();
    }
}

 

SysLog.java

package org.hxl.entity;

import lombok.Data;
import java.util.Date;
@Data
public class SysLog {
    private Long id;
    private String operName;
    private String operContent;
    private Date createTime;
}

User.java

package org.hxl.entity;

import lombok.Data;

/**
 * 用户实体类(用于参数绑定示例)
 */
@Data
public class User {
    private Long id;
    private String username;
    private Integer age;
    private String email;
}

 

UserMapper.java

package org.hxl.mapper.primary;

import org.apache.ibatis.annotations.Select;
import org.hxl.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
    @Insert("INSERT INTO user(username,age,email) VALUES(#{username},#{age},#{email})")
    int addUser(User user);

    @Select("SELECT * FROM user")
    List<User> getAllUser();
}

 

SysLogMapper.java

package org.hxl.mapper.secondary;

import org.apache.ibatis.annotations.Select;
import org.hxl.entity.SysLog;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SysLogMapper {
    @Insert("INSERT INTO sys_log(oper_name,oper_content) VALUES(#{operName},#{operContent})")
    int addLog(SysLog sysLog);

    @Select("SELECT * FROM sys_log")
    List<SysLog> getAllLog();


}

 

LogService.java

package org.hxl.service;

import org.hxl.entity.SysLog;
import org.hxl.mapper.secondary.SysLogMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class LogService {
    @Resource
    private SysLogMapper sysLogMapper;
    public int addLog(SysLog sysLog){
        return sysLogMapper.addLog(sysLog);
    }
    public List<SysLog> getAllLog(){
        return sysLogMapper.getAllLog();
    }
}

 

UserService.java

package org.hxl.service;

import org.hxl.entity.User;
import org.hxl.mapper.primary.UserMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserService {
    @Resource
    private UserMapper userMapper;
    public int addUser(User user){
        return userMapper.addUser(user);
    }
    public List<User> getAllUser(){
        return userMapper.getAllUser();
    }
}

 

App.java

package org.hxl;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class App
{
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
        System.out.println("===== Spring Boot 启动成功 =====");
    }
}

 

6.调用

新增用户

image

 

新增操作日志

image

 

 

posted @ 2026-01-09 14:21  slnngk  阅读(3)  评论(0)    收藏  举报