执行流程:
(1)Mapper类实现接口BaseMapper<T>
注意:当Mybatis-plus提供的方法不注意让我们去进行查询的时候,我们可以按照以前的mybatis的方式去进行sql语句!
(2)Service接口类继承Iservice<T>
(3)Service实现类继承ServiceImpl<TMapper,T>,实现Service接口。
Mybatis-plus提供的方法:
Mapper层:
Service层:
我们从这些方法里面看到了一个行的类就是Wrapper<T>,以及Page。
Wrapper<T>——条件构造器:
Wrapper<T>也就是我们说的条件构造器。他是一个接口,主要就是用来标识sql语句后面的“where 条件语句”,而他的实现类:
QueryWrapper<T>:
LambdaQueryWrapper<T>:
方法:
常用的方法有这些:
还有其他条件,引用一下别人大佬写好的文章,请看这里:
Page——封装分页查询结果的类:
如果要使用到分页查询的话,那么对应的我们需要进行分页拦截器的注入,因为不同的数据库对应的分页条件是不同的,mysql的分页是limit,而orcale是rownum!
注意:这里的分页拦截器与mvc里面的拦截器是不同的!分页拦截器是针对sql继续拦截纠正,整个更多的先是一个动态代理的过程。而mvc是基于请求来进行拦截的。!
注入分页拦截器:
这里涉及到三个没有见过的类:
MybatisPlusInterceptor——拦截器链,更像是一个集合!主要是记录当前有那些拦截器!
PaginationInnerIntercepctor——分页拦截器!
OptimisticLockerInnerIntercepctor——乐观锁拦截器!{整个后面会给你解释到!}
IPage与Page:
实现方式不同!
page是ipage的实现:我们通俗的去理解就是ipage对page再进行一个封装:
所以我们可以拉出取来数据。
查询sql语句生成原理:
所以我们可以很清晰的知道mybatis-plus是以及定义的类的类名以及属性名来进行sql语句生成的。
那假设类名与表名不符合,或者属性名与字段名不相同的时候就查询不了了。
所以为了解决这样的问题,mybatis-plus提供了注解来解决:
@TableField(Value="字段名")——解决属性名与字段不相同!
Exitst=true/false
(在数据库表字段里面是否存在,就是之后的操作是否需要加入。)
select=true/false
查询的时候是否带上该字段
fill=FieldFill.sql语句类型(公共字段执行):
也就是当mybatis在执行update或者Insert的时候,会自动把数据翻入到对应的属性里面去!
而究竟如何添加咧?通过创建一个实现类,去实现 MetaObjectHandler 接口。
但是!!!如果不是使用mybatis-plus提供的api来执行sql语句的话!是不会加入进去的!
@TableName(Value="字段名")——解决类名与表名不相同!
@TableID(Type=类型)——这个是针对生成数据,也就是添加数据的时候,id自动生成。
重点来了:就是我们可以通过配置文件去定义全局策略