开篇:为什么需要这些 “数据库工具”?
你有没有觉得 “直接写 JDBC 太麻烦”?比如要手动加载驱动、创建连接、处理结果集,代码又多又容易错。SpringBoot 整合的这些工具,本质是 “数据库操作的简化神器”:

  • MyBatis:帮你用 “注解 / XML” 写 SQL,自动映射结果到 Java 对象,不用手动处理 ResultSet;
  • MyBatis-Plus:MyBatis 的 “增强版”,自带 CRUD 方法,不用写 SQL 就能实现增删改查;
  • Druid:阿里巴巴的数据源,比 SpringBoot 默认的 Hikari 多了监控防 SQL 注入等实用功能。
    这篇按 “基础→增强→优化” 的顺序,带你一步步整合,每个步骤都有可复制的代码和避坑指南!

一、基础款:整合 MyBatis(最经典的数据库操作框架)

MyBatis 是 Java 生态最常用的 ORM 框架,核心是 “SQL 映射”—— 把 SQL 语句和 Java 方法绑定。整合步骤超简单,5 步搞定。

步骤 1:导入依赖(pom.xml)

需要两个核心依赖:MyBatis 的 SpringBoot Starter + 数据库驱动(MySQL/Oracle)
(1)MySQL 驱动(最常用)

<!-- 1. MyBatis的SpringBoot Starter(核心依赖) -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version> <!-- 稳定版,适配SpringBoot 2.x -->
</dependency>

<!-- 2. MySQL驱动(MySQL 8.x用这个,5.x用mysql-connector-java:5.1.47-->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope> <!-- 运行时生效,编译不依赖 -->
</dependency>

(2)Oracle 驱动(按需选)
如果用 Oracle 数据库,替换 MySQL 驱动:

<!-- Oracle驱动 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <scope>runtime</scope>
</dependency>

步骤 2:配置数据库连接(application.yml)

告诉 SpringBoot 数据库的地址账号密码,MyBatis 会自动用这些信息创建连接。

MySQL 8.x 配置(重点避坑!)
MySQL 8.x 强制要求设置时区,驱动类也变了,配置时注意两点:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver  # MySQL 8.x驱动类(5.x是com.mysql.jdbc.Driver)
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC  # 加serverTimezone=UTC(时区)
    username: root  # 数据库账号
    password: 123456  # 数据库密码

核心参数说明:

  • ssm_db:你的数据库名称(提前在 MySQL 中创建好);
  • serverTimezone=UTC:解决 “时区错误”(不加会报The server time zone value ‘XXX’ is unrecognized)。

步骤 3:写数据层接口(DAO)

创建 DAO 接口(比如CarDao),用@Mapper注解标记(告诉 Spring 这是 MyBatis 的映射接口),再用@Select等注解写 SQL。

示例:查询车辆信息
1. 创建实体类(Car.java):

// 对应数据库的car表(字段名尽量和表字段一致)
import lombok.Data;

@Data  // Lombok注解,自动生成getter/setter
public class Car {
    private String carId;  // 对应表中的car_id字段
    private String brand;  // 品牌
    private Double price;  // 价格
}

2. 创建 DAO 接口(CarDao.java):

import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Mapper;
import com.heima.pojo.Car;

// @Mapper:标记这是MyBatis的映射接口,Spring会自动创建实现类
@Mapper
public interface CarDao {

    // @Select:绑定查询SQL,#{id}是参数占位符(安全,防SQL注入)
    @Select("select car_id, brand, price from car where car_id = #{id}")
    Car getById(String id);  // 方法返回值自动映射为Car对象
}

步骤 4:测试(Service+Controller)

写个测试接口,验证 MyBatis 是否生效。

1. Service 层(CarService.java)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.heima.dao.CarDao;
import com.heima.pojo.Car;

@Service
public class CarService {

    @Autowired
    private CarDao carDao;  // 注入DAO接口

    public Car getCarById(String id) {
        return carDao.getById(id);  // 调用DAO方法
    }
}

2. Controller 层(CarController.java)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.heima.service.CarService;
import com.heima.pojo.Car;

@RestController
public class CarController {

    @Autowired
    private CarService carService;

    // 访问:http://localhost:8080/car/1
    @GetMapping("/car/{id}")
    public Car getCar(@PathVariable String id) {
        return carService.getCarById(id);
    }
}

3. 启动项目测试

  1. 确保 MySQL 中car表有car_id=1的数据;
  2. 启动 SpringBoot 项目,访问http://localhost:8080/car/1,返回车辆信息即成功。

避坑指南:MyBatis 常见问题

1. 多个 DAO 接口,每个都要加 @Mapper?
不用!在引导类上加@MapperScan("com.heima.dao")(填 DAO 接口所在的包),批量扫描所有 DAO,不用单个加注解:

@SpringBootApplication
@MapperScan("com.heima.dao")  // 批量扫描DAO包
public class SpringBootDbApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDbApplication.class, args);
    }
}

2. 表字段名和实体类属性名不一致?
比如表字段是car_id,实体类是carid,可以用@Results注解映射:

@Select("select car_id, brand, price from car where car_id = #{id}")
@Results({
    @Result(column = "car_id", property = "carid")  // column=表字段,property=实体属性
})
Car getById(String id);

二、增强款:整合 MyBatis-Plus(MyBatis 的 “外挂”)

MyBatis-Plus(简称 MP)是国内团队开发的 MyBatis 增强工具,核心优势是 “不用写 SQL,自带 CRUD 方法”。比如查询、新增、修改,直接调用方法就行,开发效率翻倍。

步骤 1:导入依赖(pom.xml)

注意:MP 的依赖要替换 MyBatis 的依赖,且需要手动指定版本(SpringBoot 父工程没维护 MP 的版本)。

<!-- MyBatis-Plus Starter(包含MyBatis核心功能,不用再导MyBatis依赖) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version> <!-- 稳定版,适配SpringBoot 2.x -->
</dependency>

<!-- MySQL驱动(和之前一样) -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

步骤 2:配置文件(application.yml)

除了数据源配置,MP 还支持表前缀主键策略日志等实用配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    username: root
    password: 123456

# MyBatis-Plus配置
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tb_  # 表前缀(比如实体类Car对应表tb_car,不用写全表名)
      id-type: auto      # 主键生成策略:auto=自增(默认是雪花算法,适合分布式ID)
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 打印SQL日志(方便调试)

步骤 3:写 DAO 接口(核心简化点!)

MP 提供了BaseMapper<T>接口,DAO 接口只需继承它,就自动拥有 CRUD 方法,不用写 SQL!
示例:CarDao.java(MP 版)

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.heima.pojo.Car;
import org.apache.ibatis.annotations.Mapper;

@Mapper
// 继承BaseMapper<实体类>,自动获得CRUD方法
public interface CarDao extends BaseMapper<Car> {
    // 不用写任何方法!BaseMapper里已经有了:
    // selectById(id):根据ID查询
    // insert(car):新增
    // updateById(car):根据ID修改
    // deleteById(id):根据ID删除
    // selectList(null):查询所有
}

步骤 4:测试 MP 的 “无 SQL” 操作

修改 Service 层,直接调用 BaseMapper 的方法:

@Service
public class CarService {

    @Autowired
    private CarDao carDao;

    // 1. 根据ID查询(不用写SQL)
    public Car getById(String id) {
        return carDao.selectById(id);
    }

    // 2. 新增车辆(不用写SQL)
    public boolean addCar(Car car) {
        // insert方法返回受影响的行数,>0即成功
        int rows = carDao.insert(car);
        return rows > 0;
    }

    // 3. 根据ID修改(不用写SQL)
    public boolean updateCar(Car car) {
        int rows = carDao.updateById(car);
        return rows > 0;
    }

    // 4. 查询所有(不用写SQL)
    public List<Car> getAll() {
        return carDao.selectList(null);  // null表示无条件
    }
}

测试新增接口
在 Controller 加新增接口,测试无 SQL 新增:

@PostMapping("/car")
public String addCar(@RequestBody Car car) {
    boolean success = carService.addCar(car);
    return success ? "新增成功" : "新增失败";
}

避坑指南:MP 常见问题

1. 表前缀配置不生效?
确保table-prefix的值和表名一致,比如配置table-prefix: tb_,实体类Car对应表tb_car,大小写不敏感。

2. 主键自增不生效?
检查两点:

  • 数据库表的主键字段是否设置了 “自增”;
  • MP 配置是否加了id-type: auto(默认是雪花算法,会生成长整型 ID)。

三、优化款:整合 Druid 数据源(带监控的 “智能连接池”)

数据源(连接池)是 “管理数据库连接的容器”,SpringBoot 默认用Hikari(速度快),但Druid(阿里巴巴出品)有更丰富的功能:

  • 连接池监控(能看连接数、SQL 执行效率);
  • 防 SQL 注入、SQL 日志打印;
  • 并发控制、超时重试等。

步骤 1:导入依赖(pom.xml)

用 Druid 的 SpringBoot Starter,自动整合数据源:

<!-- Druid Starter(包含数据源核心功能) -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.6</version> <!-- 稳定版 -->
</dependency>

<!-- MyBatis-Plus Starter(或MyBatis Starter,按需选) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>

<!-- MySQL驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

步骤 2:配置 Druid(两种方式,推荐第一种)

Druid 支持两种配置方式,推荐用druid前缀,能配置更多高级功能(如监控)。

方式 1:推荐配置(druid 前缀,支持高级功能

spring:
  datasource:
    druid:  # 用druid前缀,支持所有Druid配置
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
      username: root
      password: 123456
      # 连接池配置(可选,默认有值,按需调整)
      initial-size: 5  # 初始化连接数
      max-active: 20   # 最大连接数
      min-idle: 5      # 最小空闲连接数
      # 监控配置(重要!开启Druid监控页)
      stat-view-servlet:
        enabled: true  # 开启监控页
        login-username: admin  # 监控页登录账号
        login-password: 123456 # 监控页登录密码
        url-pattern: /druid/*  # 监控页访问路径:http://localhost:8080/druid

方式 2:基础配置(type 指定数据源类型)
如果只需要替换数据源,不配置高级功能,可以用这种:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    username: root
    password: 123456
    # 指定数据源类型为Druid
    type: com.alibaba.druid.pool.DruidDataSource

步骤 3:测试 Druid 是否生效

  1. 启动项目,访问http://localhost:8080/druid,输入配置的账号(admin)和密码(123456),进入监控页;
  2. 访问之前的/car/1接口,再回到监控页的 “SQL 监控”,能看到执行的 SQL 语句 —— 说明 Druid 生效。

避坑指南:Druid 常见问题
1. 监控页访问 404?
检查stat-view-servlet配置是否完整(enabled、url-pattern、账号密码),尤其是url-pattern: /druid/*不能写错。

2. 配置了 druid 前缀但不生效?
确保依赖是druid-spring-boot-starter(不是老的druid依赖),老依赖需要手动配置 Bean,Starter 会自动识别druid前缀的配置。

四、总结:3 个工具核心对比与选型

工具 核心价值 适用场景 关键优势
MyBatis SQL 映射,简化 JDBC 操作 需要灵活写复杂 SQL 的场景(如多表联查) 轻量、灵活,SQL 可控性强
MyBatis-Plus MyBatis 增强,自带 CRUD,不用写 SQL 简单 CRUD 操作多的场景(如管理系统) 开发效率高,支持分页、条件查询等增强功能
Druid 高级数据源,带监控、防注入 生产环境,需要监控 SQL 性能、防攻击的场景 监控完善、功能丰富,稳定性强

新手选型建议:

  • 个人项目 / 快速开发:MyBatis-Plus + Druid(效率高 + 有监控);
  • 复杂 SQL 场景:MyBatis + Druid(SQL 灵活 + 监控);
  • 简单测试:MyBatis + 默认 Hikari(配置少,速度快)。

五、终极避坑:版本兼容问题汇总

问题场景 解决方案
MySQL 8.x 连接报错 驱动用mysql-connector-j,url 加serverTimezone=UTC,驱动类用com.mysql.cj.jdbc.Driver
MyBatis-Plus 注入失败 手动指定 MP 版本(如 3.4.3),确保 DAO 接口继承BaseMapper
Druid 监控页 404 用druid-spring-boot-starter依赖,配置完整stat-view-servlet

SpringBoot 整合数据库的核心是 “加依赖→改配置→写代码”,每个步骤都有固定模板,小白只要按示例复制,避开版本和配置的坑,就能轻松搞定数据库操作!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐