属性字段自动填充
一、实体类和数据表添加两个字段(属性)
表:create_tiem/update_time
实体类:createTime/updateTime
二、实体类中属性进行注解添加
@TableField(fill=FieldFill.INSERT)
private Date createTime;
@TableField(fill=FieldFill.INSERT_UPDATE)
private Date updateTime;
三、创建实现MetaObjectHandler接口的类,并实现两个方法
一个方法添加执行,另一个方法修改执行
@Component
public class MyMetaObjectHandler implements MetaObjectHandler{
@Override
public void insertFill(MetaObject metaObject){
//旧版本,字段类型为Date
//this.setFieldValByName("createTime",new Date(),metaObject);
//新版本,字段类型为LocalDateTime
this.strictInsertFilll(metaObject,"createTime",LocalDateTime.class,LocalDateTime.now());
//对于其他属性,可以通过判断是否赋值来决定是否自动填充
Object age = this.getFieldValByName("age",metaObject);
if(age == null){
//说明业务层并没有手动填充,则自动填充
this.strictInsertFill(metaObject,"age",Integer.class,24);
}
//判断author属性是否被业务代码设值
boolean hasAuthor = metaObject.hasSetter("author");
if(hasAuthor){
this.strictInsertFill(metaObject,"author",String.class,"jordan");
}
}
@Override
public void updateFill(MetaObject metaObject){
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
乐观锁
一、在表中添加version字段,在实体类中添加version字段(Integer)
二、在实体类进行版本号操作属性上添加注解
@Version
private Integer version;
三、配置乐观锁插件
在启动类,或者单独新建一个config包下创建一个配置类
@Configuration
@MapperScan("com.michael.mapper")
public class MpConfig{
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
或者将其和分页插件配置到同一个配置类下
@Configuration
@MapperScan("com.michael.mybatisplus.mapper")
public class MybatisPusConfig{
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInterceptor());
return interceptor;
}
}
============================================================
多个id批量查询
List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
简单条件查询
Map<String,Object> columnMap = new HashMap<>();
columnMap.put("name","Jack");
columnMap.put("age",20);
List<User> users = userMapper.selectByMap(columnMap);
分页查询
①、配置分页插件配置类
@Configuration
@MapperScan("com.michael.mybatisplus.mapper") //可以将此注解从启动类上移过来
public class MybatisPlusConfig{
/**
旧版本,已经过时!
*/
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
patinationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
/**
新版本
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
②、编写分页代码,插件Page对象,传入两个对象,当前页和每页记录数
Page<User> page = new Page(1,3);
Page<User> userPage = userMapper.selectPage(page,null);//第二个参数为条件
//直接通过page变量,还可以执行如下操作
long pages = userPage.getPages();//总页数
long current = userPage.getCurrent();//当前页
List<User> records = userPage.getRecords();//查询数据集合
long tobal = userPage.getTotal();//总记录数
boolean b = userPage.hasNext(); //当前是否有下一页
boolean b1 = userPage.hasPrevious();//当前是否有上一页
逻辑删除
①、数据表添加一个字段boolean类型deleted,实体类添加属性Integer类型deleted
@TableField(value="is_deleted") //映射数据库字段
@TableLogic
private Integer deleted;
mysql数据库is_deleted字段的类型tinyint
②、application.properties配置文件中添加
以下配置为默认值,所以该配置可无
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
#全局设置主键生成策略
mybatis-plus.global-config.db-cofig.id-type=auto
条件构造器
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.isNull("name").ge("age",12).isNotNull("email");//构造条件
int result = userMapper.delete(queryWrapper);
//条件查询+分页
@PostMapping("findPageHospSet/{current}/{limit}")//参数:当前页,每页数量
public Result findPageHospSet(@PathVariable long current,@PathVariable long limit,
@RequestBody(required=false) HospitalSetQueryVo hospitalSetQueryVo//通过json传递
){
//创建page对象
Page<HospitalSet> page = new Page<>(current,limit);
//构建条件
QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
String hosname = hospitalSetQueryVo.getHosname();
String hoscode = hospitalSetQueryVo.getHoscode();
if(!StringUtils.isEmpty(hosname)){
wrapper.like("hosname",hospitalSetQueryVo.getHosname());
}
if(!StringUtils.isEmpty(hoscode)){
wrapper.eq("hoscode",hosipitalSetQueryVo.getHoscode());
}
Page<HospitalSet> pageHospitalSet = hospitalSetService.page(page,wrapper);
}
将控制方法的get改为post
参数添加注解@RequestBody
====================================================================
SpringBoot+MyBatisPlus常见问题
一、启动时,报出找不到mapper的问题
因为mapper包下是一个是实现了BaseMapper接口的接口,其实现类需要动态创建
方式一:需要在启动类上添加@MapperScan(“指定mapper包位置”)
方式二:配置类
@Configuration
@MapperScan("com.michael.mapper")
public class myConfig{
}