- 1. Mybatis_plus复习
- 1.1 简易使用***
- 1.2 mybatis_plus日志
- 1.3 mybatis_plus主键策略
- 1.4 分页查询
- 1.5 逻辑删除
- 1.6 条件构造器
- 1.7 Mp封装Server层***
- 总结
mybatis_plus是好久之前学习的,现在已经有点遗忘了,还好老师讲了一些知识点。
1.1 简易使用***(1)导入mybatis_plus的依赖。
springboot对应的mybatis_plus依赖,一定要选带starter启动器的。
com.baomidou mybatis-plus-boot-starter 最新版本 mysql mysql-connector-java
个人遇到的错误:
打开mybatis_plus首页发现最新版本,直接复制粘贴,后来一直报错,最后才发现引入的时spring对应的mybatis_plus依赖,不是springboot的。说多了都是泪呀
(2)配置文件配置数据库连接
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
username: root
password: 747699
上面在引入mysql依赖的时候没有表明是mysql5还是mysql8,所以会使用自己电脑的版本。
com.mysql.cj.jdbc.Driver 这里的cj表示默认使用mysql8的驱动。
(3)创建实体类User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
(4)创建mapper接口类(核心)
@Mapper public interface UserMapper extends BaseMapper{ }
@Mapper注解表示将我们的mapper注入到容器中。
每个自定义的mapper接口都要继承BaseMapper,< User >表示mapper接口操作的表,也可以理解为实体类。 BaseMapper是mybatis_plus为我们封装好了许多常用数据库操作函数。
(5)测试
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
UserMapper userMapper;
@Test
void contextLoads() {
List users = userMapper.selectList(null);
}
}
其它相关操作mybatis_plus官方文档有相应介绍。
1.2 mybatis_plus日志日志是方便我们在程序出现错误时,及时发现错误的原因。
在配置文件中设置开启
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
执行mybatis_plus插入操作时,控制台日志输出
1.3 mybatis_plus主键策略通过@TableId注解实现,为什么说这是mybatis_plus主键策略呢,因为该注解的来源如下:
import com.baomidou.mybatisplus.annotation.TableId;
使用主键策略前提时,在数据库表中,将主键设置为自增。
主键策略如下所示:
NONE:该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)即默认策略。
AUTO:数据库ID自增。增加幅度为1。较为常用
INPUT:用户输入ID,该类型可以通过自己注册自动填充插件进行填充。
ASSIGN_ID:分配ID (主键类型为number或string),number类型较为常用,会默认为我们分配ID,也遵循自动增长原则,但是增长的幅度不确定。
ASSIGN_UUID:分配UUID (主键类型为 string) ,主键中一定包含字符,对于需要主键排序的情况不适用,所以不如ASSIGN_ID常用。
总结
一般在插入数据时,我们是不会设置主键值,所以此时主键策略起到了很大作用。一帮使用ASSIGN_ID或AUTO策略。
例如:在user类的主键加入逐渐策略
@TableId(type = IdType.ASSIGN_ID) private Long id;
执行插入时,就可以不用设置主键值,系统会通过策略自动生成主键id。下面是一条插入示例
void insert(){
User user = new User();
user.setAge(23);
user.setEmail("mengfanxiaonb@gmail.com");
user.setName("mfx");
int insert = userMapper.insert(user);
System.out.println(insert);
}
执行两次插入操作:
可以发现两次的id都是随机的,但是有一个特点都是自增,但是增加的幅度不同。
(1)配置分页插件配置文件,创建MpConfig配置类,Mp=Mybatis_plus。
@Configuration
public class MpConfig {
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
(2)分页查询
selectPage函数执行分页查询操作,两个参数:
Page:使用Page类设置起始页和每页数据条数,(1,3)表示第一页,每页包含三条数据。
QueryWrapper:查询条件,具体见官方文档。
PageuserPage = userMapper.selectPage(new Page<>(1,3), null); // 根据page查询到的数据 System.out.println(userPage.getRecords()); // 表中数据总条数 System.out.println(userPage.getTotal()); // 总页数 System.out.println(userPage.getPages()); // 每页大小 System.out.println(userPage.getSize()); // 是否有下一页 System.out.println(userPage.hasNext()); // 是否由前置页 System.out.println(userPage.hasPrevious());
结果如下
注意:如果不实现分页插件配置类,也可以查询,只是每次查询得到的结果都是所有数据。即能查询,不能分页查询。
最初接触的删除操作是直接将数据库中数据删除,也可以成为物理删除。但是实际中使用的时逻辑删除,原理为修改操作。
逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。
使用方法
(1)配置文件设置逻辑删除规则
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)
(2)实体类添加逻辑删除字段,并添加逻辑删除注解
@TableLogic private Integer deleted;
(3)数据库表中添加字段deleted
(4)测试
先插入数据
删除最后一条数据
逻辑删除成功,将最后一条数据的deleted字段设置为1.
再次执行查询所有数据操作
总结:逻辑删除并不会删除该条数据,只是在查询时无法查询而已,方便我们后续的数据恢复。
主要使用的有个类:QueryWrapper,LambdaQueryWrapper。
QueryWrapper较为简单,直接参考官方文档:QueryWrapper
LambdaQueryWrapper和QueryWrapper类似,但是支持Lambda表达式,较为新颖。
示例:
查询用户名为mfx的数据
QueryWrapper写法
void query(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("name","mfx");
List users = userMapper.selectList(wrapper);
System.out.println(users);
}
LambdaQueryWrapper`写法
void lambdaQuery(){
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName,"mfx");
List users = userMapper.selectList(wrapper);
System.out.println(users);
}
而这唯一的区别就是在条件查询函数中第一个参数的书写形式不同。个人觉得LambdaQueryWrapper好用一些,不易出错。
注意:Mp提供的这些函数只适用于单表操作,当涉及到多表的复杂业务时需要xml文件mybatis实现。
1.7 Mp封装Server层***Mp不仅对mapper实现了封装,也对server层进行了封装。
正常后端代码的步骤是:controller 层调用server层,server层调用mapper层。但是如果只是简单的单表增删改查,可以只是用server层实现,因为Mp对server层进行了封装。
(1)创建server接口,要继承IService,原理和mapper继承baseMapper相同
public interface UserServer extends IService{ }
(2)创建serverImp,@Service注入容器,要继承 ServiceImpl
@Service public class UserServerImp extends ServiceImplimplements UserServer { }
ServiceImpl继承了BaseMapper,并且实现了IService,所以本质上还是mapper对表的操作,只是Mp对server层的封装。我们可以直接使用server代替之前mapper对表的操作。
测试:
@Autowired
UserServer userServer;
@Test
void userServers(){
List list = userServer.list();
System.out.println(list);
}
上面list是Mp为我们封装好的查询所有数据的方法,相当于mapper的selectList方法。
总结:
对于接口的实现,有两种方法。
(1)只是简单单表操作:在controller注入server,直接执行对数据库的操作。
(2)涉及到复杂操作,mybatis通过xml实现对表的操作,在server中注入mapper,在contorller中注入server,最后对数据库进行操作。
(3)Mp的意义就是要简化我们的操作和代码书写,但是只针对于简单的单表操作,正常开发中还是需要(2)中的步骤来实现一个接口。
Mp特性:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 支持关键词自动转义:支持数据库关键词(order、key…)自动转义,还可自定义关键词
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
- 内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击



