本文适合Spring Boot新手及需要整合数据持久层框架的开发者,将一步步带你完成「环境准备→MySQL安装配置→Spring Boot项目初始化→MyBatis集成→MyBatis-Plus进阶」全流程,每个步骤均附实操代码与注意事项,看完即可上手实战。
一、前置知识与环境准备
在开始搭建前,确保你已掌握基础的Java开发(JDK8+)、Maven/Gradle依赖管理,以及简单的SQL语法。以下是必备环境清单,建议统一版本避免兼容性问题:
JDK:8 或 11(Spring Boot 2.x/3.x均兼容,本文以JDK8为例)
构建工具:Maven 3.6+ 或 Gradle 7.0+(本文用Maven)
IDE:IntelliJ IDEA 2021+ 或 Eclipse(IDEA体验更佳)
数据库:MySQL 8.0+(5.7版本也可,配置略有差异,文中会标注)
Spring Boot版本:3.2.x(稳定版,兼容主流依赖)
二、MySQL数据库安装与配置(关键步骤)
数据持久层框架最终要操作数据库,先完成MySQL的安装与基础配置,这一步是后续开发的基础,务必仔细。
2.1 下载与安装MySQL
下载地址:访问MySQL官方下载页,选择对应系统版本(Windows/macOS/Linux)。推荐下载「MySQL Community Server」(社区版,免费开源)。
安装流程(以Windows为例):
双击安装包,选择「Custom」自定义安装,勾选「MySQL Server」核心组件,下一步。
配置安装路径(建议不要含中文和空格,如D:\MySQL\mysql-8.0.36),继续下一步。
配置服务器:默认端口3306(若被占用可修改,后续项目配置需对应),选择「Use Legacy Authentication Method」(兼容旧版本,新手友好),设置root用户密码(务必牢记,如root123456)。
完成安装后,勾选「Start the MySQL Server at System Startup」,确保服务开机自启。
验证安装:
Windows:打开cmd,输入命令
mysql -u root -p,输入设置的密码,若出现「mysql>」提示符,说明安装成功。macOS/Linux:打开终端,输入相同命令验证,或通过「系统偏好设置→MySQL」查看服务状态。
2.2 创建项目专用数据库
为避免与其他项目数据混淆,创建一个专门用于本次Spring Boot项目的数据库(示例库名:spring_boot_demo):
-- 1. 创建数据库(指定编码为UTF-8,避免中文乱码) CREATE DATABASE spring_boot_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 切换到该数据库 USE spring_boot_demo; -- 3. 创建测试表(以用户表user为例) CREATE TABLE user ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', username VARCHAR(50) NOT NULL COMMENT '用户名', age INT COMMENT '年龄', email VARCHAR(100) COMMENT '邮箱', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ) COMMENT '用户表';
注意:MySQL 8.0+默认编码为utf8mb4,支持表情符号;5.7版本需手动设置编码,否则可能出现中文乱码。若使用5.7,创建数据库时需补充命令:ALTER DATABASE spring_boot_demo SET character_set_server = utf8mb4;
三、初始化Spring Boot项目
推荐使用Spring官方的「Spring Initializr」快速初始化项目,步骤如下:
3.1 生成项目骨架
访问Spring Initializr网页,配置如下参数:
Project:Maven
Language:Java
Spring Boot:3.2.5(稳定版)
Group:com.example(自定义包名)
Artifact:spring-boot-mybatis-demo(项目名)
Package name:com.example.springbootmybatisdemo
Java:8
添加依赖(Dependencies):
Spring Web(用于后续接口测试)
Spring Data JDBC(基础JDBC支持)
MySQL Driver(MySQL驱动,Spring Boot会自动适配版本)
Lombok(简化实体类代码,可选但推荐)
点击「Generate」下载项目压缩包,解压后用IDEA打开。
3.2 核对pom.xml依赖
打开项目根目录的pom.xml,确保核心依赖已添加(若缺失手动补充):
<dependencies><!-- Spring 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> <scope>runtime</scope> </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> </dependencies>
四、集成MyBatis(基础版)
MyBatis是一款优秀的持久层框架,通过XML或注解方式映射SQL语句,灵活度高。下面完成MyBatis与Spring Boot的整合。
4.1 添加MyBatis依赖
在pom.xml中添加MyBatis整合Spring Boot的 Starter 依赖:
<!-- MyBatis整合Spring Boot Starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.2</version> <!-- 适配Spring Boot 3.x,版本需匹配 --> </dependency>
4.2 配置application.yml
Spring Boot默认支持application.properties和application.yml两种配置文件,yml格式更清晰,这里使用yml。删除默认的application.properties,创建application.yml,配置数据库连接和MyBatis核心参数:
spring: # 数据库配置 datasource: url: jdbc:mysql://localhost:3306/spring_boot_demo?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: root123456 # 替换为你的MySQL密码 driver-class-name: com.mysql.cj.jdbc.Driver # MySQL 8.0+驱动类名(5.7为com.mysql.jdbc.Driver) # MyBatis配置 mybatis: mapper-locations: classpath:mapper/*.xml # 指定Mapper XML文件存放路径 type-aliases-package: com.example.springbootmybatisdemo.entity # 实体类包名(简化XML中的类全限定名) configuration: map-underscore-to-camel-case: true # 开启下划线转驼峰(如数据库字段create_time映射为实体类createTime) log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志(开发环境推荐开启,便于调试)
注意事项:1. url中的serverTimezone必须指定为Asia/Shanghai,否则会出现时区错误;2. useSSL=false(开发环境关闭SSL,生产环境需开启);3. allowPublicKeyRetrieval=true(解决MySQL 8.0+连接时的公钥验证问题)。
4.3 编写核心代码
按「实体类→Mapper接口→Mapper XML→Service→Controller」的顺序编写代码,分层清晰,便于维护。
4.3.1 实体类(Entity)
创建com.example.springbootmybatisdemo.entity包,编写User实体类(对应数据库user表),使用Lombok简化getter/setter/构造方法:
package com.example.springbootmybatisdemo.entity; import lombok.Data; import java.time.LocalDateTime; @Data // Lombok注解,自动生成getter、setter、toString等方法 public class User { private Long id; // 对应数据库id字段 private String username; // 对应username字段 private Integer age; // 对应age字段 private String email; // 对应email字段 private LocalDateTime createTime; // 对应create_time字段(下划线转驼峰) }
4.3.2 Mapper接口
创建com.example.springbootmybatisdemo.mapper包,编写UserMapper接口(MyBatis的Mapper接口无需实现类,由框架动态代理生成):
package com.example.springbootmybatisdemo.mapper; import com.example.springbootmybatisdemo.entity.User; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper // 标识该接口为MyBatis的Mapper接口,Spring Boot会自动扫描 public interface UserMapper { // 查询所有用户 List<User> listAll(); // 根据ID查询用户 User getById(Long id); // 新增用户 int insert(User user); // 更新用户 int update(User user); // 删除用户 int deleteById(Long id); }
4.3.3 Mapper XML文件
在resources目录下创建mapper文件夹,编写UserMapper.xml(与UserMapper接口对应,存放SQL语句):
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace必须与Mapper接口全限定名一致 --> <mapper namespace="com.example.springbootmybatisdemo.mapper.UserMapper"> <!-- 结果集映射(可选,若字段名与实体类属性名完全匹配,可省略) --> <resultMap id="UserResultMap" type="User"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="age" property="age"/> <result column="email" property="email"/> <result column="create_time" property="createTime"/> </resultMap> <!-- 查询所有用户:对应UserMapper.listAll() --> <select id="listAll" resultMap="UserResultMap"> SELECT id, username, age, email, create_time FROM user </select> <!-- 根据ID查询:对应UserMapper.getById() --> <select id="getById" parameterType="Long" resultMap="UserResultMap"> SELECT id, username, age, email, create_time FROM user WHERE id = #{id} </select> <!-- 新增用户:对应UserMapper.insert() --> <insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (username, age, email) VALUES (#{username}, #{age}, #{email}) </insert> <!-- 更新用户:对应UserMapper.update() --> <update id="update" parameterType="User"> UPDATE user SET username = #{username}, age = #{age}, email = #{email} WHERE id = #{id} </update> <!-- 删除用户:对应UserMapper.deleteById() --> <delete id="deleteById" parameterType="Long"> DELETE FROM user WHERE id = #{id} </delete> </mapper>
4.3.4 Service层(业务逻辑层)
创建com.example.springbootmybatisdemo.service包,编写UserService接口和实现类,封装业务逻辑:
// UserService接口 package com.example.springbootmybatisdemo.service; import com.example.springbootmybatisdemo.entity.User; import java.util.List; public interface UserService { List<User> listAll(); User getById(Long id); boolean save(User user); boolean update(User user); boolean removeById(Long id); }
// UserService实现类 package com.example.springbootmybatisdemo.service.impl; import com.example.springbootmybatisdemo.entity.User; import com.example.springbootmybatisdemo.mapper.UserMapper; import com.example.springbootmybatisdemo.service.UserService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; @Service // 标识为服务层组件,Spring会自动管理 public class UserServiceImpl implements UserService { @Resource // 注入UserMapper(也可使用@Autowired) private UserMapper userMapper; @Override public List<User> listAll() { return userMapper.listAll(); } @Override public User getById(Long id) { return userMapper.getById(id); } @Override public boolean save(User user) { return userMapper.insert(user) > 0; } @Override public boolean update(User user) { return userMapper.update(user) > 0; } @Override public boolean removeById(Long id) { return userMapper.deleteById(id) > 0; } }
4.3.5 Controller层(接口层)
创建com.example.springbootmybatisdemo.controller包,编写UserController,提供RESTful接口供测试:
package com.example.springbootmybatisdemo.controller; import com.example.springbootmybatisdemo.entity.User; import com.example.springbootmybatisdemo.service.UserService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @RestController // 标识为REST接口控制器,返回JSON数据 @RequestMapping("/user") // 接口统一前缀 public class UserController { @Resource private UserService userService; // 查询所有用户:GET /user/list @GetMapping("/list") public List<User> listAll() { return userService.listAll(); } // 根据ID查询:GET /user/{id} @GetMapping("/{id}") public User getById(@PathVariable Long id) { return userService.getById(id); } // 新增用户:POST /user/save @PostMapping("/save") public boolean save(@RequestBody User user) { return userService.save(user); } // 更新用户:PUT /user/update @PutMapping("/update") public boolean update(@RequestBody User user) { return userService.update(user); } // 删除用户:DELETE /user/delete/{id} @DeleteMapping("/delete/{id}") public boolean removeById(@PathVariable Long id) { return userService.removeById(id); } }
4.4 测试验证
启动项目:运行SpringBootMybatisDemoApplication类的main方法,若控制台无报错,且出现「Tomcat started on port(s): 8080」,说明项目启动成功。
接口测试(推荐使用Postman或浏览器):
新增用户:POST请求 http://localhost:8080/user/save,请求体JSON:{"username":"张三","age":20,"email":"zhangsan@test.com"},返回true表示成功。
查询所有用户:GET请求 http://localhost:8080/user/list,可看到新增的用户数据。
其他接口(查询单个、更新、删除)类似,按对应请求方式和参数测试即可。
五、集成MyBatis-Plus(进阶版)
MyBatis-Plus(简称MP)是MyBatis的增强工具,在MyBatis基础上只做增强不做改变,提供了「CRUD操作自动生成」「条件构造器」「代码生成器」等功能,能大幅减少重复代码,提高开发效率。
5.1 替换依赖(移除MyBatis,添加MyBatis-Plus)
MyBatis-Plus已包含MyBatis的核心功能,无需重复依赖。修改pom.xml,移除MyBatis依赖,添加MyBatis-Plus Starter:
<!-- 移除原MyBatis依赖 --> <!-- <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.2</version> </dependency> --> <!-- 添加MyBatis-Plus Starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.5</version> <!-- 适配Spring Boot 3.x --> </dependency>
5.2 调整application.yml配置
MyBatis-Plus的配置与MyBatis兼容,只需将mybatis前缀改为mybatis-plus即可(若需保留原MyBatis配置,也可兼容):
# MyBatis-Plus配置(替换原MyBatis配置) mybatis-plus: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.springbootmybatisdemo.entity configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: AUTO # 主键自增策略(与数据库AUTO_INCREMENT匹配) table-prefix: t_ # 表名前缀(若数据库表名有前缀,如t_user,可配置此参数,实体类无需写前缀)
5.3 简化代码(利用MP的CRUD自动生成)
MyBatis-Plus提供了BaseMapper接口,包含了常用的CRUD方法,只需让UserMapper继承BaseMapper,即可无需编写任何方法和XML,直接使用CRUD功能。
5.3.1 改造UserMapper
package com.example.springbootmybatisdemo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.springbootmybatisdemo.entity.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper<User> { // 无需编写任何方法!BaseMapper已包含listAll、getById、insert等CRUD方法 }
5.3.2 改造UserService
MyBatis-Plus还提供了IService接口和ServiceImpl实现类,进一步封装了Service层的CRUD操作,简化Service代码:
// UserService接口继承IService package com.example.springbootmybatisdemo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.springbootmybatisdemo.entity.User; public interface UserService extends IService<User> { // 如需自定义业务方法,在此添加;基础CRUD方法已由IService提供 }
// UserService实现类继承ServiceImpl package com.example.springbootmybatisdemo.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.springbootmybatisdemo.entity.User; import com.example.springbootmybatisdemo.mapper.UserMapper; import com.example.springbootmybatisdemo.service.UserService; import org.springframework.stereotype.Service; @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { // 无需编写任何基础CRUD实现!ServiceImpl已实现IService的所有方法 }
5.3.3 测试MP的增强功能
修改UserController,测试MP提供的增强方法(如条件查询、批量操作):
package com.example.springbootmybatisdemo.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.example.springbootmybatisdemo.entity.User; import com.example.springbootmybatisdemo.service.UserService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @RestController @RequestMapping("/user") public class UserController { @Resource private UserService userService; // 条件查询:查询年龄大于18的用户 @GetMapping("/list/age") public List<User> listByAge() { LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.gt(User::getAge, 18); // gt表示大于(greater than) return userService.list(queryWrapper); } // 批量新增 @PostMapping("/save/batch") public boolean saveBatch(@RequestBody List<User> userList) { return userService.saveBatch(userList); } // 其他原有接口无需修改,直接可用 }
5.4 可选:使用MP代码生成器(一键生成全代码)
对于复杂项目,MP提供了代码生成器,可根据数据库表结构一键生成Entity、Mapper、Service、Controller、XML等全套代码,彻底解放双手。步骤如下:
5.4.1 添加代码生成器依赖
<!-- MyBatis-Plus代码生成器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.5</version> </dependency> <!-- 模板引擎(代码生成器需要模板,默认使用Velocity) --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.3</version> </dependency>
5.4.2 编写生成器代码
创建com.example.springbootmybatisdemo.generator包,编写CodeGenerator类:
package com.example.springbootmybatisdemo.generator; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine; import java.util.Collections; public class CodeGenerator { public static void main(String[] args) { // 数据库连接信息 String url = "jdbc:mysql://localhost:3306/spring_boot_demo?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"; String username = "root"; String password = "root123456"; FastAutoGenerator.create(url, username, password) // 全局配置 .globalConfig(builder -> { builder.author("your-name") // 设置作者 .outputDir(System.getProperty("user.dir") + "/src/main/java") // 生成文件输出路径 .disableOpenDir() // 生成后不打开文件夹 .commentDate("yyyy-MM-dd HH:mm:ss"); // 注释日期格式 }) // 包配置 .packageConfig(builder -> { builder.parent("com.example.springbootmybatisdemo") // 父包名 .moduleName("") // 模块名(无则空) .entity("entity") // 实体类包名 .mapper("mapper") // Mapper接口包名 .service("service") // Service包名 .serviceImpl("service.impl") // Service实现类包名 .controller("controller") // Controller包名 .xml("mapper") // Mapper XML包名(resources下) .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper")); }) // 策略配置 .strategyConfig(builder -> { builder.addInclude("user") // 要生成代码的数据库表名(多个表用addInclude添加) .addTablePrefix("t_") // 表名前缀(若表名有前缀,生成实体类时会去掉前缀) // 实体类策略 .entityBuilder() .enableLombok() // 开启Lombok .enableTableFieldAnnotation() // 为字段添加注解(@TableField) .idType(com.baomidou.mybatisplus.generator.config.rules.IdType.AUTO) // 主键策略 // Controller策略 .controllerBuilder() .enableRestStyle() // 开启RESTful风格(接口使用@RestController) .enableHyphenStyle() // 接口地址使用连字符(如/user/list-all) // Mapper策略 .mapperBuilder() .enableBaseResultMap() // 生成基础ResultMap .enableBaseColumnList(); // 生成基础ColumnList }) // 模板引擎配置(默认Velocity) .templateEngine(new VelocityTemplateEngine()) // 执行生成 .execute(); } }
5.4.3 生成代码
运行CodeGenerator的main方法,即可一键生成全套代码,生成后可直接使用,无需手动编写基础CRUD代码。
六、常见问题排查
搭建过程中可能遇到以下问题,整理了解决方案供参考:
问题1:数据库连接失败(No suitable driver found)→ 解决方案:检查MySQL驱动依赖是否添加,driver-class-name是否正确(8.0+为com.mysql.cj.jdbc.Driver)。
问题2:时区错误(The server time zone value is unrecognized)→ 解决方案:在数据库url中添加serverTimezone=Asia/Shanghai。
问题3:Mapper接口无法注入(No qualifying bean of type)→ 解决方案:确保Mapper接口添加了@Mapper注解,或在启动类上添加@MapperScan("com.example.springbootmybatisdemo.mapper")扫描包。
问题4:下划线转驼峰失效→ 解决方案:在application.yml中开启mybatis-plus.configuration.map-underscore-to-camel-case=true。
问题5:SQL语句报错(Column 'xxx' not found)→ 解决方案:检查实体类属性名与数据库字段名是否匹配,或是否正确配置了ResultMap。
七、总结
本文从零开始,完成了「MySQL安装→Spring Boot项目初始化→MyBatis集成→MyBatis-Plus进阶」的全流程实战,核心要点如下:
环境准备是基础,需确保JDK、MySQL、Maven版本兼容。
MyBatis适合需要灵活控制SQL的场景,需手动编写Mapper接口和XML。
MyBatis-Plus是MyBatis的增强工具,通过BaseMapper和IService大幅减少重复代码,代码生成器可进一步提升开发效率。
配置文件中的数据库连接信息、Mapper路径、下划线转驼峰等参数是关键,需仔细核对。
后续可继续学习MyBatis-Plus的高级功能,如分页插件、乐观锁、逻辑删除等,进一步优化项目。如果本文对你有帮助,欢迎点赞收藏!