Mybatis入门
一、Mybatis VS JPA
二、Mybatis-Plus介绍
三、MP基本使用
1.通用Mapper
2.常用注解
@TableName("表名"),当不符合自动映射规则,用在实体类上,手动指定对应的数据库表名
@TableId,当主键不叫id时,用在实体类主键属性上,手动指定主键
@TableField("列名"),当不符合自动映射规则,用在实体类普通属性上,手动指定在表中对应的列
3.排除非表字段的三种方式(minos项目有使用场景)
(1)属性前用transient修饰,不参序列化
(2)属性前用static修饰,转成静态变量,整个类只有唯一一份数据
(3)属性上用@TableFiled(exist=false)注解修饰,告诉MP该属性不是表中的字段
四、Mabatis-Plus查询方法
1.基本查询
2.条件构造器查询
(1)全模糊查询,小于
(2)between,非空
(3)右模糊查询,or查询,排序
(4)函数(两个参数,可以防止sql注入),子查询
(5)and,or嵌套查询(使用lamda表达式)
(6)or,and嵌套查询
(7) 嵌套语句在前面,nested()
(8)in查询
(9)limit查询,无视优化规则,直接拼接到最后,有sql注入风险,慎用
(10)select不列出全部字段 .select()
1)直接列出要查询的字段
2)排除个别字段
(11)condition函数的作用,避免在代码中写if判断
(12) 实体作为条件构造器构造方法的参数,多用于等值查询
(13)AllEq用法,作用类似于12,比12更灵活
(14)其他用法
selectMaps(),返回值是一个Map,不再是一个实体,用于只返回少数字段的场景,也用于返回实体类无法表示的统计结果
selectCount(),查询记录数
3.lamda条件构造器查询,实现防误写功能
MP3.7新增用法,把最后的查询语句也加入到链式编程中,直接一条语句搞定!
五、自定义sql以及分页查询
1.自定义sql
基于注解
基于xml文件
2.Mybatis-Plus分页插件实现物理分页
(1)引入插件,paginationInterceptor
(2)创建page对象,指定page和pageSize,调用API进行查询
返回对象
返回map
只返回当前页记录,不查询总条数
基于自定义sql实现分页
六、Mybatis-Plus更新及删除
1.更新
(1)根据id更新
(2)根据条件构造器更新,传入wrapper对象
(3)wrapper构造函数中传入实体,实体中非null字段会出现在where条件中
(4)链式编程,.set()方法
(5)lambda形式
(6)终极链式lambda,一条语句搞定
2.删除
(1)根据id删除
(2)其他普通删除
1)deleteByMap,出现在where条件中
2)deleteBatchIds,根据id批量删除
(3)根据条件构造器删除
七、AR模式,主键策略和基本配置
1.AR模式(ActiveRecord模式)
(1)实体类继承Model对象
(2)实体类必须有对应的Mapper接口,并继承BaseMapper(UserMapper)
(3)直接操作实体类进行增删改查
(4)一个特殊方法,insertOrUpdate,根据id判断,没有就新增,有就先根据id查询,查到记录就更新,查不到就新增
2.主键策略
全局策略,默认long类型雪花算法
局部策略,优先级高于全局策略
策略包括:数据库自增id,雪花算法(Long),雪花算法(String),UUID
3.MP配置
基本配置
进阶配置
DB策略配置
八、通用service,在通用mapper的基础上,进一步封装了一些方法
(1)创建接口的时候,继承IService
(2)创建实现类的时候,继承ServiceImpl
(3)这样在写service逻辑的时候,就不再需要调用mapper层,直接在service中使用MP封装好的方法,可以使用的API:
(4)批量操作举例
(5)链式调用举例,比mapper操作语句更加简洁!
查询
更新
删除
MP知识点扩展:
1.mp的saveBatch方法,底层是一条一条的新增,并没有实现真正的批量,需要自己扩展
扩展MP实现真正的批量新增 https://www.jianshu.com/p/df14fa887b85
官方文档 https://mybatis.plus/guide/crud-interface.html#select
2.mp执行count(*)操作,有可能返回值为null,需要进行转换,如果为null就转换成0,防止空指针异常
3.MP插入后返回主键:
在调用insert()方法后,入参entity对象的id已经被填充,直接entity.getXXX()即可
4.mp打印sql日志:
logging.level.包路径=debug
或者
mybatis-plus:
mapper-locations: classpath:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl