SpringBoot 整合数据库全攻略:MyBatis/MyBatis-Plus+Druid(小白手把手版)
开篇:为什么需要这些 “数据库工具”?
你有没有觉得 “直接写 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. 启动项目测试
- 确保 MySQL 中car表有car_id=1的数据;
- 启动 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 是否生效
- 启动项目,访问
http://localhost:8080/druid,输入配置的账号(admin)和密码(123456),进入监控页; - 访问之前的
/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 整合数据库的核心是 “加依赖→改配置→写代码”,每个步骤都有固定模板,小白只要按示例复制,避开版本和配置的坑,就能轻松搞定数据库操作!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)