MyBatis-Plus 是一个强大的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。
代码生成器:https://mp.baomidou.com/guide/generator.html
<!-- pom.xml -->
<properties>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
</properties>
<dependencies>
<!-- MyBatis-Plus 核心依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- 代码生成器(可选) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- 数据库驱动(以MySQL为例) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- Spring Boot Web(如果使用Spring Boot) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>// build.gradle
dependencies {
implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.3.1'
implementation 'com.baomidou:mybatis-plus-generator:3.5.3.1'
implementation 'mysql:mysql-connector-java:8.0.33'
implementation 'org.springframework.boot:spring-boot-starter-web'
}# application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus_demo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
mybatis-plus:
configuration:
# 日志实现
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 驼峰命名转换
map-underscore-to-camel-case: true
global-config:
db-config:
# 主键类型
id-type: auto
# 逻辑删除字段名
logic-delete-field: deleted
# 逻辑删除值
logic-delete-value: 1
# 逻辑未删除值
logic-not-delete-value: 0
mapper-locations: classpath*:/mapper/**/*.xmlimport com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String email;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableLogic
private Integer deleted;
}import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 可以在此处添加自定义方法
User selectByUsername(String username);
}import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
// 自定义业务方法
User getByUsername(String username);
}import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public User getByUsername(String username) {
return baseMapper.selectByUsername(username);
}
}import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class DataPermissionAspect {
/**
* 数据权限拦截器
*/
@Around("execution(* com.example.mapper.*.*(..))")
public Object dataPermissionInterceptor(ProceedingJoinPoint point) throws Throwable {
try {
// 前置处理:设置数据权限条件
setDataPermission();
// 执行原方法
return point.proceed();
} finally {
// 后置处理:清理数据权限条件
clearDataPermission();
}
}
private void setDataPermission() {
// 实现数据权限逻辑
// 例如:自动添加部门过滤条件
}
private void clearDataPermission() {
// 清理数据权限条件
}
}import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;
@Component
public class CustomInterceptor implements InnerInterceptor {
@Override
public void beforeQuery(Executor executor, MappedStatement ms,
Object parameter, RowBounds rowBounds,
ResultHandler resultHandler) {
// 查询前置处理
System.out.println("执行查询操作: " + ms.getId());
}
@Override
public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) {
// 更新前置处理
System.out.println("执行更新操作: " + ms.getId());
}
}import com.baomidou.mybatisplus.annotation.DbType;
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 {
/**
* 添加MyBatis-Plus插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 添加自定义拦截器
interceptor.addInnerInterceptor(new CustomInterceptor());
return interceptor;
}
/**
* 自动填充处理器
*/
@Bean
public MetaObjectHandler metaObjectHandler() {
return new MetaObjectHandler() {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
};
}
}import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 分页查询
*/
@GetMapping("/page")
public Page<User> page(@RequestParam(defaultValue = "1") Integer current,
@RequestParam(defaultValue = "10") Integer size) {
return userService.page(new Page<>(current, size));
}
/**
* 条件查询
*/
@GetMapping("/list")
public List<User> list(@RequestParam String username) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("username", username);
return userService.list(wrapper);
}
/**
* 根据ID查询
*/
@GetMapping("/{id}")
public User getById(@PathVariable Long id) {
return userService.getById(id);
}
/**
* 新增用户
*/
@PostMapping
public Boolean save(@RequestBody User user) {
return userService.save(user);
}
/**
* 更新用户
*/
@PutMapping
public Boolean update(@RequestBody User user) {
return userService.updateById(user);
}
/**
* 删除用户(逻辑删除)
*/
@DeleteMapping("/{id}")
public Boolean delete(@PathVariable Long id) {
return userService.removeById(id);
}
}@Service
public class ComplexQueryService {
@Autowired
private UserMapper userMapper;
/**
* 复杂条件查询
*/
public List<User> complexQuery(String username, Integer minAge, Integer maxAge) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(username), "username", username)
.ge(minAge != null, "age", minAge)
.le(maxAge != null, "age", maxAge)
.orderByDesc("create_time");
return userMapper.selectList(wrapper);
}
/**
* Lambda表达式查询
*/
public List<User> lambdaQuery(String email) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getEmail, email)
.gt(User::getAge, 18);
return userMapper.selectList(wrapper);
}
}import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import java.util.Collections;
public class CodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus_demo", "root", "123456")
.globalConfig(builder -> {
builder.author("developer") // 设置作者
.enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir("D://mybatis-plus"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.example") // 设置父包名
.moduleName("system") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.xml, "D://mybatis-plus"));
})
.strategyConfig(builder -> {
builder.addInclude("user") // 设置需要生成的表名
.addTablePrefix("t_", "c_"); // 设置过滤表前缀
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}MyBatis-Plus 提供了丰富的功能和便捷的API,大大简化了MyBatis的使用。通过合理的配置和代理机制,可以实现数据权限控制、自动填充、逻辑删除等高级功能。建议在实际项目中根据具体需求选择合适的配置和扩展方式。