MyBatisPlus学习笔记【part2】
一、查询操作
1.通过多个id批量查询
调用selectBatchIds方法。
@Test
public void testSelect1(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
System.out.println(users);
}
2.简单的条件查询
通过map来封装查询条件,调用selectByMap方法。
注意:map中的key对应数据库中的列名。如:数据库user_id,实体类是userId,这时map的key需要填写数据库的user_id 。
@Test void testSelect2(){
Map<String,Object> map = new HashMap<>();
map.put("name","zhangsan7");
map.put("age",18);
List<User> users = userMapper.selectByMap(map);
System.out.println(users);
}
3.分页查询
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能。
第一步,配置类中添加分页插件。
@Configuration
@MapperScan(basePackages = "com.ichuang.swz.mapper")
public class MybatisPlusConfig {
/*
* 分页插件
*/
@Bean
public MybatisPlusInterceptor paginationInnerInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
第二步,通过page对象获取相关数据。
@Test
public void testSelect3(){
Page page = new Page(1,5);
Page userPage = userMapper.selectPage(page, null); //返回对象得到所有分页数据
long pages = userPage.getPages(); //总页数
long pageCurrent = userPage.getCurrent(); //当前页
List records = userPage.getRecords(); //查询出来的数据集合
long total = userPage.getTotal(); //总记录数
boolean hasNext = userPage.hasNext(); //是否有上一页
boolean hasPrevious = userPage.hasPrevious(); //是否有上一页
log.info("总页数{}页",String.valueOf(pages));
log.info("当前页{}页",String.valueOf(pageCurrent));
log.info("数据集------{}",String.valueOf(records));
log.info("总记录数{}",String.valueOf(total));
log.info("是否有下一页---{}",String.valueOf(hasNext));
log.info("是否有上一页---{}",String.valueOf(hasPrevious));
/*输出结果
3-01-13 15:55:14.235 INFO 13852 --- [ main] com.ichuang.swz.SwzApplicationTests : 总页数2页
2023-01-13 15:55:14.235 INFO 13852 --- [ main] com.ichuang.swz.SwzApplicationTests : 当前页1页
2023-01-13 15:55:14.235 INFO 13852 --- [ main] com.ichuang.swz.SwzApplicationTests : 数据集------[User(id=1, name=Jone, age=18, email=test1@baomidou.com, createTime=null, updateTime=null, version=null), User(id=2, name=Jack, age=20, email=test2@baomidou.com, createTime=null, updateTime=null, version=null), User(id=3, name=Tom, age=28, email=test3@baomidou.com, createTime=null, updateTime=null, version=null), User(id=4, name=Sandy, age=21, email=test4@baomidou.com, createTime=null, updateTime=null, version=null), User(id=5, name=Billie, age=24, email=test5@baomidou.com, createTime=null, updateTime=null, version=null)]
2023-01-13 15:55:14.235 INFO 13852 --- [ main] com.ichuang.swz.SwzApplicationTests : 总记录数8
2023-01-13 15:55:14.236 INFO 13852 --- [ main] com.ichuang.swz.SwzApplicationTests : 是否有下一页---true
2023-01-13 15:55:14.236 INFO 13852 --- [ main] com.ichuang.swz.SwzApplicationTests : 是否有上一页---false
*/
}
分页查询也可以用 selectMapsPage方法 ,此时返回的结果集是Map类型,但使用情况较少。
二、删除操作
1.根据id删除
@Test
public void testDeleteById(){
userMapper.deleteById(1613780561515573250L);
}
2.批量删除
根据存放id的集合进行批量删除。
@Test
public void testDeleteBatchIds() {
userMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
}
3.简单条件删除
通过map封装条件,来进行条件删除。
@Test
public void testDeleteByMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("name", "zhangsan");
map.put("age", 25);
userMapper.deleteByMap(map);
}
4.逻辑删除
物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。
逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。
逻辑删除的使用场景:可以进行数据恢复,或有关联数据,不便直接删除。
MybatisPlus实现逻辑删除,第一步,在数据库中添加 deleted 字段。
ALTERTABLE `user` ADD COLUMN `deleted` boolean DEFAULT false
注:MySQL保存Boolean值时,用1代表TRUE,0代表FALSE,boolean类型在MySQL里的类型为tinyint(1)。
第二步,实体类中添加@TableLogic注解。
@TableLogic
private Integer delete;
第三步,application.properties 加入以下配置,此为默认值,如果你的默认值和mp默认的一样,该配置可无。
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
第四步,单元测试。
测试后发现,数据并没有被删除,deleted字段的值由0变成了1。
注意:经过上面的配置,记录被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作。
@Test
public void testLogicDelete(){
userMapper.deleteById(1613776095357759489L);
}
此时查询所有时,id为已不会被查到。
@Test
public void testLogicDeleteSelect() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
三、条件构造器
1.Wrapper 条件构造抽象类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : 查询条件封装
UpdateWrapper : Update 条件封装
AbstractLambdaWrapper : 使用Lambda 语法
LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
一般会使用Lambda的Wrapper,LambdaWrapper使用时用的是Lambda表达式来表示字段名,而Wrapper使用时需要我们自己填写String类型的字段名,容易写错。LambdaWrapper在编写代码时若字段名写错就会报红,而Wrapper不能,只能在编译时发现。
2.ge、gt、le、lt、isNull、isNotNul
代码如下。
@Test
public void testQuery1(){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
queryWrapper.isNotNull(User::getName)
.gt(User::getAge,20);
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
3.eq、ne
代码如下。其中selectOne方法只能返回一条记录,多余一条则抛出异常。
@Test
public void testQuery2(){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(User::getName,"zhangsan");
User user = userMapper.selectOne(queryWrapper);
System.out.println(user);
}
4.between、notBetween
包含大小边界。selectCount方法返回的为记录数量。
@Test
public void testQuery3(){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
queryWrapper.between(User::getAge,20,25);
Integer count = userMapper.selectCount(queryWrapper);
System.out.println(count);
}
5.like、notLike、likeLeft、likeRight
selectMaps方法返回Map集合列表,通常配合select方法使用。select方法选取列。
@Test
public void testQuery4(){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
queryWrapper.select(User::getName,User::getAge)
.like(User::getName,"zhangsan")
.likeLeft(User::getEmail,"@qq.com");
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
maps.forEach(System.out::println);
}
/*拼接出的sql语句
==> Preparing: SELECT name,age FROM user WHERE deleted=0 AND (name LIKE ? AND email LIKE ?)
==> Parameters: %zhangsan%(String), %@qq.com(String)
*/
/* 输出的map集合
{name=zhangsan, age=30}
*/
6.orderBy、orderByDesc、orderByAsc
代码如下。
@Test
public void testQuery5(){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
queryWrapper.orderByDesc(User::getAge,User::getName);
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
7.查询方式速查
查询方式 | 说明 |
---|---|
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.bmabk.com/index.php/post/84468.html