概述
内容来自大神文章,这里只是做个记录,在此,谢谢大神无私的分享
MyBatis-plus 从入门到入土快速入门x0a核心功能x0a注解x0aCRUD接口x0a条件构造器x0a更新操作x0a删除操作x0a自定义SQLx0a分页查询x0aAR模式x0a主键策略x0a配置x0a代码生成器x0a高级功能x0a逻辑删除x0a自动填充x0a乐观锁插件x0a性能分析插件x0a多租户SQL解析器x0a动态表名SQL解析器https://mp.weixin.qq.com/s/SBkYZrBbGEgBe09erNr7tg
快速入门
-创建一个SpringBoot项目
-导入依赖
-配置数据库
-创建一个实体类
-创建一个mapper接口
-在SpringBoot启动类上配置mapper接口的扫描路径
-在数据库中创建表
-编写一个SpringBoot测试类
-运行测试类
核心功能
-注解
--@TableName
注解在类上,指定类和数据库表的映射关系。实体类的类名(转成小写后)和数据库表名相同时 ,可以不指定该注解。
--@TableId
注解在实体类的某一字段上,表示这个字段对应数据库表的主键 。当主键名为id时(表中列名为id,实体类中字段名为id),无需使用该注解显式指定主键,mp会自动关联。若类的字段名和表的列名不一致,可用value属性指定表的列名。另,这个注解有个重要的属性type,用于指定主键策略,参见主键策略小节
--@TableField
注解在某一字段上,指定Java实体类的字段和数据库表的列的映射关系。这个注解有如下几个应用场景
---排除非表字段
若Java实体类中某个字段,不对应表中的任何列,它只是用于保存一些额外的,或组装后的数据,则可以设置exist属性为false,这样在对实体对象进行插入时,会忽略这个字段。排除非表字段也可以通过其他方式完成,如使用static或transient关键字,但个人觉得不是很合理,不做赘述
---字段验证策略
通过insertStrategy,updateStrategy,whereStrategy属性进行配置,可以控制在实体对象进行插入,更新,或作为WHERE条件时,对象中的字段要如何组装到SQL语句中。参见配置小节
---字段填充策略
通过fill属性指定,字段为空时会进行自动填充
--@Version
乐观锁注解
--@EnumValue
注解在枚举字段上
--@TableLogic
逻辑删除
--KeySequence
序列主键策略(oracle)
--InterceptorIgnore
插件过滤规则
-CRUD接口
--Mapper CRUD接口
---selectMaps
----只查部分列
当某个表的列特别多,而SELECT的时候只需要选取个别列,查询出的结果也没必要封装成Java实体类对象时(只查部分列时,封装成实体后,实体对象中的很多属性会是null),则可以用selectMaps,获取到指定的列后,再自行进行处理即可
----进行数据统计
---selectObjs
只会返回第一个字段(第一列)的值,其他字段会被舍弃
---selectCount
查询满足条件的总数,注意,使用这个方法,不能调用QueryWrapper的select方法设置要查询的列了。这个方法会自动添加select count(1)
--Service CRUD 接口
这个接口提供的CRUD方法,和Mapper接口提供的功能大同小异,比较明显的区别在于IService支持了更多的批量化操作 ,如saveBatch,saveOrUpdateBatch等方法
-条件构造器
提供了强大的条件构造器Wrapper,可以非常方便的构造WHERE条件。条件构造器主要涉及到3个类,AbstractWrapper。QueryWrapper,UpdateWrapper。在AbstractWrapper中提供了非常多的方法用于构建WHERE条件,而QueryWrapper针对SELECT语句,提供了select()方法,可自定义需要查询的列,而UpdateWrapper针对UPDATE语句,提供了set()方法,用于构造set语句。条件构造器也支持lambda表达式。
--AbstractWrapper中用于构建SQL语句中的WHERE条件的方法进行部分列举
---eq:equals,等于
---allEq:all equals,全等于
---ne:not equals,不等于
---gt:greater than ,大于 >
---ge:greater than or equals,大于等于≥
---lt:less than,小于<
---le:less than or equals,小于等于≤
---between:相当于SQL中的BETWEEN
---notBetween
---like:模糊匹配。like("name","黄"),相当于SQL的name like '%黄%'
---likeRight:模糊匹配右半边。likeRight("name","黄"),相当于SQL的name like '黄%'
---likeLeft:模糊匹配左半边。likeLeft("name","黄"),相当于SQL的name like '%黄'
---notLike:notLike("name","黄"),相当于SQL的name not like '%黄%'
---isNull
---isNotNull
---in
---and:SQL连接符AND
---or:SQL连接符OR
---apply:用于拼接SQL,该方法可用于数据库函数,并可以动态传参
--Condition
条件构造器的诸多方法中,均可以指定一个boolean类型的参数condition,用来决定该条件是否加入最后生成的WHERE语句中
--实体对象作为条件
调用构造函数创建一个Wrapper对象时,可以传入一个实体对象。后续使用这个Wrapper时,会以实体对象中的非空属性,构建WHERE条件(默认构建等值匹配 的WHERE条件,这个行为可以通过实体类里各个字段上的@TableField注解中的condition属性进行改变)
--allEq方法
--lambda条件构造器
-更新操作
-删除操作
-自定义SQL
-分页查询
BaseMapper中提供了2个方法进行分页查询,分别是selectPage和selectMapsPage,前者会将查询的结果封装成Java实体对象,后者会封装成Map<String,Object>
-AR模式
ActiveRecord模式,通过操作实体对象,直接操作数据库表。与ORM有点类似。
-主键策略
在定义实体类时,用@TableId指定主键,而其type属性,可以指定主键策略。
--AUTO
数据库ID自增,依赖于数据库 。在插入操作生成SQL语句时,不会插入主键这一列
--NONE
未设置主键类型。若在代码中没有手动设置主键,则会根据主键的全局策略 自动生成(默认的主键全局策略是基于雪花算法的自增ID)
--INPUT
需要手动设置主键,若不设置。插入操作生成SQL语句时,主键这一列的值会是null。oracle的序列主键需要使用这种方式
--ASSIGN_ID
当没有手动设置主键,即实体类中的主键属性为空时,才会自动填充,使用雪花算法
--ASSIGN_UUID
当实体类的主键属性为空时,才会自动填充,使用UUID
-配置 mybatis plus有许多可配置项,可在application.yml中进行配置,如上面的全局主键策略。下面列举部分配置项
--基本配置
---configLocation:
若有单独的mybatis配置,用这个注解指定mybatis的配置文件(mybatis的全局配置文件)
---mapperLocations
mybatis mapper所对应的xml文件的位置
---typeAliasesPackage
mybatis的别名包扫描路径
-代码生成器
提供一个生成器,可快速生成Entity实体类,Mapper接口,Service,Controller等全套代码
高级功能
-逻辑删除 逻辑删除是为了方便数据恢复,和保护数据本身价值的一种方案
开启mp的逻辑删除后,会对SQL产生如下的影响
INSERT语句:没有影响
SELECT语句:追加WHERE条件,过滤掉已删除的数据
UPDATE语句:追加WHERE条件,防止更新到已删除的数据
DELETE语句:转变为UPDATE语句
-自动填充
表中常常会有“新增时间”,“修改时间”,“操作人” 等字段。比较原始的方式,是每次插入或更新时,手动进行设置。mybatis-plus可以通过配置,对某些字段进行自动填充
-乐观锁插件
当出现并发操作时,需要确保各个用户对数据的操作不产生冲突,此时需要一种并发控制手段。悲观锁的方法是,在对数据库的一条记录进行修改时,先直接加锁(数据库的锁机制),锁定这条数据,然后再进行操作;而乐观锁,正如其名,它先假设不存在冲突情况,而在实际进行数据操作时,再检查是否冲突。乐观锁的一种通常实现是版本号 ,在MySQL中也有名为MVCC的基于版本号的并发事务控制。
在读多写少的场景下,乐观锁比较适用,能够减少加锁操作导致的性能开销,提高系统吞吐量。
在写多读少的场景下,悲观锁比较使用,否则会因为乐观锁不断失败重试,反而导致性能下降。
乐观锁的实现如下:
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果oldVersion与数据库中的version不一致,就更新失败
-性能分析插件spy
-多租户SQL解析器
-动态表名SQL解析器
总结
-条件构造器AbstractWrapper中提供了多个方法用于构造SQL语句中的WHERE条件,而其子类QueryWrapper额外提供了select方法,可以只选取特定的列,子类UpdateWrapper额外提供了set方法,用于设置SQL中的SET语句。除了普通的Wrapper,还有基于lambda表达式的Wrapper,如LambdaQueryWrapper,LambdaUpdateWrapper,它们在构造WHERE条件时,直接以方法引用 来指定WHERE条件中的列,比普通Wrapper通过字符串来指定要更加优雅。另,还有链式Wrapper ,如LambdaQueryChainWrapper,它封装了BaseMapper,可以更方便地获取结果。
-条件构造器采用链式调用 来拼接多个条件,条件之间默认以AND连接
-当AND或OR后面的条件需要被括号包裹时,将括号中的条件以lambda表达式形式,作为参数传入and()或or()
特别的,当()需要放在WHERE语句的最开头时,可以使用nested()方法
-条件表达式时当需要传入自定义的SQL语句,或者需要调用数据库函数时,可用apply()方法进行SQL拼接
-条件构造器中的各个方法可以通过一个boolean类型的变量condition,来根据需要灵活拼接WHERE条件(仅当condition为true时会拼接SQL语句)
-使用lambda条件构造器,可以通过lambda表达式,直接使用实体类中的属性进行条件构造,比普通的条件构造器更加优雅
-若mp提供的方法不够用,可以通过自定义SQL (原生mybatis)的形式进行扩展开发
-使用mybatis-plus进行分页查询时,需要创建一个分页拦截器(Interceptor),注册到Spring容器中,随后查询时,通过传入一个分页对象(Page对象)进行查询即可。单表查询时,可以使用BaseMapper提供的selectPage或selectMapsPage方法。复杂场景下(如多表联查),使用自定义SQL。
-AR模式可以直接通过操作实体类来操作数据库。让实体类继承自Model即可
最后
以上就是现代香菇为你收集整理的MyBatis-plus入门精解(与SpringBoot集成)的全部内容,希望文章能够帮你解决MyBatis-plus入门精解(与SpringBoot集成)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复