MyBatis-Plus的几种常见用法
MyBatis-Plus 提供了丰富的高级用法,可以简化开发,提高效率。以下是一些常见的可能会被忽略的用法示例。
(图片来源网络,侵删)
1. 乐观锁
乐观锁用于避免在并发环境下数据更新冲突。MyBatis-Plus 通过注解和版本字段实现乐观锁。
示例:
- 在实体类中添加版本字段,并使用 @Version 注解标记:
import com.baomidou.mybatisplus.annotation.Version;
public class User {
private Long id;
private String name;
@Version
private Integer version;
// Getters and setters
}
- 配置乐观锁插件:
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
- 使用乐观锁更新:
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 {
@Autowired
private UserMapper userMapper;
public void updateUser(User user) {
// 更新操作基于版本字段
UpdateWrapper updateWrapper = Wrappers.update()
.eq("id", user.getId())
.eq("version", user.getVersion());
user.setVersion(user.getVersion() + 1);
userMapper.update(user, updateWrapper);
}
}
2. 异常数据检测和自动填充
MyBatis-Plus 提供了一套通用字段自动填充功能,可以在插入和更新操作时自动填充某些字段。
示例:
- 创建自动填充处理类:
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}
- 在实体类中使用注解配置自动填充字段:
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. 逻辑删除
逻辑删除让记录在数据库中实际存在,但对外表现为已删除状态。
示例:
- 在实体类中添加逻辑删除字段:
import com.baomidou.mybatisplus.annotation.TableLogic;
public class User {
private Long id;
private String name;
@TableLogic
private Integer deleted;
// Getters and setters
}
- 配置逻辑删除插件:
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 {
@Bean
public 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 {
@Autowired
private UserMapper userMapper;
public List getUsersByName(String name) {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.like("name", name)
.eq("deleted", 0) // 逻辑未删除
.orderByDesc("createTime");
return userMapper.selectList(queryWrapper);
}
}
5. 分页查询
MyBatis-Plus 提供了分页插件,可轻松实现分页查询。
示例:
- 配置分页插件:
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 {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
- 使用分页查询:
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 {
@Autowired
private UserMapper userMapper;
public IPage getUsersByPage(int page, int size) {
Page userPage = new Page(page, size);
return userMapper.selectPage(userPage, null);
}
}
6. 自定义 SQL
MyBatis-Plus 支持在 Mapper 中直接编写自定义 SQL 以满足更复杂的查询需求。
示例:
- 在 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 {
@Select("SELECT * FROM user WHERE name = #{name}")
List selectByName(@Param("name") String name);
@Select("SELECT * FROM user WHERE age > #{age}")
IPage selectUsersByAge(Page page, @Param("age") int age);
}
- 使用自定义 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 {
@Autowired
private UserMapper userMapper;
public List getUsersByName(String name) {
return userMapper.selectByName(name);
}
public IPage getUsersByAge(int age, int page, int size) {
Page userPage = new Page(page, size);
return userMapper.selectUsersByAge(userPage, age);
}
}
以上是 MyBatis-Plus 中几个特别用法的示例,包括乐观锁、自动填充、逻辑删除、链式查询、分页查询和自定义 SQL。通过这些高级用法,你可以大大简化开发、提升代码质量。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
