MyBatis-Plus基础知识点及用法
MyBatis-Plus入门
1、简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。代码生成、分页、性能分析等功能一应俱全。
2、插入操作
//添加 |
注意:数据库插入id值默认为:全局唯一id
2、MP的主键策略
2.1 ASSIGN_ID
MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)
@TableId(type = IdType.ASSIGN_ID) private String id; |
雪花算法:分布式ID生成器,雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。长度共64bit(一个long型)。首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。41bit时间截(毫秒级),存储的时间截的差值(当前时间截 – 开始时间截),结果约等于69.73年。10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。
2.2 AUTO 自增策略
需要在创建数据表的时候设置主键自增,实体字段中配置 @TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO) private Long id; |
要想影响所有实体的配置,可以设置全局主键配置
#全局设置主键生成策略 mybatis-plus.global-config.db-config.id-type=auto |
2、更新操作
注意:update时生成的sql自动是动态sql:UPDATE user SET age=? WHERE id=?
//修改 |
3、查询
3.1通过多个id批量查询
完成了动态sql的foreach的功能
//多个id批量查询 |
3.2简单的条件查询
通过map封装查询条件
注意:map中的key对应数据库中的列名。如:数据库user_id,实体类是userId,这时map的key需要填写user_id
//简单条件查询 |
3.3分页插件
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能
3.3.1添加分页插件
配置类中添加@Bean配置
/** |
3.3.2测试selectPage分页
测试:最终通过page对象获取相关数据
//分页查询 System.out.println(pages); |
3.3.3.测试selectMapsPage分页
当指定了特定的查询列时,希望分页结果列表只返回被查询的列,而不是很多null值
测试selectMapsPage分页:结果集是Map
@Test public void testSelectMapsPage() { //Page不需要泛型 Page<Map<String, Object>> page = newPage<>(1, 5); Page<Map<String, Object>> pageParam = userMapper.selectMapsPage(page, null); List<Map<String, Object>> records = pageParam.getRecords(); records.forEach(System.out::println); System.out.println(pageParam.getCurrent()); System.out.println(pageParam.getPages()); System.out.println(pageParam.getSize()); System.out.println(pageParam.getTotal()); System.out.println(pageParam.hasNext()); System.out.println(pageParam.hasPrevious()); } |
4、删除
4.1根据id删除记录
@Test public void testDeleteById(){ int result = userMapper.deleteById(5L); system.out.println(result); } |
4.2批量删除
@Test public void testDeleteBatchIds() { int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10)); system.out.println(result); } |
4.3简单条件删除
@Test public void testDeleteByMap() { HashMap<String, Object> map = new HashMap<>(); map.put("name", "Helen"); map.put("age", 18); int result = userMapper.deleteByMap(map); system.out.println(result); } |
5、逻辑删除
5.1物理删除和逻辑删除
物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
逻辑删除的使用场景:
可以进行数据恢复,有关联数据,不便删除
5.2 逻辑删除实现流程
5.2.1数据库修改
添加 deleted字段
ALTERTABLE `user` ADD COLUMN `deleted` boolean DEFAULT false |
5.2.2实体类修改
添加deleted 字段,并加上 @TableLogic 注解
@TableLogic private Integer deleted; |
5.2.3配置(可选)
application.properties 加入以下配置,此为默认值,如果你的默认值和mp默认的一样,该配置可无
mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 |
5.2.4 测试
测试后发现,数据并没有被删除,deleted字段的值由0变成了1测试后分析打印的sql语句,是一条update
注意:被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作
@Test public void testLogicDelete() { int result = userMapper.deleteById(1L); system.out.println(result); } |
5.2.5测试逻辑删除后的查询
MyBatis Plus中查询操作也会自动添加逻辑删除字段的判断
@Test public void testLogicDeleteSelect() { List<User> users = userMapper.selectList(null); users.forEach(System.out::println); } |
MyBatis_Plus条件构造器和常用接口
1、wapper介绍
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : 查询条件封装
UpdateWrapper : Update 条件封装
AbstractLambdaWrapper : 使用Lambda 语法
LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
2、测试用例
2.1 ge大于等于、gt大于、le小于等于、lt小于、isNull是null、isNotNull不是null
@Test public void testQuery() { QueryWrapper<User>queryWrapper = newQueryWrapper<>(); queryWrapper .isNull("name") .ge("age", 12) .isNotNull("email"); int result = userMapper.delete(queryWrapper); System.out.println("delete return count = " + result); } |
2.2 eq、ne
注意:seletOne()返回的是一条实体记录,当出现多条时会报错
@Test public void testSelectOne() { QueryWrapper<User>queryWrapper = newQueryWrapper<>(); queryWrapper.eq("name", "Tom"); Useruser = userMapper.selectOne(queryWrapper);//只能返回一条记录,多余一条则抛出异常 System.out.println(user); } |
2.3 between、notBetween
包含大小边界
@Test public void testSelectCount() { QueryWrapper<User>queryWrapper = newQueryWrapper<>(); queryWrapper.between("age", 20, 30); Integer count = userMapper.selectCount(queryWrapper); //返回数据数量 System.out.println(count); } |
2.4 like、notLike、likeLeft、likeRight
selectMaps()返回Map集合列表,通常配合select()使用
@Test public void testSelectMaps() { QueryWrapper<User>queryWrapper = newQueryWrapper<>(); queryWrapper .select("name", "age") .like("name", "e") .likeRight("email", "5"); List<Map<String, Object>>maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表 maps.forEach(System.out::println); } |
2.5 orderBy、orderByDesc、orderByAsc
@Test public void testSelectListOrderBy() { QueryWrapper<User>queryWrapper = newQueryWrapper<>(); queryWrapper.orderByDesc("age", "id"); List<User>users = userMapper.selectList(queryWrapper); users.forEach(System.out::println); } |
2、查询方式
查询方式 |
说明 |
setSqlSelect |
设置 SELECT 查询字段 |
where |
WHERE 语句,拼接 + WHERE 条件 |
and |
AND 语句,拼接 + AND 字段=值 |
andNew |
AND 语句,拼接 + AND (字段=值) |
or |
OR 语句,拼接 + OR 字段=值 |
orNew |
OR 语句,拼接 + OR (字段=值) |
eq |
等于= |
allEq |
基于 map 内容等于= |
ne |
不等于<> |
gt |
大于> |
ge |
大于等于>= |
lt |
小于< |
le |
小于等于<= |
like |
模糊查询 LIKE |
notLike |
模糊查询 NOT LIKE |
in |
IN 查询 |
notIn |
NOT IN 查询 |
isNull |
NULL 值查询 |
isNotNull |
IS NOT NULL |
groupBy |
分组 GROUP BY |
having |
HAVING 关键词 |
orderBy |
排序 ORDER BY |
orderAsc |
ASC 排序 ORDER BY |
orderDesc |
DESC 排序 ORDER BY |
exists |
EXISTS 条件语句 |
notExists |
NOT EXISTS 条件语句 |
between |
BETWEEN 条件语句 |
notBetween |
NOT BETWEEN 条件语句 |
addFilter |
自由拼接 SQL |
last |
拼接在最后,例如:last(“LIMIT 1”) |
原文地址:https://www.cnblogs.com/vernall/p/14790079.html