liuyulin
发布于 2024-02-02 / 46 阅读
0
0

Mybatis-Plus

Mybatis plus

mybatis-plus配置

  • 导包 导入springboot基本包 mybatis-plus包

  • 最好不要同时导入mybatis包和mybatis-plus包 可能会出现兼容问题

  • 所有sql语句都是动态语句

​
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>
​
  • 配置数据库配置文件

spring.datasource.username=root
spring.datasource.password=admin
#使用mysql8注意设置时区
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimeZone=Asia/Shanghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • 编码实体类

  • 编写Mapper接口,Mapper接口继承BaseMapper<实体类>,加上@Repository声明Mapper是持久层的类并注册

  • 在springboot主启动类中添加@MapperScan()扫描mapper下的所有接口

  • 配置完成,之后就可以开始使用了

mybatis-plus使用

  • 自己编写的Mapper类继承了BaseMapper,所有的方法都来自父类,当然我们也可以编写自己的方法

  • 参数 Wrapper 是一个条件构造器 类似sql要编写的条件

  • 使用Mapper类就能完成一系列CRUD操作

配置日志

  • 使用mybatis-plus之后,所有的sql语句是不可见的,要看到执行了什么sql语句,可以配置日志,在日志中查看

  • 直接使用配置文件配置日志

  • 记得添加log4j的配置文件

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.log4j.Log4jImpl

mybatis-plus主键生成策略

  • 分布式系统唯一id生成算法:uuid、自增id、雪花算法、Redis、zookeeper

  • 可以使用@TableId(type = Idtype.???)注解指定id的设置方式

public enum IdType {
    AUTO(0),//主键自增 使用这种方式 数据库字段一定是自增的 不然报错
    NONE(1),//未设置主键
    INPUT(2),//手动输入 选择手动输入就必须自己写id
    ASSIGN_ID(3),//默认全局唯一id
    ASSIGN_UUID(4);//uuid
}
  • 雪花算法

    • 分布式id生成算法,结果为一个long型的id,其中41bit作为毫秒数,10bit作为机器id(5bit是数据中心,5bit是机器id),12bit作为毫秒内流水号,每秒可以生成4096个id,最后还有一个符号位,永远为0

自动填充

创建时间,修改时间等操作一般都是自动化完成的,不要手动更新

  • 不可以直接修改数据库

  • 要使用代码的方式修改数据

  • 使用@TableField(fill = FieldFill.???)注解进行设置

public enum FieldFill {
    DEFAULT,
    INSERT,//自动插入
    UPDATE,//自动更新
    INSERT_UPDATE;//创建时插入 更新时更新
​
    private FieldFill() {
    }
}
  • 编写一个处理器处理注解内容 实现插入时的填充策略与更新时的填充策略

/**
 * 实现自动填充注解的方法
 * @author liuyulin10
 */

@Slf4j//日志注解
@Component//一定要记得吧处理器加入到IOC中
public class MyMetaObjectHandler implements MetaObjectHandler {

    //实现insert的操作
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert file.....");
        //设置字段的值
        //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
        this.setFieldValByName("gmtCreate", new Date(), metaObject);
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }

    //实现update的操作
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update file.....");
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }
}
  • 一定要记得给处理器加入到IOC容器中

  • 实体类中的时间使用Java.util.Data的时间,使用sql包下的时间会报错

  • 在配置文件中使用时间Asia/Shanghai保证时间的正确

乐观锁 与 悲观锁

面试中常被问道的

  • 乐观锁总是认为不会出现问题,无论干什么都不会去上锁,如果出现了问题就再次更新测试

  • 悲观锁十分悲观,认为总是会出现问题,无论干什么都会上锁,再去操作

  • 主要讲解乐观锁

    • 乐观锁实现方式:取出记录时,获取当前 version; 更新时,带上这个 version; 执行更新时, set version = newVersion where version = oldVersion ;如果 version 不对,就更新失败

    • 在实体类中添加version字段并加上@Version注解表明该字段是一个乐观锁

    • 实现乐观锁需要注册组件 在配置类中注册乐观锁插件

/**
 * mybatis-plus配置类
 * @author liuyulin10
 */

@EnableTransactionManagement//自动管理事务
@MapperScan("com.liuyulin10.mybatisplus.mapper")//让配置类来扫描包
@Configuration
public class MyBatisPlusConfig {
    //注册乐观锁插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}
  • 多线程下一定要记得加锁

查询操作

  • 用一个List批量查询

List<T> selectBatchIds(@Param("coll") Collection<?extends Serializable> idList);
  • 用map实现条件查询

List<Map<String, Object>>selectMaps(@Param("ew") Wrapper<T> queryWrapper);

分页查询

  • mybatis-plus内置了分页插件

  • 首先配置分页插件

@Bean
public MybatisPlusInterceptor paginationInnerInterceptor(){
        MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
        }
  • 配置好之后直接使用Page对象

//测试分页操作
@Test
public void testPage(){
        //参数一:当前页
        //参数二:页面大小
        Page<User> page=new Page<>(1,5);
        Page<User> userPage=userMapper.selectPage(page,null);
        page.getRecords().forEach(System.out::println);
        }

删除操作

  • 有delete()、deleteById()、deleteBatchIds()、deleteByMap方法

逻辑删除

  • 在数据库中没有被移除,而是通过一个变量让它失效,管理员可以查看被删除的记录,防止数据丢失,类似于回收站

  • 在数据库中需要有deleted字段

  • 在实体类中添加@TableLogic注解

@TableLogic
private Integer deleted;
  • 注册逻辑删除组件

    • 高版本已经不需要注册Bean了,添加了注解就可以了

  • 配置逻辑删除的配置

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

性能分析插件

  • 新版本推荐使用p6spy

条件构造器 Wrapper

  • new一个wrapper,然后给wrapper添加各种条件,然后传入wrapper执行各种操作

  • Warpper文档


评论