视频链接:https://www.bilibili.com/video/BV12R4y157Be/?spm_id_from=333.337.search-card.all.click&vd_source=9545770e4a2968c05878ffac8589ec6c
视频选集:P1— P28
1.MyBatis-Plus概念
1.1 简介
- MyBatis-Plus是一个MyBatis的增强工是,.在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus提供了通用的mapper和service,可以在不编写任何SQL语句的情况下,快速的实现对单表的CRUD、批量、逻辑删除、分页等操作。
- 本视频从MyBatis-Plus的特性及使用,到MyBatis-Plus所提供的优秀的插件,以及多数据源的配置都有详细的讲解。并对ldea中的快速开发插件MyBatisX也进行了功能的演示。
- 本视频主要以MySQL数据库为案例,使用ldea作为IDE,使用Maven作为构建工具,使用Spring Boot为大家展示MyBatis-Plus的各个功能,所以学习本视频需要有MyBatis和Spring Boot的基础。
1.2 MyBatis-Plus特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作
- 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求
- 支持Lambda形式调用:通过Lambda表达式,方便的编写各类查询条件,无需再担心字段写错。
- 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器 - Sequence),可自由配置,完美解决主键问题
- 支持ActiveRecord模式:支持ActiveRecord 形式调用,实体类只需继承Model类即可进行强大的CRUD操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者Maven插件可快速生成Mapper 、Model 、Service 、Controller层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer等多种数据库
- 内置性能分析插件:可输出SQL语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表delete 、update操作智能分析阻断,也可自定义拦截规则,预防误操作
1.3 MyBatis-Plus支持的数据库以及框架结构
任何能使用MyBatis进行CRUD,并且支持标准SQL的数据库,具体支持情况如下,如果不在下列表查看分页部分教程PR您的支持。
MyBatis-Plus框架结构:
左边:先扫描实体,通过反射抽取,把实体类中的属性抽取出来;再去分析要操作的表,要操作的实体类中的属性,也就是表中的字段是什么;最终再去生成相对于的SQL语句,把语句注入到MyBatis容器中
2.入门案例
2.1 开发环境
2.2 创建测试数据库和表
2.3 创建Spring Boot工程
先检查Maven环境:
创建新的工程:
删除不需要的:
添加依赖:
下载lombok插件:
2.4 配置application.yml
2.5 创建实体类以及lombok的简单使用
创建实体类:
①用注解得到各个方法
②由于上面要写的太多,用一个就可以表达
2.6 创建mapper接口并扫描
在启动类中,在springboot中使用MyBatis时,一定要设置当前mapper接口所在的包以及映射文件所在的包
2.7 测试
创建测试类:
问题:userMapper报错
解决方案:添加注解【将当前mapper接口标识为持久层组件】
其中SQL语句是MyBatis-Plus中编写的
效果展示:
2.8 加入日志
在application.xml中:
将上面代码重新运行:
MyBatis-Plus操作的表以及当前表中的字段,由实体类以及实体类中的属性决定
3.BaseMapper
3.1 接口介绍
3.2 测试BaseMapper的新增功能
展示:
3.3 测试BaseMapper的删除功能
3.3.1 deleteById
通过id删除用户信息
3.3.2 deleteByMap
根据map集合中所设置的条件删除用户信息
3.3.3 deleteBatchIds
3.4 测试BaseMapper的修改功能
修改用户信息
3.5 测试BaseMapper的查询删功能
3.5.1 selectById
3.5.2 selectBatchIds
3.5.3 selectByMap
根据map集合中的条件查询用户信息
3.5.4 selectList
查询所有数据
4.测试自定义功能
在MyBatis-Plus中设置映射文件的路径,需要通过mapper-locations来进行配置,而这个配置有一个默认位置,在类路径下的mapper下面的任意目录下的所有的.xml
如果不配置路径:
定义接口中的方法:
在映射文件中实现:
测试:
结果:
5.通用Service接口
MyBatis-Plus中有一个接口IService和其实现类Servicelmpl,封装了常见的业务层逻辑详情查看源码IService和Servicelmpl
创建接口:
接口实现类:
5.1 查询总记录数
测试类:
结果展示:
5.2 批量添加功能
mapper中只能添加单条数据,不能批量添加,批量添加只能在Service中有【Service其实也是单个,只是循环添加了】
展示:
6.MyBatis-Plus的常用注解
6.1 @TableName
当我们将数据库中表的名字由user改为t_user后,再次运行程序将会出错,解决方案:
还可以设置全局配置:
6.2 @TableId
当表中的主键id被改为uid后,很多代码中的就需要相应的进行修改
解决方法:【此时实体类中定义的变量uid和表中的名字uid是一样的才可行】
@TableId注解查看源代码:
6.2.1 @TableId的value属性
解决方案:
如果只有一个值,可以简略为:
6.2.2 @TableId的type属性
将数据库的表设置为自增:
效果:
6.2.3 通过全局配置配置主键生成策略
6.2.4 雪花算法
-
背景:需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。
数据库的扩展方式主要包括:业务分库、主从复制,数据库分表。 -
数据库分表
将不同业务数据分散存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务,但如果业务继续发展,同一业务的单表数据也会达到单台数据库服务器的处理瓶颈。例如,淘宝的几亿用户数据,如果全部存放在一台数据库服务器的一张表中,肯定是无法满足性能要求的,此时就需要对单表数据进行拆分。 -
单表数据拆分有两种方式:垂直分表和水平分表。
-
垂直分表
垂直分表适合将表中某些不常用且占了大量空间的列拆分出去。
例如,前面示意图中的nickname和description字段,假设我们是一个婚恋网站,用户在筛选其他用户的时候,主要是用age和sex两个字段进行查询,而nickname和description两个字段主要用于展示,一般不会在业务查询中用到。description本身又比较长,因此我们可以将这两个字段独立到另外一张表中,这样在查询 age和sex时,就能带来一定的性能提升。 -
水平分表
水平分表适合表行数特别大的表,有的公司要求单表行数超过5000万就必须进行分表,这个数字可以作为参考,但并不是绝对标准,关键还是要看表的访问性能。对于一些比较复杂的表,可能超过1000万就要分表了;而对于一些简单的表,即使存储数据超过1亿行,也可以不分表。
但不管怎样,当看到表的数据量达到千万级别时,作为架构师就要警觉起来,因为这很可能是架构的性能瓶颈或者隐患。
雪花算法:由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。
6.3 @TableField
当字段名和属性名不一致的时候
6.4 @TableLogic
- 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
- 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为"被删除状态”,之后在数据库中仍旧能看到此条数据记录
- 使用场景:可以进行数据恢复
删除测试:
展现:
再次重新查找数据库: