MyBatis Plus 笔记

543 阅读6分钟

MyBatis Plus

Mybatis Plus简介

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上"只做增强不做改变",为简化开发、提高效率而生,但是他只适合单表的增删改查,没有多表的任何操作。
那么它是怎么增强的呢?其实就是它已经封==装好了一些crud方法==,我们不需要再写xml了(也就是不需要写xxxMapper的xml文件了),直接调用这些方法就行。
官网:https://mp.baomidou.com/
需要引入:mybatis-plus-boot-starter

Mybatis Plus的ORM映射

@TableName("数据库的数据表名"):标注在实体类上,表示实体类和数据库的数据表进行映射关系。如果实体类和数据表名一样可以不写这个注解。
@TableId(type = IdType.AUTO):标注在成员变量上,指定数据表的id和主键生成的方式。
@TableField("数据表的字段名"):表示在成员变量上,如果成员变量名和数据库的字段名不一样时,需要使用此注解,括号中写数据表的字段名,用来和实体类的成员变量进行绑定。
如果字段名和成员变量名一样或者符合驼峰命名规则可以省略,驼峰命名规则:字段名:xxx_xxx成员变量名:xxxYyy可以不用进行绑定,默认有一个@TableField注解

@TableName("表名")

当表名与实体类名不一致时,可以在实体类上加入@TableName()声明

@TableId声明属性为表中的主键(若属性名称不为默认id)

@TableFieId("字段") 当实体类属性与表字段不一致时,可以用来声明

使用Mybatis Plus的话,每层的改变

持久层(Mapper):mapper接口要继承BaseMapper<实体类的类型>,BaseMapper封装了通用的crud的方法,所以逆向工程就不用写了,如果封装的方法满足不了需求时,需要自定义方法,以满足需求。
业务层(Service):
	1.service接口要继承IService<实体类的类型>,他封装了service需要的基础的crud的方法。
	2.serviceimpl要实现service接口 + 继承ServiceImpl<xxxMapper,实体类的类型>,
	ServiceImpl封装了通用的crud,还包括了注入UserMapper,所以我们不用写mapper接口作为此实现类的成员变量,也就不用使用@AutoWrite进行注入了。
	持久层继承1个、service接口继承一个、service实现类继承一个,实现一个
控制层(controller):依旧需要注入service接口。

如果CURD需要添加条件,可以使用条件构造器

UpdateWrapper:封装修改条件
QueryWrapper:封装查询、删除条件
LambdaQueryWrapper:用法基本和 QueryWrapper 一致,区别在于获取 column 的方式不一样,QueryWrapper,但是LambdaQueryWrapper不会把变量名写死,LambdaQueryWrapper使用的是类名::get方法,只不过是把get去掉了,只剩下了成员变量名
LambdaUpdaeWrapper:用法基本和 UpdateWrapper 一致,区别在于获取 column 的方式不一样,UpdateWrapper把成员变量名写死了,但是LambdaUpdaeWrapper不会吧成员变量名写死,LambdaUpdaeWrapper使用的是类名::get方法,
只不过是把get去掉了,只剩下了成员变量名。

lambdaQueryWrapper

可以用 `lambdaQueryWrapper` 灵活的从实体类的 `@TableField` 上统一获取列名称,即使发生改变,也只需要修改实体类中@TableField"数据表的字段名")数据表字段名即可。
"实体类的类名::getAge"先获取方法名,然后他去掉get获取属性名,再获取属性名上的@TableField注解所对应的数据表的字段名
只要开启了驼峰命名关系映射:此时数据表的字段名一般是xxx_xxx,实体类中成员变量名是xxxXxx他们之间可以相互映射。
可以使用链式调用,简化代码书写,如:lambdaQueryWrapper.gt().方法名().方法名()

MyBatis-plus的多表查询(在探花中)

//BaseMapper:提供了单表的crud 和  条查询
public interface UserInfoMapper extends BaseMapper<UserInfo> {
    //多表查询:
            //1 自己定义  自己实现  自己调用
            //2 返回的数据是谁的数据,就在谁的mapper中定义
    @Select(value = "select info.* from tb_black_list black inner join tb_user_info info\n" +
            "on black.black_user_id=info.id where black.user_id=#{uid}")
    IPage<UserInfo> findBlackwithUserInfo(Page<UserInfo> pg, @Param("uid") Long uid);

}

查询条件

greater:大的、巨大的		个瑞的
greater than:大于
查询方法说明
eq等于=
ne不等于<>
gt大于>
ge大于等于>=
lt小于<
le小于等于<=
like模糊查询 LIKE
notLike模糊查询 NOT LIKE
inIN 查询
notInNOT IN 查询
isNullNULL 值查询
isNotNullIS NOT NULL

分页查询

之前用pageHelp进行分页,现在使用Page<实体类类型>进行分页
我们写的配置类要放在config包中,配置类标注@Configuration表示这是一个配置类
getRecords()档案:表示查询出来的所有数据
1.需要配置分页查询的插件,可以写在配置类中:
	@Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
2.在service实现类中开启分页,和之前的PageHelp不一样了:
	使用:Page<User> page = new Page<>(page, pagesize),"这个page是mubatisPlus包中的",一定要注意,xxxMapper.selectByPage(page,null);
3.写业务逻辑
//方式2
        PageHelper.startPage(pageNum, pageSize);
        advertisingMapper.selectList(new QueryWrapper<>());

整合Redis

用户发送请求,如果缓存中有用户请求的数据,则会去redis中去找,如果缓存中没有请求的数据,则去数据库查询,并且service会把查询出来的数据复制给redis一份,方便以后的查询,降低数据库的访问压力
导入依赖:spring-boot-starter-data-redis
在配置文件中datasource和redis都在spring下
只要涉及到数据的网络传输的,实体类就必须实现Serialilzeble(序列化接口)
配置文件中进行配置redis:
spring:
  redis:
    port: 6379
    host: 127.0.0.1
springboot提供了StringRedisTemplate模板、JDK提供了RedisTemplate模板
两个模板的区别:
	1.StringRedisTemplate模板获取的是一个json字符串
	2.RedisTemplate模板获取的是一个Object对象,需要进行强制转换
存储内容:模板对象名点opsForValue().set(键,值)
获取内容:模板对象名点opsForValue().get(键)
操作string类型:redisTemplate.opsForValue();
操作hash类型:redisTemplate.opsForHash();
操作list类型:redisTemplate.opsForList();
操作set类型:redisTemplate.opsForSet();
操作有序set类型:redisTemplate.opsForZSet();

如果想使用log.info进行打印,怎么办

酸辣粉4斤    
打印日志:需要在类上标注@Slf4j注解
类中写log.info("xxx{},xxx{}",s1,s2)
有几个花括号就有几个值,{}表示占位符,前面的字符串会原样打印出来,s1和s2会填充到{}中。

MyBatisPlus的主键返回策略

	MybatisPlus的主键返回策略是自动返回的。
	在MybatisPlus中只要是添加操作的话,可以在添加方法后,只是使用要添加实体类的对象进行.getId()来获取主键。

SpringBoot的自动配置原理

项目启动的入口启动类--》加载每个jar包下的META-INF/spring.factories文件,保存到map中,包含了所有的自动装配类。---->获取候选配置类,并不是所有的候选类都进行自动配置,只有项目中导入了候选类上@ConditionalOnClass({xxx.class})相关jar包(注解中的类)才会进行自动配置。
自动配置不是默认开启的需要添加@EnableAutoConfiguration注解,
@SpringBootApplication是下面三个注解的合体:他有三个注解:
	1.@SpringBootConfiguration:表示当前类是一个SpringBoot的配置类
	2.@EnableAutoConfigration:开启自动配置,
	3.@CompontScan:组件扫描