默认分类 188 0

    MybatisPlus入门

    Mybatis-Plus文档

    常用注解

    • @TableName:用来指定表名
    • @Tableld:用来指定表中的主键字段信息
    • @TableField:用来指定表中的普通字段信息

    IdType(默认雪花算法):

    描述
    AUTO 数据库自增长
    INPUT 通过set方法自行输入
    ASSIGN_ID 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
    ASSIGN_UUID 分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)

    使用@TableField的常见场景:

    • 成员变量名与数据库字段名不一致
    • 成员变量名以is开头且是布尔值
    • 成员变量名与数据库关键字冲突
    • 成员变量不是数据库字段
    @TableName("tb_user")
    public class User {
    	@TableId(value= "id", type= IdType.AUTO )
    	private Long id;
    	@TableField("username")
    	private String name;
    	@TableField("is_married")
    	private Boolean isMarried;
    	@TableField("`order`")
    	private Integer order;
    	@TableField(exist = false)
    	private String address;
    }
    

    使用配置

    mybatis-plus:
    	type-aliases-package:com.itheima.mp.domain.po    #别名扫描包,指定实体类时只需写类名
    	mapper-locations:"classpath*:/mapper/**/*.xml"   #Mapper.xml文件地址,默认值
    	configuration:
    		map-underscore-to-camel-case:true  #是否开启下划线和驼峰的映射
    		cache-enabled:false  #是否开启二级缓存
    	global-config:
    		db-config:
    			id-type:assign_id #id为雪花算法生成
    			update-strategy:not_null  #更新策略:只更新非空字段
    

    核心功能

    BaseMapper

    • public interface UserMapper extends BaseMapper<User> {}

    IService接口

    • 自定义Service接口继承IService接口
      • pubic interface IUserService extends IService<User> {}
    • 自定义Service实现类,实现自定义接口并继承Servicelmpl类
      • public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {}

    IService批量新增

    • MP的批量新增,基于预编译的批处理,在mysql执行时依然是逐条执行,性能没有达到最好
    • 配置jdbc参数,开启rewriteBatchedStatements=true,性能最好,mysql驱动会把一条条的sql重写成一条sql语句

    拓展功能

    代码生成器

    根据数据库表结构生成POMapperService等相关代码

    • 推荐MybatisX(基于图形化界面完成MybatisPlus的代码生成)

    DB静态工具

    有的时候Service之间也会相互调用,为了避免出现循环依赖问题,MybatisPlus提供一个静态工具类:Db,其中的一些静态方法与IService中方法签名基本一致,也可以帮助我们实现CRUD功能

    逻辑删除

    对于一些比较重要的数据,我们往往会采用逻辑删除的方案,即:

    • 在表中添加一个字段标记数据是否被删除
    • 当删除数据时把标记置为true
    • 查询时过滤掉标记为true的数据

    一旦采用了逻辑删除,所有的查询和删除逻辑都要跟着变化,非常麻烦。 为了解决这个问题,MybatisPlus就添加了对逻辑删除的支持。

    注意,只有MybatisPlus生成的SQL语句才支持自动的逻辑删除,自定义SQL需要自己手动处理逻辑删除。

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

    注意: 逻辑删除本身也有自己的问题,比如:

    • 会导致数据库表垃圾数据越来越多,从而影响查询效率
    • SQL中全都需要对逻辑删除字段做判断,影响查询效率

    因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。或者是采用定时任务定期删除

    枚举处理器

    MybatisPlus提供了一个处理枚举的类型转换器,可以帮我们把枚举类型与数据库类型自动转换。 要让MybatisPlus处理枚举与数据库类型自动转换,我们必须告诉MybatisPlus,枚举中的哪个字段的值作为数据库值。 MybatisPlus提供了@EnumValue注解来标记枚举属性 同时要在application.yml中配置全局枚举处理器

    mybatis-plus:
      configuration:
        default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
    

    仅仅这两步会返回的是枚举类型,可以通过@JsonValue注解标记JSON序列化时展示的字段,这样就可以返回我们想要看到的值

    package com.itheima.mp.enums;
    
    import com.baomidou.mybatisplus.annotation.EnumValue;
    import lombok.Getter;
    
    @Getter
    public enum UserStatus {
        NORMAL(1, "正常"),
        FREEZE(2, "冻结")
        ;
    
    	@EnumValue
    	@JsonValue
        private final int value;
        private final String desc;
    
        UserStatus(int value, String desc) {
            this.value = value;
            this.desc = desc;
        }
    }
    

    JSON处理器

    处理JSON可以使用JacksonTypeHandler处理器,方便将一个数据库中为JSON类型字段的数据转换为java中的对象 要改两处地方: 1.将PO中对应的字段改为你要转为的对象类型,并在字段上加@TableField(typeHandler = JacksonTypeHandler.class) 2.在类名上面加@TableName(value = "对应的表名",autoResultMap = true),开启自动结果集映射

    插件功能

    分页插件

    配置分页插件

    @Configuration
    public class MybatisConfig {
    
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            // 初始化核心插件
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            // 添加分页插件
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
            return interceptor;
        }
    }
    
    Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /usr/home/LXX123/domains/www.lxxblog.cfd/public_html/usr/themes/Farallon/comments.php on line 4 Deprecated: stripos(): Passing null to parameter #1 ($haystack) of type string is deprecated in /usr/home/LXX123/domains/www.lxxblog.cfd/public_html/usr/themes/Farallon/comments.php on line 4