MyBatis Plus
Mybatis Plus简介
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上"只做增强不做改变",为简化开发、提高效率而生,但是他只适合单表的增删改查,没有多表的任何操作。
那么它是怎么增强的呢?其实就是它已经封==装好了一些crud方法==,我们不需要再写xml了(也就是不需要写xxxMapper的xml文件了),直接调用这些方法就行。
官网:https:
需要引入: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的多表查询(在探花中)
public interface UserInfoMapper extends BaseMapper<UserInfo> {
@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 |
| in | IN 查询 |
| notIn | NOT IN 查询 |
| isNull | NULL 值查询 |
| isNotNull | IS 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.写业务逻辑
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:组件扫描