怎样 管理网站,短视频运营培训学费多少,wordpress调用规则,彩票网站链接怎么做MyBatis-Plus的优势
在 Spring Data JPA 已经很方便的情况下#xff0c;有时仍然选择使用 MyBatis-Plus 的核心原因主要有以下三点#xff1a;
1. 复杂 SQL 控制能力更强
MyBatis-Plus 允许直接编写和优化 SQL#xff0c;适合复杂查询、精细化 SQL 控制的场景。特别是在性…MyBatis-Plus的优势
在 Spring Data JPA 已经很方便的情况下有时仍然选择使用 MyBatis-Plus 的核心原因主要有以下三点
1. 复杂 SQL 控制能力更强
MyBatis-Plus 允许直接编写和优化 SQL适合复杂查询、精细化 SQL 控制的场景。特别是在性能要求高的应用中通过手写 SQL 可以确保更高的查询效率。Spring Data JPA 自动生成的 SQL 对于简单 CRUD 很方便但在复杂 SQL如多表关联查询、子查询等场景中性能和灵活性上不如 MyBatis-Plus。
2. 动态 SQL 支持强大
MyBatis-Plus 提供了 Wrapper 条件构造器灵活构建动态查询条件适合复杂的业务逻辑如根据用户输入动态构建查询条件。Spring Data JPA 尽管支持 Query 和 Specifications但在动态 SQL 构建上不如 MyBatis-Plus 简洁易用。
3. 高效代码生成适合大规模表操作
MyBatis-Plus 自带代码生成器能快速生成实体、Mapper、Service 等基础代码减少样板代码的编写。Spring Data JPA 没有代码生成器需要手动创建实体和 Repository 接口在操作大量表时MyBatis-Plus 的代码生成器能显著提高开发效率。
1. MyBatis 基础
1.1 MyBatis 配置与集成
在 Spring Boot 中集成 MyBatis首先需要引入 MyBatis 依赖并配置数据库连接等基础信息。
1.1.1 引入 MyBatis 依赖
在 pom.xml 中添加 MyBatis 相关依赖。Spring Boot 提供了 mybatis-spring-boot-starter使 MyBatis 与 Spring Boot 无缝集成。
dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.3.0/version !-- 使用最新版本 --
/dependency1.1.2 配置数据库连接
在 application.yml或 application.properties中配置数据库连接信息。以 MySQL 为例
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver这部分配置告诉 Spring Boot 如何连接到数据库并为 MyBatis 提供必要的连接信息。
1.1.3 配置 MyBatis 扫描路径
MyBatis 需要知道 Mapper 接口和 XML 映射文件的位置。可以在 application.yml 中配置 mapper-locations 和 type-aliases-package
mybatis:mapper-locations: classpath*:mapper/*.xmltype-aliases-package: com.example.demo.model # 实体类包路径mapper-locations指定 MyBatis XML 映射文件的位置在 resources/mapper 目录下。type-aliases-package指定实体类所在的包路径MyBatis 会自动为该包中的实体类创建别名。
1.1.4 启动类中配置 MapperScan
在 Spring Boot 启动类中使用 MapperScan 指定 MyBatis Mapper 接口所在的包路径这样 MyBatis 才能自动扫描并加载这些接口。
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
MapperScan(com.example.demo.mapper) // Mapper 接口的包路径
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}这样Spring Boot 项目就成功集成了 MyBatis可以开始使用 MyBatis 的功能了。 1.2 Mapper 映射
MyBatis 使用 Mapper 接口与 XML 映射文件结合的方式来完成数据库操作。通过这种映射方式可以将 Java 方法与 SQL 语句对应起来。
1.2.1 创建 Mapper 接口
在 com.example.demo.mapper 包中创建一个 Mapper 接口定义数据库操作方法。例如定义 UserMapper 接口
package com.example.demo.mapper;import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;Mapper
public interface UserMapper {User selectUserById(Long id);ListUser selectAllUsers();int insertUser(User user);int updateUser(User user);int deleteUserById(Long id);
}Mapper 接口定义数据库操作方法。Spring Boot 会自动扫描带有 Mapper 注解的接口将它们注册为 MyBatis Mapper。
1.2.2 创建 XML 映射文件
在 resources/mapper 目录下创建一个与 UserMapper 对应的 XML 文件 UserMapper.xml在其中编写具体的 SQL 语句。
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.demo.mapper.UserMapperselect idselectUserById resultTypecom.example.demo.model.UserSELECT * FROM users WHERE id #{id}/selectselect idselectAllUsers resultTypecom.example.demo.model.UserSELECT * FROM users/selectinsert idinsertUser parameterTypecom.example.demo.model.UserINSERT INTO users (name, email)VALUES (#{name}, #{email})/insertupdate idupdateUser parameterTypecom.example.demo.model.UserUPDATE usersSET name #{name}, email #{email}WHERE id #{id}/updatedelete iddeleteUserById parameterTypeLongDELETE FROM users WHERE id #{id}/delete/mappernamespace指定 XML 文件对应的 Mapper 接口的完全限定名。id对应 Mapper 接口中的方法名。parameterType 和 resultType分别表示传入参数的类型和返回值的类型。
以上代码展示了如何使用 XML 映射文件实现基本的 CRUD 操作。 1.3 动态 SQL
MyBatis 提供了动态 SQL 标签可以根据传入的参数生成不同的 SQL 语句。常用的动态 SQL 标签包括 if、choose、when、otherwise 和 foreach。
1.3.1 if 标签
if 标签根据条件判断是否生成相应的 SQL 片段适用于可选查询条件。
select idselectUsersByName resultTypecom.example.demo.model.UserSELECT * FROM usersWHERE 11if testname ! nullAND name #{name}/if
/selecttest判断条件当 name 不为 null 时会生成 AND name #{name}。
1.3.2 choose、when 和 otherwise 标签
类似于 if...else if...else 的结构。choose 包含多个 when 和一个 otherwise用于条件分支选择。
select idselectUsers resultTypecom.example.demo.model.UserSELECT * FROM userschoosewhen testname ! nullWHERE name #{name}/whenwhen testemail ! nullWHERE email #{email}/whenotherwiseWHERE status active/otherwise/choose
/select当 name 不为空时生成 WHERE name #{name}如果 email 不为空且 name 为空则生成 WHERE email #{email}否则生成 WHERE status active。
1.3.3 foreach 标签
foreach 标签用于循环生成 SQL常用于 IN 查询。foreach 可以将集合中的元素逐一添加到 SQL 中。
select idselectUsersByIds resultTypecom.example.demo.model.UserSELECT * FROM usersWHERE id INforeach itemid collectionidList open( separator, close)#{id}/foreach
/selectcollection指定参数的集合名。item指定集合中每个元素的名称。open、separator 和 close**分别指定起始符、分隔符和结束符。
当 idList 传入 [1, 2, 3] 时生成的 SQL 为WHERE id IN (1, 2, 3)。
2. MyBatis-Plus 基础
2.1 MyBatis-Plus 配置与集成
在 Spring Boot 项目中集成 MyBatis-Plus 是第一步通常包括引入依赖、配置数据源以及扫描路径等基础配置。
2.1.1 引入 MyBatis-Plus 依赖
在 pom.xml 中添加 MyBatis-Plus 的依赖通常还需要 MyBatis 和 MySQL 的驱动依赖
dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.0/version !-- 使用最新稳定版本 --
/dependency
dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.30/version
/dependency2.1.2 配置数据库连接
在 application.yml或 application.properties中配置数据库连接信息。以 MySQL 为例
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver2.1.3 启动类配置 MapperScan
在 Spring Boot 启动类中使用 MapperScan 注解指定 MyBatis-Plus Mapper 接口的扫描路径
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
MapperScan(com.example.demo.mapper) // Mapper 接口的包路径
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}完成这些步骤后Spring Boot 项目便成功集成了 MyBatis-Plus可以开始使用它的增强功能。 2.2 BaseMapper 基础 CRUD 操作
MyBatis-Plus 提供了 BaseMapper 接口封装了常用的 CRUD 操作。只需继承 BaseMapper即可获得基本的数据库操作方法而不需要编写复杂的 SQL 语句。
2.2.1 创建实体类
在 com.example.demo.model 包中创建实体类 User并使用 TableId 指定主键
package com.example.demo.model;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;Data
public class User {TableId(type IdType.AUTO) // 自增主键private Long id;private String name;private String email;
}2.2.2 创建 Mapper 接口
在 com.example.demo.mapper 包中创建 UserMapper 接口继承 BaseMapperUser 即可
package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;Mapper
public interface UserMapper extends BaseMapperUser {
}BaseMapper 提供的常用方法有
selectById(id)根据主键查询。selectList(null)查询所有记录。insert(entity)插入新记录。updateById(entity)根据主键更新。deleteById(id)根据主键删除。
2.2.3 使用示例
在 Service 或 Controller 中可以直接注入 UserMapper并调用这些方法
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;Service
public class UserService {Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.selectById(id);}public ListUser getAllUsers() {return userMapper.selectList(null);}public void addUser(User user) {userMapper.insert(user);}public void updateUser(User user) {userMapper.updateById(user);}public void deleteUser(Long id) {userMapper.deleteById(id);}
}通过继承 BaseMapper实现了基本的 CRUD 操作大大简化了数据库操作。 2.3 分页查询
MyBatis-Plus 提供了分页功能可以使用 Page 对象直接实现分页查询。
2.3.1 引入分页插件
在 Spring Boot 中需要配置分页插件通常在配置类中添加 PaginationInterceptor
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class MyBatisPlusConfig {Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}2.3.2 使用 Page 对象进行分页查询
在 Service 中可以通过 Page 对象传递分页参数进行分页查询
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;Service
public class UserService {Autowiredprivate UserMapper userMapper;public PageUser getUsersPage(int page, int size) {PageUser userPage new Page(page, size);return userMapper.selectPage(userPage, null);}
}PageUser userPage new Page(page, size);指定当前页和每页的记录数。userMapper.selectPage(userPage, null);执行分页查询其中 null 表示没有额外的查询条件。
分页查询结果包含分页信息和数据列表可以直接返回给前端。 2.4 Wrapper 条件构造器
MyBatis-Plus 提供了 Wrapper 条件构造器用于灵活构建查询条件常用的构造器包括 QueryWrapper、UpdateWrapper 等。
2.4.1 使用 QueryWrapper 进行条件查询
QueryWrapper 用于构建查询条件例如条件查询、模糊查询、排序等
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;Service
public class UserService {Autowiredprivate UserMapper userMapper;public ListUser getUsersByName(String name) {QueryWrapperUser queryWrapper new QueryWrapper();queryWrapper.eq(name, name); // 相当于 WHERE name #{name}return userMapper.selectList(queryWrapper);}
}eq(name, name)等于条件生成 WHERE name #{name}。QueryWrapper 支持链式调用可以组合多个条件。
2.4.2 使用 UpdateWrapper 进行条件更新
UpdateWrapper 用于构建更新条件例如更新指定条件的记录
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;Service
public class UserService {Autowiredprivate UserMapper userMapper;public void updateUserEmail(Long id, String email) {UpdateWrapperUser updateWrapper new UpdateWrapper();updateWrapper.eq(id, id); // 更新条件 WHERE id #{id}User user new User();user.setEmail(email);userMapper.update(user, updateWrapper);}
}eq(id, id)等于条件生成 WHERE id #{id}。userMapper.update(user, updateWrapper)根据 UpdateWrapper 条件更新记录。
常用的 Wrapper 方法
eq等于。ne不等于。like模糊查询。gt / lt大于 / 小于。orderByDesc降序排序。between区间查询。
3. 必备注解与功能
3.1 TableId 和 IdType定义主键与生成策略
在 MyBatis-Plus 中TableId 注解用于指定数据库表的主键字段而 IdType 则用于设置主键的生成策略。
3.1.1 TableId 注解
TableId 注解用于标识实体类中的主键字段。使用 TableId 可以指定主键字段的名称和生成策略。
示例
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;Data
public class User {TableId(type IdType.AUTO) // 主键生成策略为自增private Long id;private String name;private String email;
}属性 value指定主键字段对应的数据库列名默认与字段名相同。type指定主键生成策略使用 IdType 枚举。
3.1.2 IdType主键生成策略
MyBatis-Plus 提供了多种主键生成策略可以通过 IdType 设置主键生成策略。常用的生成策略有
IdType.AUTO自增主键通常依赖数据库自增机制适用于 MySQL 等支持自增的数据库。IdType.INPUT手动输入必须在插入数据前手动设置主键值。IdType.UUID全局唯一的 UUID。IdType.ASSIGN_ID雪花算法生成的唯一 ID适用于分布式场景。
示例
TableId(type IdType.AUTO) // 数据库自增主键
TableId(type IdType.UUID) // UUID 作为主键
TableId(type IdType.ASSIGN_ID) // 使用雪花算法生成唯一 ID选择合适的主键生成策略可以有效减少主键冲突尤其是在分布式环境下。 3.2 TableLogic逻辑删除
TableLogic 注解用于实现逻辑删除逻辑删除并不会物理删除记录而是将记录标记为删除状态。MyBatis-Plus 会根据 TableLogic 的配置自动过滤被逻辑删除的数据。
3.2.1 使用逻辑删除注解
在实体类的逻辑删除字段上添加 TableLogic 注解可以实现逻辑删除功能。
示例
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;Data
public class User {TableId(type IdType.AUTO)private Long id;private String name;private String email;TableLogicprivate Integer deleted; // 逻辑删除标识字段0 - 未删除1 - 已删除
}deleted 字段被 TableLogic 注解标记后在执行删除操作时MyBatis-Plus 不会物理删除数据而是将 deleted 字段的值更新为 1。通常使用 Integer 类型字段来表示删除状态0 表示未删除1 表示已删除。
3.2.2 配置逻辑删除值
可以在 application.yml 中配置逻辑删除值指定删除和未删除的状态
mybatis-plus:global-config:db-config:logic-delete-value: 1 # 删除状态logic-not-delete-value: 0 # 未删除状态配置好后MyBatis-Plus 会自动处理逻辑删除的数据查询和删除。例如以下代码将只查询未删除的数据
public ListUser getAllActiveUsers() {return userMapper.selectList(null); // 只会查询 deleted 为 0 的记录
}使用逻辑删除的好处
逻辑删除避免了物理删除带来的数据丢失保留历史数据。在数据恢复、日志审计等场景下更为方便。 3.3 乐观锁Version
在并发环境下乐观锁可以确保数据的一致性。Version 注解用于启用乐观锁机制MyBatis-Plus 会在更新数据时自动检查 Version 字段只有在没有其他线程修改该数据的情况下才会执行更新操作。
3.3.1 使用乐观锁注解
在实体类中添加一个版本号字段并在字段上添加 Version 注解。每次更新时MyBatis-Plus 会检查版本号是否一致确保数据安全。
示例
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;Data
public class User {TableId(type IdType.AUTO)private Long id;private String name;private String email;Versionprivate Integer version; // 乐观锁版本号字段
}版本号字段通常使用 Integer 或 Long 类型每次更新时版本号自动递增。
3.3.2 乐观锁工作原理
乐观锁的原理是在执行更新操作时检查数据库中的 version 字段是否与传入的 version 值一致如果一致则执行更新并将 version 1否则放弃更新操作。
示例流程
查询数据获取当前版本号假设 version1。更新时检查 WHERE 条件中的版本号是否仍为 1。如果版本号一致执行更新并将版本号递增。如果版本号不一致表示数据已经被其他线程修改过此时更新操作会失败。
3.3.3 配置乐观锁插件
为确保乐观锁功能正常工作通常需要在配置类中添加乐观锁插件
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class MyBatisPlusConfig {Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}
}添加 OptimisticLockerInterceptor 插件后MyBatis-Plus 会自动处理 Version 字段的更新操作。
4. 代码生成器MyBatis-Plus
代码生成器的作用是根据数据库表自动生成符合 MyBatis-Plus 规范的基础代码。通过配置代码生成器可以生成以下内容
实体类包含表字段的映射以及常用的注解如 TableId、TableLogic 等。Mapper 接口继承 BaseMapper提供基础的 CRUD 方法。Service 接口和实现类包含业务逻辑层的接口和实现简化业务层代码。Controller包含基础的 HTTP 接口提供 API 层的访问入口。 4.1 基本配置
代码生成器可以在 Spring Boot 项目的任意位置编写例如可以在 src/test/java 中创建一个专用的测试类用于运行代码生成器并生成文件。
4.1.1 引入依赖
在 pom.xml 中添加代码生成器依赖如果已引入 mybatis-plus-boot-starter可以忽略此步
dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-generator/artifactIdversion3.5.0/version !-- 最新稳定版本 --
/dependency
dependencygroupIdorg.apache.velocity/groupIdartifactIdvelocity-engine-core/artifactIdversion2.3/version !-- 模板引擎用于生成代码模板 --
/dependency
dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.30/version
/dependency4.1.2 创建代码生成器配置类
在 src/test/java 目录下新建一个测试类 CodeGenerator在其中进行代码生成的配置。以下是一个完整的代码生成器示例。
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;public class CodeGenerator {public static void main(String[] args) {// 1. 创建代码生成器AutoGenerator mpg new AutoGenerator();// 2. 全局配置GlobalConfig gc new GlobalConfig();gc.setOutputDir(System.getProperty(user.dir) /src/main/java); // 生成文件的输出目录gc.setAuthor(YourName); // 设置作者gc.setOpen(false); // 生成后是否打开文件夹gc.setFileOverride(true); // 是否覆盖已有文件gc.setIdType(IdType.AUTO); // 主键策略gc.setSwagger2(true); // 是否启用 Swagger2mpg.setGlobalConfig(gc);// 3. 数据源配置DataSourceConfig dsc new DataSourceConfig();dsc.setUrl(jdbc:mysql://localhost:3306/mydb?useSSLfalseserverTimezoneUTC);dsc.setDriverName(com.mysql.cj.jdbc.Driver);dsc.setUsername(root);dsc.setPassword(password);mpg.setDataSource(dsc);// 4. 包配置PackageConfig pc new PackageConfig();pc.setParent(com.example.demo); // 设置父包名pc.setModuleName(user); // 设置模块名可选pc.setEntity(model); // 设置实体类包名pc.setMapper(mapper); // 设置 Mapper 包名pc.setService(service); // 设置 Service 包名pc.setServiceImpl(service.impl); // 设置 Service 实现类包名pc.setController(controller); // 设置 Controller 包名mpg.setPackageInfo(pc);// 5. 策略配置StrategyConfig strategy new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel); // 表名转换为驼峰命名strategy.setColumnNaming(NamingStrategy.underline_to_camel); // 字段名转换为驼峰命名strategy.setEntityLombokModel(true); // 使用 Lombok 注解strategy.setRestControllerStyle(true); // 生成 RESTful 风格的 Controllerstrategy.setInclude(user); // 生成的表名strategy.setControllerMappingHyphenStyle(true); // URL 中驼峰转连字符mpg.setStrategy(strategy);// 6. 模板引擎mpg.setTemplateEngine(new VelocityTemplateEngine());// 7. 执行生成mpg.execute();}
}配置说明
全局配置 (GlobalConfig)配置作者、输出目录、是否覆盖文件、主键策略等全局参数。数据源配置 (DataSourceConfig)配置数据库连接信息包括 URL、用户名、密码等。包配置 (PackageConfig)设置各层的包名结构指定父包名和各个模块的包名。策略配置 (StrategyConfig)指定生成策略包括表名、字段命名策略、是否使用 Lombok、是否启用 REST 风格 Controller 等。模板引擎设置使用 Velocity 模板引擎生成代码可选的模板引擎还有 Freemarker、Beetl 等。
配置完成后运行 CodeGenerator 的 main 方法即可自动生成代码。 4.2 生成代码示例
运行代码生成器后将会在 src/main/java 目录下生成以下代码文件
实体类User在 model 包下生成实体类包括表字段、主键等的映射并带有 Lombok 注解。Mapper 接口UserMapper在 mapper 包下生成 Mapper 接口继承自 BaseMapper包含 CRUD 方法。Service 接口和实现类UserService 和 UserServiceImpl在 service 和 service.impl 包下生成业务接口和实现类。ControllerUserController在 controller 包下生成 RESTful 风格的 Controller提供 HTTP 接口。
生成的代码示例如下
4.2.1 实体类
package com.example.demo.model;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;Data
public class User {TableId(type IdType.AUTO)private Long id;private String name;private String email;TableLogicprivate Integer deleted; // 逻辑删除字段Versionprivate Integer version; // 乐观锁字段
}4.2.2 Mapper 接口
package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.User;public interface UserMapper extends BaseMapperUser {
}4.2.3 Service 接口和实现类
Service 接口
package com.example.demo.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.model.User;public interface UserService extends IServiceUser {
}Service 实现类
package com.example.demo.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;Service
public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService {
}4.2.4 Controller
package com.example.demo.controller;import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;RestController
RequestMapping(/user)
public class UserController {Autowiredprivate UserService userService;GetMapping(/list)public ListUser listUsers() {return userService.list();}PostMapping(/add)public boolean addUser(RequestBody User user) {return userService.save(user);}PutMapping(/update)public boolean updateUser(RequestBody User user) {return userService.updateById(user);}DeleteMapping(/delete/{id})public boolean deleteUser(PathVariable Long id) {return userService.removeById(id);}
}