MybatisPlusInterceptor实现sql拦截器(超详细)
1 . 导入pom
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
2 . 配置下MybatisPlus的yml
mybatis-plus:
mapper-locations:
- classpath:mapper/*/*Mapper.xml
global-config:
db-config:
id-type: auto
banner: true
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3 . 实体类
@Data
@TableName("sys_user")
@ApiModel(value = "SysUser对象", description = "用户信息")
public class SysUser implements Serializable {
@TableId("SU_CODE")
@ApiModelProperty(value = "用户编码")
private String suCode;
@TableField("SUS_CODE")
@ApiModelProperty(value = "分类编码")
private String susCode;
@TableField("SU_NAME")
@ApiModelProperty(value = "用户姓名")
private String suName;
@TableField("SU_SEX")
@ApiModelProperty(value = "性别:0未知,1男,2女")
private Integer suSex;
@TableField("SU_AGE")
@ApiModelProperty(value = "年龄")
private Integer suAge;
}
4 . DTO
@Data
@ApiModel(value = "SysUserDTO对象", description = "用户信息DTO")
public class SysUserDTO {
@ApiModelProperty(value = "用户编码")
private String suCode;
@ApiModelProperty(value = "分类编码")
private String susCode;
@ApiModelProperty(value = "用户姓名")
private String suName;
@ApiModelProperty(value = "性别:0未知,1男,2女")
private Integer suSex;
@ApiModelProperty(value = "年龄")
private Integer suAge;
private Integer page = 1;
private Integer limit = 10;
}
5 . MybatisPlus的config
import cn.hutool.core.util.ArrayUtil;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
log.info("进入sql拦截器");
//分页拦截器插件
//如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
//租户id(拼接sql的条件的值)
@Override
public Expression getTenantId() {
return new LongValue(1);
}
//追加的字段(拼接sql的条件)
@Override
public String getTenantIdColumn() {
return "SU_CODE";
}
//去掉实体类字段
@Override
public boolean ignoreTable(String tableName) {
String[] arr = new String[]{
"susCode",
"suName",
"suSex",
"suAge"
};
return ArrayUtil.contains(arr, tableName);
}
}));
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
// 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
}
6 . controller
@RestController
@RequestMapping("exam")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
@RequestMapping("list")
public IPage<SysUser> list(SysUserDTO userDTO) {
IPage<SysUser> page = new Page<>(userDTO.getPage(), userDTO.getLimit());
return sysUserService.page(page);
}
}
7 . 测试
成功实现sql拦截并进行拼接