汽车网站建设目的,用dw怎么做网站,html5网站设计欣赏,莱芜都市人才网前言
在 Java 后端开发中#xff0c;数据持久层是连接业务逻辑与数据库的核心桥梁。MySQL 作为开源关系型数据库的标杆#xff0c;凭借稳定、高效、易用的特性成为主流选择#xff1b;MyBatis 作为半 ORM 框架#xff0c;通过 XML / 注解灵活映射 SQL 与 Java 对象#x…前言在 Java 后端开发中数据持久层是连接业务逻辑与数据库的核心桥梁。MySQL 作为开源关系型数据库的标杆凭借稳定、高效、易用的特性成为主流选择MyBatis 作为半 ORM 框架通过 XML / 注解灵活映射 SQL 与 Java 对象解决了 JDBC 冗余代码的痛点MyBatis-Plus简称 MP则在 MyBatis 基础上增强封装提供 “零 SQL” CRUD、条件构造器等功能大幅提升开发效率。本文将从环境搭建 → 核心配置 → 实战演练 → 进阶技巧全方位覆盖 MySQL MyBatis MyBatis-Plus 的整合与使用适合 Java 初学者入门也可作为开发人员的实战参考手册。一、环境准备1.1 开发工具与基础环境JDK1.8 及以上推荐 1.8兼容性最佳构建工具Maven 3.6 或 Gradle 7.0本文以 Maven 为例开发 IDEIntelliJ IDEA 2021 或 Eclipse数据库MySQL 8.0兼容 5.7注意配置差异辅助工具Navicat/DBeaver数据库可视化、Postman接口测试1.2 安装 MySQL 数据库Windows 系统为例1.2.1 下载 MySQL官网地址https://dev.mysql.com/downloads/mysql/选择版本MySQL 8.0.36LTS 长期支持版下载包型Windows (x86, 64-bit), ZIP Archive免安装版灵活便捷1.2.2 配置 MySQL解压安装包将 ZIP 包解压到无中文、无空格的目录例D:\Develop\mysql-8.0.36-winx64创建配置文件在解压根目录下新建my.ini文件写入以下配置根据自身路径修改ini[mysqld] # 端口号默认3306可修改 port3306 # MySQL安装根目录 basedirD:\Develop\mysql-8.0.36-winx64 # 数据存储目录自动生成无需手动创建 datadirD:\Develop\mysql-8.0.36-winx64\data # 字符集默认utf8mb4支持emoji character-set-serverutf8mb4 # collation collation-serverutf8mb4_general_ci # 允许最大连接数 max_connections1000 # 跳过密码验证初始化时使用后续需关闭 skip-grant-tables1.2.3 初始化与启动 MySQL以管理员身份打开 CMD进入 MySQL 的bin目录cmdcd D:\Develop\mysql-8.0.36-winx64\bin初始化 MySQL生成临时密码需记录cmdmysqld --initialize --console执行成功后控制台会输出临时密码例rootlocalhost: abcd1234后续登录用安装 MySQL 服务cmdmysqld --install MySQL80提示Service successfully installed表示安装成功MySQL80 为服务名可自定义启动 MySQL 服务cmdnet start MySQL80停止服务命令net stop MySQL80后续重启时使用1.2.4 登录并修改密码登录 MySQL使用初始化时的临时密码cmdmysql -u root -p输入临时密码粘贴即可输入时不显示回车登录修改 root 密码推荐复杂度字母 数字 符号sql-- MySQL 8.0 语法5.7 可省略 BY ALTER USER rootlocalhost IDENTIFIED BY Root1234; -- 刷新权限 FLUSH PRIVILEGES;测试连接退出 MySQL 后重新登录验证密码是否生效cmdmysql -u root -p1.2.5 开启远程访问可选用于服务器部署默认情况下MySQL 仅允许本地localhost访问若需远程连接如 IDEA 连接服务器 MySQL需配置远程权限sql-- 允许任意 IP 访问生产环境建议指定具体 IP CREATE USER root% IDENTIFIED BY Root1234; -- 授予所有权限 GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION; -- 刷新权限 FLUSH PRIVILEGES;注意服务器需开放 3306 端口防火墙 / 安全组配置1.3 可视化工具连接 MySQL以 Navicat 为例新建连接 → 选择 MySQL配置连接信息连接名自定义例本地 MySQL80主机localhost本地或服务器 IP远程端口3306用户名root密码Root1234点击 “测试连接”提示 “连接成功” 即配置完成。二、创建 Maven 项目并引入依赖2.1 初始化 Spring Boot 项目推荐MyBatis/MyBatis-Plus 通常与 Spring Boot 整合使用推荐通过 Spring Initializr 快速创建项目IDEA → New → Project → Spring Initializr配置项目信息Groupcom.example自定义包名Artifactmybatis-demo版本2.7.15Spring Boot 2.x 稳定版兼容 MySQL8 MyBatis-Plus 3.5.x选择依赖核心依赖Spring Web用于接口测试、MySQL DriverMySQL 驱动MyBatis 依赖MyBatis FrameworkMyBatis-Plus 依赖需手动添加Spring Initializr 无默认选项点击 Finish等待 Maven 下载依赖。2.2 完整 pom.xml 依赖配置将以下依赖添加到pom.xml中覆盖自动生成的依赖确保版本兼容xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.15/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.example/groupId artifactIdmybatis-demo/artifactId version0.0.1-SNAPSHOT/version namemybatis-demo/name descriptionDemo project for MyBatis MyBatis-Plus/description properties java.version1.8/java.version !-- MyBatis-Plus 版本与 Spring Boot 2.7 兼容 -- mybatis-plus.version3.5.3.1/mybatis-plus.version /properties dependencies !-- Spring Web 用于接口测试 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MySQL 驱动8.0 版本兼容 5.7 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope version8.0.36/version /dependency !-- MyBatis 核心依赖Spring Boot 整合版 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.3.2/version /dependency !-- MyBatis-Plus 核心依赖Spring Boot 整合版 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version${mybatis-plus.version}/version /dependency !-- 代码生成器可选快速生成实体类、Mapper 等 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-generator/artifactId version${mybatis-plus.version}/version /dependency !-- 模板引擎代码生成器依赖 -- dependency groupIdorg.freemarker/groupId artifactIdfreemarker/artifactId version2.3.32/version /dependency !-- Lombok简化实体类 getter/setter -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- Spring Boot 测试依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build /project注意MyBatis-Plus 已包含 MyBatis 核心依赖无需重复引入Lombok 需在 IDEA 中安装插件Settings → Plugins → 搜索 Lombok → 安装重启。三、核心配置application.ymlSpring Boot 推荐使用application.yml配置文件比 properties 更简洁在src/main/resources下创建application.yml配置内容如下yaml# 服务器配置 server: port: 8080 # 项目端口 # Spring 配置 spring: # 数据库连接配置MySQL 8.0 语法 datasource: url: jdbc:mysql://localhost:3306/mybatis_demo?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltruerewriteBatchedStatementstrue username: root password: Root1234 driver-class-name: com.mysql.cj.jdbc.Driver # MySQL 8.0 驱动类5.7 为 com.mysql.jdbc.Driver # MyBatis 基础配置 mybatis: # Mapper XML 文件存放路径默认 resources/mapper可自定义 mapper-locations: classpath:mapper/*.xml # 实体类包路径别名配置XML 中可直接用类名无需全限定名 type-aliases-package: com.example.mybatisdemo.entity # 驼峰命名自动转换数据库字段 user_name → Java 属性 userName configuration: map-underscore-to-camel-case: true # 打印 SQL开发环境开启生产环境关闭 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # MyBatis-Plus 增强配置 mybatis-plus: # mapper XML 文件路径与 MyBatis 一致可省略 mapper-locations: classpath:mapper/*.xml # 实体类包路径用于代码生成器、自动填充等 type-aliases-package: com.example.mybatisdemo.entity # 全局配置 global-config: db-config: # 主键生成策略AUTO自增NONE手动输入ASSIGN_ID雪花算法 id-type: AUTO # 逻辑删除字段配置可选软删除 logic-delete-field: isDeleted logic-delete-value: 1 # 已删除 logic-not-delete-value: 0 # 未删除 # 配置打印 SQL与 MyBatis 二选一MP 打印更详细 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl配置说明数据库 URL 参数useSSLfalse关闭 SSL 连接开发环境无需serverTimezoneAsia/Shanghai指定时区解决 MySQL 8.0 时区警告allowPublicKeyRetrievaltrue允许获取公钥解决连接报错rewriteBatchedStatementstrue开启批量操作优化主键生成策略若数据库主键为自增AUTO_INCREMENT选AUTO分布式环境推荐ASSIGN_ID雪花算法生成 19 位 Long 型 ID逻辑删除用于 “软删除”数据不实际删除仅标记状态需数据库表添加is_deleted字段tinyint 类型默认 0四、数据库表设计与实体类创建4.1 创建测试表在 MySQL 中执行以下 SQL创建user表包含逻辑删除字段sqlCREATE DATABASE IF NOT EXISTS mybatis_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE mybatis_demo; DROP TABLE IF EXISTS user; CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键ID, user_name varchar(50) NOT NULL COMMENT 用户名, age int(3) DEFAULT NULL COMMENT 年龄, email varchar(100) DEFAULT NULL COMMENT 邮箱, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, is_deleted tinyint(1) DEFAULT 0 COMMENT 逻辑删除0未删1已删, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表; -- 插入测试数据 INSERT INTO user (user_name, age, email) VALUES (张三, 20, zhangsanexample.com), (李四, 25, lisiexample.com), (王五, 30, wangwuexample.com);4.2 创建实体类Entity在com.example.mybatisdemo.entity包下创建User实体类使用 Lombok 简化代码java运行package com.example.mybatisdemo.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; /** * 用户实体类与数据库 user 表对应 */ Data // Lombok 注解自动生成 getter/setter/toString/equals 等方法 TableName(user) // 指定数据库表名若类名与表名一致可省略 public class User { /** * 主键ID自增 */ TableId(type IdType.AUTO) // 主键策略与配置文件一致可覆盖 private Integer id; /** * 用户名对应数据库 user_name 字段 */ TableField(user_name) // 字段名与属性名不一致时指定驼峰转换开启可省略 private String userName; /** * 年龄 */ private Integer age; /** * 邮箱 */ private String email; /** * 创建时间自动填充 */ TableField(value create_time, fill FieldFill.INSERT) private LocalDateTime createTime; /** * 更新时间自动填充 */ TableField(value update_time, fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * 逻辑删除 */ TableLogic private Integer isDeleted; }注解说明DataLombok 核心注解替代手动编写 getter/setterTableName绑定数据库表名支持多表前缀如TableName(sys_user)TableId标记主键字段type指定主键生成策略TableField标记普通字段fill用于自动填充创建时间、更新时间TableLogic标记逻辑删除字段与配置文件logic-delete-field对应4.3 配置自动填充处理器可选实体类中createTime和updateTime字段配置了fill FieldFill.INSERT和fill FieldFill.INSERT_UPDATE需要创建处理器实现自动填充时间java运行package com.example.mybatisdemo.config; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; /** * MyBatis-Plus 自动填充处理器 */ Component // 交给 Spring 管理 public class MyMetaObjectHandler implements MetaObjectHandler { // 插入时自动填充createTime Override public void insertFill(MetaObject metaObject) { // 填充 createTime 字段属性名不是数据库字段名 strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); // 插入时 updateTime 与 createTime 一致 strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } // 更新时自动填充updateTime Override public void updateFill(MetaObject metaObject) { strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }五、MyBatis 基础使用XML 方式MyBatis 核心是Mapper 接口 XML 映射文件通过 XML 编写 SQL 语句Mapper 接口定义方法MyBatis 自动生成实现类。5.1 创建 Mapper 接口在com.example.mybatisdemo.mapper包下创建UserMapper接口java运行package com.example.mybatisdemo.mapper; import com.example.mybatisdemo.entity.User; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * User Mapper 接口MyBatis 基础方式 */ Mapper // 标记为 MyBatis Mapper 接口Spring 自动扫描 public interface UserMapper { // 1. 根据 ID 查询用户 User selectById(Integer id); // 2. 查询所有用户排除逻辑删除 ListUser selectAll(); // 3. 新增用户 int insert(User user); // 4. 根据 ID 更新用户 int updateById(User user); // 5. 根据 ID 删除用户逻辑删除 int deleteById(Integer id); }注解说明Mapper用于告诉 Spring 这是 MyBatis 的 Mapper 接口无需手动配置扫描也可在启动类添加MapperScan(com.example.mybatisdemo.mapper)批量扫描。5.2 创建 XML 映射文件在src/main/resources/mapper目录下创建UserMapper.xml文件与 Mapper 接口同名路径对应配置文件mapper-locationsxml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd !-- namespace 必须与 Mapper 接口全限定名一致 -- mapper namespacecom.example.mybatisdemo.mapper.UserMapper !-- 结果集映射实体类属性与数据库字段对应驼峰转换开启可省略 -- resultMap idBaseResultMap typeUser id columnid propertyid/ result columnuser_name propertyuserName/ result columnage propertyage/ result columnemail propertyemail/ result columncreate_time propertycreateTime/ result columnupdate_time propertyupdateTime/ result columnis_deleted propertyisDeleted/ /resultMap !-- 1. 根据 ID 查询用户 -- select idselectById resultMapBaseResultMap SELECT * FROM user WHERE id #{id} AND is_deleted 0 /select !-- 2. 查询所有用户 -- select idselectAll resultMapBaseResultMap SELECT * FROM user WHERE is_deleted 0 /select !-- 3. 新增用户 -- insert idinsert parameterTypeUser useGeneratedKeystrue keyPropertyid INSERT INTO user (user_name, age, email) VALUES (#{userName}, #{age}, #{email}) /insert !-- 4. 根据 ID 更新用户 -- update idupdateById parameterTypeUser UPDATE user SET user_name #{userName}, age #{age}, email #{email} WHERE id #{id} AND is_deleted 0 /update !-- 5. 根据 ID 删除用户逻辑删除 -- delete iddeleteById UPDATE user SET is_deleted 1 WHERE id #{id} /delete /mapperXML 核心标签说明namespace必须与 Mapper 接口全限定名一致否则 MyBatis 无法关联resultMap定义结果集映射解决字段名与属性名不一致、复杂对象嵌套等问题select/update/insert/delete对应 SQL 操作id必须与 Mapper 接口方法名一致#{}参数占位符预编译防止 SQL 注入useGeneratedKeystrue keyPropertyid获取自增主键值并赋值给实体类的id属性5.3 测试 MyBatis 基础功能创建测试类UserMapperTest在src/test/java/com/example/mybatisdemo/mapper下java运行package com.example.mybatisdemo.mapper; import com.example.mybatisdemo.entity.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; import static org.junit.jupiter.api.Assertions.*; SpringBootTest // 启动 Spring Boot 上下文 public class UserMapperTest { Autowired // 注入 Mapper 接口Spring 自动生成实现类 private UserMapper userMapper; // 测试查询所有用户 Test public void testSelectAll() { ListUser userList userMapper.selectAll(); assertFalse(userList.isEmpty()); System.out.println(所有用户 userList); } // 测试新增用户 Test public void testInsert() { User user new User(); user.setUserName(赵六); user.setAge(28); user.setEmail(zhaoliuexample.com); int rows userMapper.insert(user); assertEquals(1, rows); System.out.println(新增用户 ID user.getId()); // 自增 ID 已赋值 } // 测试更新用户 Test public void testUpdateById() { User user new User(); user.setId(4); // 新增用户的 ID user.setUserName(赵六666); user.setAge(29); int rows userMapper.updateById(user); assertEquals(1, rows); User updatedUser userMapper.selectById(4); assertEquals(赵六666, updatedUser.getUserName()); } // 测试删除用户逻辑删除 Test public void testDeleteById() { int rows userMapper.deleteById(4); assertEquals(1, rows); User deletedUser userMapper.selectById(4); assertNull(deletedUser); // 逻辑删除后查询不到 } }运行测试方法控制台会打印 SQL 语句同时验证功能是否正常。六、MyBatis-Plus 增强使用推荐MyBatis-Plus 核心优势是“零 SQL” CRUD通过继承BaseMapper或使用Service封装无需编写 XML / 注解 SQL直接调用方法即可完成常见操作。6.1 创建 Mapper 接口继承 BaseMapperMyBatis-Plus 提供BaseMapper接口包含 17 个常用 CRUD 方法如selectById、selectList、insert等直接继承即可使用java运行package com.example.mybatisdemo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.mybatisdemo.entity.User; import org.apache.ibatis.annotations.Mapper; /** * User Mapper 接口MyBatis-Plus 增强方式 * 继承 BaseMapperUser泛型为实体类 */ Mapper public interface UserMpMapper extends BaseMapperUser { // 无需编写任何方法BaseMapper 已提供常用 CRUD // 若需自定义 SQL仍可添加方法并编写 XML/注解 }注意若需自定义复杂查询如多条件分页、联表查询可在接口中添加方法配合 XML 或注解实现。6.2 创建 Service 层推荐封装业务逻辑MyBatis-Plus 还提供IService和ServiceImpl封装进一步简化业务层代码推荐实际开发中使用6.2.1 Service 接口继承 IServicejava运行package com.example.mybatisdemo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.mybatisdemo.entity.User; /** * User Service 接口MyBatis-Plus 增强 */ public interface UserService extends IServiceUser { // 可添加自定义业务方法如批量新增、复杂查询 }6.2.2 Service 实现类继承 ServiceImpljava运行package com.example.mybatisdemo.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.mybatisdemo.entity.User; import com.example.mybatisdemo.mapper.UserMpMapper; import com.example.mybatisdemo.service.UserService; import org.springframework.stereotype.Service; /** * User Service 实现类 * 继承 ServiceImplMapper, Entity注入 Mapper */ Service // 标记为 Spring 服务类 public class UserServiceImpl extends ServiceImplUserMpMapper, User implements UserService { // 无需编写任何实现ServiceImpl 已实现 IService 所有方法 // 自定义业务方法示例 // public ListUser selectUserByAge(Integer age) { // QueryWrapperUser wrapper new QueryWrapper(); // wrapper.eq(age, age); // return baseMapper.selectList(wrapper); // } }6.3 条件构造器QueryWrapper/LambdaQueryWrapperMyBatis-Plus 提供QueryWrapper字符串字段名和LambdaQueryWrapperLambda 表达式避免字段名硬编码用于构建复杂查询条件如多条件筛选、排序、分页等。6.3.1 测试 Service 条件构造器创建测试类UserServiceTestjava运行package com.example.mybatisdemo.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.mybatisdemo.entity.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; import static org.junit.jupiter.api.Assertions.*; SpringBootTest public class UserServiceTest { Autowired private UserService userService; // 1. 测试查询所有用户IService 内置方法 Test public void testList() { ListUser userList userService.list(); assertFalse(userList.isEmpty()); System.out.println(所有用户 userList); } // 2. 测试根据条件查询QueryWrapper字符串字段名 Test public void testQueryWrapper() { // 查询年龄 22 且邮箱包含 example 的用户 QueryWrapperUser wrapper new QueryWrapper(); wrapper.gt(age, 22) // gt greater than大于 .like(email, example); // like 模糊查询 ListUser userList userService.list(wrapper); System.out.println(条件查询结果 userList); } // 3. 测试 LambdaQueryWrapper避免字段名硬编码推荐 Test public void testLambdaQueryWrapper() { // 查询用户名 李四 或年龄 30 的用户 LambdaQueryWrapperUser lambdaWrapper new LambdaQueryWrapper(); lambdaWrapper.eq(User::getUserName, 李四) // eq equal等于 .or() // 或条件 .eq(User::getAge, 30); ListUser userList userService.list(lambdaWrapper); System.out.println(Lambda 条件查询结果 userList); } // 4. 测试分页查询需配置分页插件 Test public void testPage() { // 配置分页插件后直接使用 Page 对象分页 com.baomidou.mybatisplus.extension.plugins.pagination.PageUser page new com.baomidou.mybatisplus.extension.plugins.pagination.Page(1, 2); // 第1页每页2条 com.baomidou.mybatisplus.core.metadata.IPageUser userIPage userService.page(page); System.out.println(总记录数 userIPage.getTotal()); System.out.println(当前页数据 userIPage.getRecords()); } // 5. 测试逻辑删除IService 内置 remove 方法自动实现逻辑删除 Test public void testRemoveById() { boolean success userService.removeById(3); // 删除 ID3 的用户 assertTrue(success); User user userService.getById(3); // 查询已删除的用户 assertNull(user); } }6.4 配置分页插件MyBatis-Plus 必备分页查询需要手动配置MybatisPlusInterceptor插件在com.example.mybatisdemo.config包下创建配置类java运行package com.example.mybatisdemo.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * MyBatis-Plus 插件配置 */ Configuration public class MyBatisPlusConfig { /** * 分页插件 */ Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 添加 MySQL 分页拦截器不同数据库需对应不同拦截器如 Oracle interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }6.5 自定义 SQLMyBatis-Plus 兼容 MyBatisMyBatis-Plus 完全兼容 MyBatis 语法若需自定义复杂 SQL如联表查询、存储过程调用可按 MyBatis 方式编写 XML 或注解示例自定义联表查询假设存在order表关联user表在UserMpMapper中添加方法java运行// 联表查询用户及其订单 ListUserOrderVO selectUserWithOrder(Param(userId) Integer userId);在UserMpMapper.xml中编写 SQLxmlselect idselectUserWithOrder resultTypecom.example.mybatisdemo.vo.UserOrderVO SELECT u.id, u.user_name, o.order_no, o.amount FROM user u LEFT JOIN order o ON u.id o.user_id WHERE u.id #{userId} AND u.is_deleted 0 /select创建UserOrderVO实体类存储查询结果直接调用方法即可。七、代码生成器快速开发神器MyBatis-Plus 提供代码生成器可根据数据库表自动生成实体类、Mapper 接口、XML 映射文件、Service、Controller大幅减少重复工作。7.1 编写生成器配置类在src/main/java/com/example/mybatisdemo/generator包下创建CodeGeneratorjava运行package com.example.mybatisdemo.generator; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.Collections; /** * MyBatis-Plus 代码生成器 */ public class CodeGenerator { public static void main(String[] args) { // 数据库连接配置 String url jdbc:mysql://localhost:3306/mybatis_demo?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue; String username root; String password Root1234; // 代码生成核心配置 FastAutoGenerator.create(url, username, password) // 1. 全局配置 .globalConfig(builder - { builder.author(your-name) // 作者名 .outputDir(System.getProperty(user.dir) /src/main/java) // 输出目录项目 src/main/java .commentDate(yyyy-MM-dd) // 注释日期格式 .disableOpenDir(); // 生成后不打开文件夹 }) // 2. 包配置生成的代码存放路径 .packageConfig(builder - { builder.parent(com.example.mybatisdemo) // 父包名 .entity(entity) // 实体类包名 .mapper(mapper) // Mapper 接口包名 .xml(mapper.xml) // XML 映射文件包名resources 下 .service(service) // Service 接口包名 .serviceImpl(service.impl) // Service 实现类包名 .controller(controller) // Controller 包名 .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty(user.dir) /src/main/resources/mapper)); // XML 输出路径 }) // 3. 策略配置 .strategyConfig(builder - { builder.addInclude(user) // 要生成的表名多个表用逗号分隔如 user,order .addTablePrefix(t_) // 表前缀若表名是 t_user生成实体类为 User // 实体类策略 .entityBuilder() .enableLombok() // 开启 Lombok .enableTableFieldAnnotation() // 开启字段注解TableField .logicDeleteFieldName(is_deleted) // 逻辑删除字段 .idType(com.baomidou.mybatisplus.generator.config.rules.IdType.AUTO) // 主键策略 // Mapper 策略 .mapperBuilder() .superClass(BaseMapper.class) // 继承 BaseMapper .enableMapperAnnotation() // 开启 Mapper 注解 .enableBaseResultMap() // 生成 BaseResultMap // Service 策略 .serviceBuilder() .superServiceClass(IService.class) // 继承 IService .superServiceImplClass(ServiceImpl.class) // 继承 ServiceImpl // Controller 策略 .controllerBuilder() .enableRestStyle(); // 开启 REST 风格RestController }) // 4. 模板引擎Freemarker .templateEngine(new FreemarkerTemplateEngine()) // 执行生成 .execute(); } }7.2 运行生成器直接运行CodeGenerator的main方法控制台输出 “生成成功” 后可在对应包下看到自动生成的代码entityUser.java带 Lombok、逻辑删除、自动填充注解mapperUserMapper.java UserMapper.xml继承 BaseMapper包含基础 CRUDserviceUserService.java UserServiceImpl.java继承 IService/ServiceImplcontrollerUserController.javaREST 风格接口八、常见问题与排错指南8.1 数据库连接失败报错信息Access denied for user rootlocalhost (using password: YES)原因密码错误或用户无权限解决验证密码正确性重新设置密码并刷新权限报错信息The server time zone value Öйú±ê׼ʱ¼ä is unrecognized原因时区未配置解决URL 中添加serverTimezoneAsia/Shanghai报错信息Could not create connection to database server原因MySQL 驱动版本与数据库版本不兼容解决MySQL 8.0 对应驱动mysql-connector-java 8.xMySQL 5.7 对应5.x8.2 Mapper 接口无法注入Autowired 报错原因未添加Mapper注解或MapperScan扫描解决在 Mapper 接口添加Mapper注解或在 Spring Boot 启动类添加MapperScan(com.example.mybatisdemo.mapper)批量扫描8.3 XML 映射文件找不到报错信息BindingException: Invalid bound statement (not found)原因XML 文件路径与配置文件mapper-locations不一致或 Maven 未打包 XML 文件解决确保 XML 文件路径为resources/mapper/*.xml与配置一致在pom.xml中添加资源打包配置防止 Maven 过滤 XMLxmlbuild resources resource directorysrc/main/resources/directory includes include**/*.xml/include include**/*.yml/include /includes /resource /resources /build8.4 分页查询无效果返回所有数据原因未配置分页插件MybatisPlusInterceptor解决按 6.4 节配置分页插件确保插件被 Spring 扫描添加Configuration注解8.5 逻辑删除无效数据被物理删除原因未配置逻辑删除字段或注解解决数据库表添加is_deleted字段tinyint 类型默认 0实体类字段添加TableLogic注解配置文件中设置mybatis-plus.global-config.db-config.logic-delete-fieldisDeleted九、总结与进阶方向9.1 核心总结MySQL作为数据存储核心需熟练掌握安装配置、SQL 语法、索引优化MyBatis灵活控制 SQL适合复杂查询场景核心是 Mapper 接口 XML 映射MyBatis-Plus简化 CRUD 开发提供条件构造器、分页插件、代码生成器等增强功能推荐实际开发使用整合要点依赖配置 → 数据源配置 → Mapper/Service 编写 → 测试验证9.2 进阶方向性能优化开启 MyBatis 二级缓存CacheNamespace使用 MyBatis-Plus 批量操作saveBatch、updateBatchById数据库索引优化主键索引、联合索引复杂场景多表联查XML 编写 JOIN 语句或使用 MyBatis-Plus 关联查询动态 SQLMyBatis XML 中if、choose标签存储过程调用callabletrue分布式场景分库分表MyBatis-Plus 集成 Sharding-JDBC分布式事务Seata 与 MyBatis-Plus 整合工具拓展MyBatisX 插件IDEA 插件XML 与 Mapper 跳转、代码生成动态数据源多数据源切换MyBatis-Plus 集成 dynamic-datasource-spring-boot-starter通过本文的学习你已掌握 MySQL MyBatis MyBatis-Plus 的核心整合与使用方法可直接应用于实际项目开发。建议结合业务场景多练习深入理解 ORM 框架的设计思想提升数据持久层开发效率与质量。