mybatis-plus提高效率的CRUD操作

1、代码级别的自动填充

1. 在实体类添加@TableField注解

前提是你的数据库里面有相应的字段,并且没有自动填充的设置,然后在需要填充的属性上加上@TableField注解

package com.hzxy.mybatisplus.model;


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    

    private Long id;
    private String name;
    private Integer age;
    private String email;

    //  字段添加填充
    @TableField(fill = FieldFill.INSERT)
    private Date CreateTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date UpdateTime;
}

2. 编写自定义处理器

我们需要编写自定义处理器来处理填充内容

package com.hzxy.mybatisplus.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component      //把处理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
    
    

    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
    
    
        log.info("start insert fill .......");
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    // 更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
    
    
        log.info("start update fill .......");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

3. 测试

    @Test
    public void testInsert(){
    
    
        User user = new User();
        user.setName("Ye");
        user.setAge(18);
        user.setEmail("[email protected]");
        int result = userMapper.insert(user);
        System.out.println(result);
        System.out.println(user);
    }

    @Test
    public void testUpdate(){
    
    
        User user = new User();
        user.setId(1364545190177611777L);
        user.setName("Ye");
        user.setAge(20);
        user.setEmail("[email protected]");
        int result = userMapper.updateById(user);
        System.out.println(result);
        System.out.println(user);
    }
}

结果:
在这里插入图片描述

2、添加SQL语句日志

在配置中加入

### 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

结果:
在这里插入图片描述

3、添加乐观锁插件

1. 在实体类中加入@Version注解

注意数据库中必须有对应的字段

package com.hzxy.mybatisplus.model;


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    

    private Long id;
    private String name;
    private Integer age;
    private String email;

    @Version    //乐观锁version注解
    private Integer version;

    //  字段添加填充
    @TableField(fill = FieldFill.INSERT)
    private Date CreateTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date UpdateTime;
}

2. 添加配置配置类

我们新建一个配置类,并把扫描Mapper的注解放到这个类

package com.hzxy.mybatisplus.config;


import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

// 扫描我们的 Mapper 文件夹
@MapperScan("com.hzxy.mybatisplus.mapper")
@EnableTransactionManagement
@Configuration  //配置类
public class MybatisPlusConfig {
    
    

    //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
    
    
        return new OptimisticLockerInterceptor();
    }
}

3. 测试

第一个测试

    @Test
    public void testOptimisticLocker(){
    
    
        // 1. 查询用户信息
        User user = userMapper.selectById(1L);
        // 2. 修改用户信息
        user.setName("ybg");
        user.setEmail("[email protected]");
        // 3. 执行更新操作
        userMapper.updateById(user);
    }

结果:
在这里插入图片描述
在这里插入图片描述

第二个测试

    @Test
    public void testOptimisticLocker2(){
    
    
        // 1. 查询用户信息
        User user = userMapper.selectById(1L);
        // 2. 修改用户信息
        user.setName("ybg");
        user.setEmail("[email protected]");
        // 3. 执行更新操作

        // 1. 查询用户信息
        User user1 = userMapper.selectById(1L);
        // 2. 修改用户信息
        user.setName("dzy");
        user.setEmail("[email protected]");
        // 3. 执行更新操作
        userMapper.updateById(user1);


        userMapper.updateById(user);
    }

结果:
在这里插入图片描述

在这里插入图片描述
注意:version是4是因为我执行了两次,这个第二次的截图!

4、三个查询方法

    // 通过id查询
    @Test
    public void testSelectById(){
    
    
        User user = userMapper.selectById(1L);
        System.out.println(user);
    }

    // 批量查询
    @Test
    public void testSelectByBatchId(){
    
    
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
        users.forEach(System.out::println);
    }

    // 条件查询之一map查询
    @Test
    public void testSelectByMap(){
    
    
        HashMap<String,Object> map = new HashMap<>();
        map.put("name","Ye");
        List<User> users = userMapper.selectByMap(map);

        users.forEach(System.out::println);
    }

最后一个查询的结果:
在这里插入图片描述

5、分页查询

1. 在配置类加入如下代码

    // 分页拦截器
    @Bean
    public  PaginationInterceptor paginationInnerInterceptor() {
    
    
        return new PaginationInterceptor();
    }

2. 测试

    @Test
    public void testPaginationInterceptor(){
    
    
        // 参数一: 当前页
        // 参数二: 页面大小
        Page<User> page = new Page<>(2,2);
        userMapper.selectPage(page,null);
        page.getRecords().forEach(System.out::println);
    }

结果:
在这里插入图片描述

6、三个删除方法

    // 通过id删除
    @Test
    public void testDeleteById(){
    
    
        userMapper.deleteById(1L);
    }

    // 批量删除
    @Test
    public void testDeleteByBatchId(){
    
    
        userMapper.deleteBatchIds(Arrays.asList(1,2,3));
    }

    // 条件删除之一map删除
    @Test
    public void testDeleteByMap(){
    
    
        HashMap<String,Object> map = new HashMap<>();
        map.put("name","Ye");
        userMapper.deleteByMap(map);

    }

最后一个删除的结果:
在这里插入图片描述

7、逻辑删除

1. 在实体类中加入 @TableLogic注解

注意数据库中必须有对应的字段
在这里插入图片描述

    @TableLogic  //逻辑删除
    private Integer deleted;

2. 添加配置

配置文件

### 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

配置类

    // 逻辑删除组件
    @Bean
    public ISqlInjector sqlInjector(){
    
    
        return new LogicSqlInjector();
    }

3. 测试

虽然还是一个的删除方法,但是实际上使用的是逻辑删除

    // 通过id删除
    @Test
    public void testDeleteById(){
    
    
        userMapper.deleteById(1L);
    }

结果:
在这里插入图片描述
在这里插入图片描述
再测试查询

    // 通过id查询
    @Test
    public void testSelectById(){
    
    
        User user = userMapper.selectById(1L);
        System.out.println(user);
    }

结果:
在这里插入图片描述
在这里插入图片描述
逻辑删除后就查询不到了,但是数据库还有这条数据。

猜你喜欢

转载自blog.csdn.net/weixin_43520670/article/details/114042321