当前位置: 首页 > news >正文

MyBatis-Plus的几种常见用法

MyBatis-Plus 提供了丰富的高级用法,可以简化开发,提高效率。以下是一些常见的可能会被忽略的用法示例。

1. 乐观锁

乐观锁用于避免在并发环境下数据更新冲突。MyBatis-Plus 通过注解和版本字段实现乐观锁。

示例

  1. 在实体类中添加版本字段,并使用 @Version 注解标记:
import com.baomidou.mybatisplus.annotation.Version;public class User {private Long id;private String name;@Versionprivate Integer version;// Getters and setters
}
  1. 配置乐观锁插件:
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();}
}
  1. 使用乐观锁更新:
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public void updateUser(User user) {// 更新操作基于版本字段UpdateWrapper<User> updateWrapper = Wrappers.<User>update().eq("id", user.getId()).eq("version", user.getVersion());user.setVersion(user.getVersion() + 1);userMapper.update(user, updateWrapper);}
}

2. 异常数据检测和自动填充

MyBatis-Plus 提供了一套通用字段自动填充功能,可以在插入和更新操作时自动填充某些字段。

示例

  1. 创建自动填充处理类:
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);}
}
  1. 在实体类中使用注解配置自动填充字段:
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import java.time.LocalDateTime;public class User {private Long id;private String name;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;// Getters and setters
}

3. 逻辑删除

逻辑删除让记录在数据库中实际存在,但对外表现为已删除状态。

示例

  1. 在实体类中添加逻辑删除字段:
import com.baomidou.mybatisplus.annotation.TableLogic;public class User {private Long id;private String name;@TableLogicprivate Integer deleted;// Getters and setters
}
  1. 配置逻辑删除插件:
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.LogicDeleteInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new LogicDeleteInnerInterceptor());return interceptor;}
}

4. 查询链式调用

MyBatis-Plus 提供了丰富的链式查询接口,简化了条件拼接。

示例

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getUsersByName(String name) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("name", name).eq("deleted", 0) // 逻辑未删除.orderByDesc("createTime");return userMapper.selectList(queryWrapper);}
}

5. 分页查询

MyBatis-Plus 提供了分页插件,可轻松实现分页查询。

示例

  1. 配置分页插件:
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;@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
  1. 使用分页查询:
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public IPage<User> getUsersByPage(int page, int size) {Page<User> userPage = new Page<>(page, size);return userMapper.selectPage(userPage, null);}
}

6. 自定义 SQL

MyBatis-Plus 支持在 Mapper 中直接编写自定义 SQL 以满足更复杂的查询需求。

示例

  1. 在 Mapper 接口中定义自定义 SQL:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;public interface UserMapper extends BaseMapper<User> {@Select("SELECT * FROM user WHERE name = #{name}")List<User> selectByName(@Param("name") String name);@Select("SELECT * FROM user WHERE age > #{age}")IPage<User> selectUsersByAge(Page<User> page, @Param("age") int age);
}
  1. 使用自定义 SQL 查询:
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getUsersByName(String name) {return userMapper.selectByName(name);}public IPage<User> getUsersByAge(int age, int page, int size) {Page<User> userPage = new Page<>(page, size);return userMapper.selectUsersByAge(userPage, age);}
}

以上是 MyBatis-Plus 中几个特别用法的示例,包括乐观锁、自动填充、逻辑删除、链式查询、分页查询和自定义 SQL。通过这些高级用法,你可以大大简化开发、提升代码质量。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTML5大作业三农有机,农产品,农庄,农旅网站源码
  • C语言 | Leetcode C语言题解之第239题滑动窗口最大值
  • 线程安全性问题(一)
  • SQL Server性能监控秘籍:数据库性能计数器阈值设置指南
  • 紫光展锐5G安卓核心板T760__国产手机芯片方案
  • 【分布式存储系统HDFS】架构和使用
  • Spring Boot集成starrocks快速入门Demo
  • laravel为Model设置全局作用域
  • Unity Apple Vision Pro 开发(四):体积相机 Volume Camera
  • golang性能调试工具net/http/pprof
  • 时序数据库如何选型?详细指标总结!
  • ubuntu如何彻底卸载android studio?
  • 掌握Python中的文件序列化:Json和Pickle模块解析
  • 笔记:Few-Shot Learning小样本分类问题 + 孪生网络 + 预训练与微调
  • Python面试整理-字典和集合的操作
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • go append函数以及写入
  • Java知识点总结(JavaIO-打印流)
  • js操作时间(持续更新)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Node 版本管理
  • Redis中的lru算法实现
  • Theano - 导数
  • 百度地图API标注+时间轴组件
  • 对象管理器(defineProperty)学习笔记
  • 力扣(LeetCode)56
  • 批量截取pdf文件
  • 如何进阶一名有竞争力的程序员?
  • 入门到放弃node系列之Hello Word篇
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用 Docker 部署 Spring Boot项目
  • 数组大概知多少
  • 学习使用ExpressJS 4.0中的新Router
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • # 职场生活之道:善于团结
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • #图像处理
  • (19)夹钳(用于送货)
  • (4)事件处理——(7)简单事件(Simple events)
  • (C++哈希表01)
  • (vue)页面文件上传获取:action地址
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十八)Flink CEP 详解
  • (转)memcache、redis缓存
  • (转)四层和七层负载均衡的区别
  • .htaccess配置常用技巧
  • .NET C# 使用GDAL读取FileGDB要素类
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler