Mybatis-Plus常用的增删改查坑

添加依赖

   <!--实体类上加上@Data注解就不用写get,set,toString,equals等方法了--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--mybatis-plus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.0</version></dependency>

Mapper接口要继承自BaseMapper并将实体类作为泛型

public interface UserMapper extends BaseMapper<User> {
}

增 insert

User user = new User();
user.setUserName("向南");
user.setAge(32);
user.setEmail("xn@163.com");
user.setManagerId(1088248166370832385L);
int rows = userMapper.insert(user);

删 delete

deleteById

@Test
public void deleteById(){int rows = userMapper.deleteById(1152147420519170050L);System.out.println("删除的记录数:"+rows);
}

deleteByMap

/*** DELETE FROM user WHERE name = ? AND age = ? */
@Test
public void deleteByMap(){HashMap<String, Object> map = new HashMap<>();map.put("age",32);map.put("name","朱上林");int rows = userMapper.deleteByMap(map);System.out.println("删除了:"+rows+"条记录");
}

deleteBatchIds

@Test
public void deleteBatchIds(){int rows = userMapper.deleteBatchIds(
Arrays.asList(1152134491950309377L,1152138510835929090L, 1152139353765216258L));System.out.println("受影响的行数:"+rows);
}

Lambda删除

@Test
public void deleteByLambdaWrapper(){LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();// DELETE FROM user WHERE age = ? OR age > ? lambdaWrapper.eq(User::getAge,32).or().gt(User::getAge,40);int rows = userMapper.delete(lambdaWrapper);System.out.println("受影响的行数:"+rows);
}

改 update

updateById

@Test
public void updateUser(){User user = new User();user.setId(1094590409767661571L);user.setAge(28);user.setEmail("zhushanglin@163.com");int rows = userMapper.updateById(user);//UPDATE user SET age=?, email=? WHERE id=? System.out.println("受影响的行数: "+rows);
}

update

@Test
public void updateByWrapper(){UpdateWrapper<User> wrapper = new UpdateWrapper<>();//where条件构造器wrapper.eq("name","朱上林");//set改变的数据设置User user = new User();user.setAge(29);user.setEmail("zhu2019@qq.com");int rows = userMapper.update(user, wrapper);//UPDATE user SET age=?, email=? WHERE name = ?System.out.println("受影响的行数: "+rows);
}

查 select

selectById

@Test
public void selectById(){User user = userMapper.selectById(1088248166370832385L);//SELECT id,name,age,email,manager_id,create_time FROM user WHERE id=?System.out.println(user);
}

selectBatchIds

@Test
public void selectBatchIds(){List<Long> idList = Arrays.asList(1087982257332887553L, 1094590409767661571L, 1152134491950309377L);List<User> userList = userMapper.selectBatchIds(idList);//SELECT id,name,age,email,manager_id,create_time FROM user WHERE id IN ( ? , ? , ? )userList.forEach(System.out::println);
}

selectByMap

@Test
public void selectByMap(){HashMap<String, Object> map = new HashMap<>();map.put("name", "朱上林");map.put("age",26);
//注意map中的key是表中的列,不是实体类中的属性List<User> userList = userMapper.selectByMap(map);//SELECT id,name,age,email,manager_id,create_time FROM user WHERE name = ? AND age = ?userList.forEach(System.out::println);
}

条件构造器查询

/**
*查询名字包含“雨”子,并且年龄小于40
*/
@Test
public void selectByWrapper(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件: WHERE name LIKE ? AND age < ?wrapper.like("name", "%雨%").lt("age",40);//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}/*
查询名字包含“雨”子,并且年龄大于等于20,小于等于40,并且email不为null*/
@Test
public void selectByWrapper2(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件:WHERE name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULLwrapper.like("name", "%雨%")
.between("age",20,40)
.isNotNull("email");//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}/*
查询名字为"王"姓,或者年龄大于等于26,先按照年龄降序排列,年龄相同的按照id升序排列*/
@Test
public void selectByWrapper3(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件:WHERE name LIKE 王% OR age >= 26 ORDER BY age DESC , id ASC wrapper.likeRight("name","王").or().ge("age",26).orderByDesc("age").orderByAsc("id");//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}/*
查询创建日期为2019-2-14,并且直属上级领导 姓"王"*/
@Test
public void selectByWrapper4(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件:create_time字段格式化为"年-月-日"后值为2019-02-14,并且,直属上级姓"王"(子查询)//WHERE date_format(create_time,'%Y-%m-%d') = ? AND manager_id IN (select id from user where name like '王%') wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}","2019-02-14").inSql("manager_id","select id from user where name like '王%'");//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}/*
查询名字为"王"姓 且(年龄小于40或邮箱不为空)*/
@Test
public void selectByWrapper5(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件:WHERE name LIKE ? AND ( age < ? OR email IS NOT NULL )
//wrap->wrap表示将wrapper传一个到后面,前面是一个整体,后面是一个整体,两个整体再andwrapper.likeRight("name","王").and(wrap->wrap.lt("age",40).or().isNotNull("email"));//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}/*
查询年龄大于40 或者(年龄大于20并且邮箱不为空)*/
@Test
public void selectByWrapper6(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件:WHERE age < ? OR ( age >= ? AND email IS NOT NULL ) wrapper.lt("age",40).or(wrap->wrap.ge("age",20).isNotNull("email"));//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}/*
查询(年龄小于40或者邮箱不为空) 并且 名字为"王"姓*/
@Test
public void selectByWrapper7(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件:WHERE ( age < ? OR email IS NOT NULL ) AND name LIKE ? wrapper.nested(wq->wq.lt("age",40).or().isNotNull("email")).likeRight("name","王");//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}/*
查询年龄是30,31,32,33
age in (30,31,32,33)*/
@Test
public void selectByWrapper8(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件:WHERE age IN (?,?,?,?) wrapper.in("age",Arrays.asList(30,31,32,33));//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}

常用构造器

常用条件构造器:
等于 =: eq("name", "老王")--->name = '老王'
不等于 <>: ne("name", "老王")--->name <> '老王'
大于 >: gt("age", 18)--->age > 18
大于等于 >=: ge("age", 18)--->age >= 18
小于 <: lt("age", 18)--->age < 18
小于等于 <=: le("age", 18)--->age <= 18
BETWEEN1 AND2: between("age", 18, 30)
--->age between 18 and 30
NOT BETWEEN1 AND2: notBetween("age", 18, 30)
--->age not between 18 and 30
LIKE '%值%': like("name", "王")
--->name like '%王%'
NOT LIKE '%值%': notLike("name", "王")
--->name not like '%王%'
LIKE '%值': likeLeft("name", "王")
--->name like '%王'
LIKE '值%': likeRight("name", "王")
--->name like '王%'
字段 IS NULL: isNull("name")
--->name is null
字段 IS NOT NULL: isNotNull("name")
--->name is not null
字段 IN: in("age",{1,2,3})
--->age in (1,2,3)
字段NOTIN: notIn("age",{1,2,3})
--->age not in (1,2,3)
字段 IN ( sql语句 ): inSql("id", "select id from table where id < 3")
--->id in (select id from table where id < 3)
字段 NOT IN ( sql语句 ): notInSql("id", "select id from table where id < 3")
--->age not in (select id from table where id < 3)
分组:GROUP BY 字段, ...: groupBy("id", "name")
--->group by id,name
排序:ORDER BY 字段, ... ASC: orderByAsc("id", "name")
--->order by id ASC,name ASC
排序:ORDER BY 字段, ... DESC: orderByDesc("id", "name")
--->order by id DESC,name DESC
HAVING ( sql语句 ): having("sum(age) > 10")
--->having sum(age) > 10: having("sum(age) > {0}", 11)
--->having sum(age) > 11
OR 拼接
例: eq("id",1).or().eq("name","老王")
--->id = 1 or name = '老王'
OR 嵌套
例: or(i -> i.eq("name", "李白").ne("status", "活着"))
--->or (name = '李白' and status <> '活着')
AND 嵌套
例: and(i -> i.eq("name", "李白").ne("status", "活着"))
--->and (name = '李白' and status <> '活着')
apply拼接sql
例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")
--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")

查询部分字段

/**
*查询指定的字段
*/
@Test
public void selectByWrapperSuper(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件: SELECT id,name FROM user WHERE name LIKE ? AND age < ? wrapper.select("id","name").like("name", "%雨%").lt("age",40);//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}
/*** 查询除了name和age的所有有字段,名字中包含"雨",且年龄小于40*/
@Test
public void selectByWrapperSuper2(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//构造器赋予条件: SELECT id,name FROM user WHERE name LIKE ? AND age < ?wrapper.like("name", "%雨%").lt("age",40)
.select(User.class,info->!info.getColumn().equals("name")&&!info.getColumn().equals("age"));//执行条件构造器查询List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);
}

条件查询

@Test
public void testContdition(){String name = "王";String email = "";//WHERE name LIKE ? ,因为email为空,所以不加入到条件构造器中condition(name, email);
}private void condition(String name, String email){QueryWrapper<User> wrapper = new QueryWrapper<>();//当传过来的参数name,email不为空字符串时,才加入到查询构造器中wrapper.like(StringUtils.isNotEmpty(name),"name",name).like(StringUtils.isNotEmpty(email),"email",email);List<User> userList = userMapper.selectList(wrapper);userList.forEach(System.out::println);
}

创建条件构造器时,传入实体对象

 /*
创建条件构造器时,传入实体对象,就可以代替构造条件wrapper...*/@Testpublic void selectByWrapperEntity(){//创建实体对象User user = new User();user.setAge(26);//相当于WHERE age=26//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>(user);//使用实体对象,就不用构造条件了List<User> userList = userMapper.selectList(wrapper);//遍历输出结果userList.forEach(System.out::println);}

allEq

@Test
public void selectByWrapperAllEq(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();//创建一个参数map对象HashMap<String, Object> params = new HashMap<>();params.put("name", "王天风");params.put("age", null);wrapper.allEq(params);//WHERE name = ? AND age IS NULLList<User> userList = userMapper.selectList(wrapper);userList.forEach(System.out::println);
}

selectMaps

@Test
public void selectByWrapperMaps(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.select("id","name").like("name", "雨").lt("age", 40);List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);/*** 这样查询结果只有我们想要的字段和对应的值,没有很多没用的字段和对应的值为null* {name=张雨琪, id=1094590409767661570}* {name=刘红雨, id=1094592041087729666}*/maps.forEach(System.out::println);
}
/*** 按照直属上级分组,查询每组最大年龄,平均年龄,最小年龄,并且只取年龄总和小于500的组* select avg(age) avg_age,max(age) max_age,min(age) min_age* from user* group by manager_id* having sum(age)<500*/
@Test
public void selectByWrapperMaps02(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.select("avg(age) avg_age", "max(age) max_age", "min(age) min_age").groupBy("manager_id").having("sum(age)<{0}", 500);List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);/*** {max_age=40, avg_age=40.0000, min_age=40}* {max_age=25, avg_age=25.0000, min_age=25}* {max_age=33, avg_age=29.6250, min_age=26}*/maps.forEach(System.out::println);
}

selectCount

/*** 查询名字中有"雨"子的记录数量
* 注意查询记录数量,不能查询具体的列名*/
@Test
public void selectCount(){QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.like("name","雨");Integer count = userMapper.selectCount(wrapper);System.out.println(count);
}

Lambda条件构造器

好处:可以放置列名写错,写错编译就不通过

VehicleBO one = vehicleService.getOne(Wrappers.<VehicleBO>lambdaQuery().eq(VehicleBO::getVin, reqVo.getVin()));
/*** Lambda条件构造器* 查询王姓,年龄小于40*/
@Test
public void selectLambdaWrapper(){// 创建Lambda条件构造器LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();//设置Lambda条件:WHERE name LIKE ? AND age < ? lambdaWrapper.like(User::getName,"雨").lt(User::getAge, 40);List<User> userList = userMapper.selectList(lambdaWrapper);userList.forEach(System.out::println);
}
/*** Lambda条件构造器* name like '王%' and (age<40or email is not null)*/
@Test
public void selectLambdaWrapper2(){// 创建Lambda条件构造器LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();//设置Lambda条件:WHERE name LIKE ? AND ( age < ? OR email IS NOT NULL ) lambdaWrapper.likeRight(User::getName,"王").and(lwq->lwq.lt(User::getAge,40)//and(lwq->lwq)嵌套
.or().isNotNull(User::getEmail));//or()拼接List<User> userList = userMapper.selectList(lambdaWrapper);userList.forEach(System.out::println);
}

分页查询

配置分页插件类
在这里插入图片描述
分页查询selectPage

 /*分页查询:年龄大于26岁
*/@Testpublic void selectPage(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.gt("age",26);//创建一个Page对象:从第一页开始查询,每页5条数据Page<User> page = new Page<>(1, 5);
/***  Page<User> page = new Page<>(1, 5,false);
*  这样表示不查询总记录数*///selectPage返回一个Ipage对象IPage<User> iPage = userMapper.selectPage(page, wrapper);//Ipage对象中有总页数,总记录条数,所有记录的get方法System.out.println("总页数"+iPage.getPages());System.out.println("总记录条数"+iPage.getTotal());List<User> userList = iPage.getRecords();userList.forEach(System.out::println);}
 /*分页查询:年龄大于26岁的姓名和年龄
*/@Testpublic void selectMapPage(){//创建一个查询条件构造器对象QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.select("name", "age").gt("age",26);//创建一个Page对象:从第一页开始查询,每页5条数据Page<User> page = new Page<>(1, 5);//selectPage返回一个Ipage对象IPage<Map<String, Object>> iPage = userMapper.selectMapsPage(page, wrapper);//Ipage对象中有总页数,总记录条数,所有记录的get方法System.out.println("总页数"+iPage.getPages());System.out.println("总记录条数"+iPage.getTotal());List<Map<String, Object>> userList = iPage.getRecords();userList.forEach(System.out::println);}

Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: 无法将 NULL 插入 (“ZHXY_RSW_LOCAL”.“T_EXAM_SUBJECT”.“ID”)
使用mybatis-plus插入时,明明设置了id的值,还报这个错
在id字段上,添加 @TableId(type = IdType.INPUT)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/688133.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL——queue容器【队列】

queue的基本概念&#xff1a; 概念&#xff1a;queue是一种先进先出的数据结构&#xff0c;它有两个出口 queue的构造函数&#xff1a; 构造函数&#xff1a; queue<T>que:采用模板类实现&#xff0c;queue对象的默认构造形式 queue(const queue &que):拷贝构造函…

利用OpenShift的ImageStream部署临时版本

公司是港企&#xff0c;项目都部署在OpenShift上统一管理&#xff0c;因为运行环境为香港网络(外网)&#xff0c;配置、中间件等大陆无法直接访问联通。因此在大陆开发时&#xff0c;测试是个很大的问题。为了避免往Git上频繁提交未确定可用的版本&#xff0c;选择用利用OpenSh…

Python 日志模块Loguru基本使用和封装使用

【一】介绍 Loguru是一个用于Python的日志库&#xff0c;它的设计目标是使日志记录变得简单、快速且易于阅读。 &#xff08;1&#xff09;Loguru介绍 简洁的API&#xff1a;Loguru提供了一个简洁的API&#xff0c;使得在Python项目中使用日志变得更加容易。只需导入loguru模…

智慧公厕的技术基础、保障技术和应用价值

近年来&#xff0c;随着信息技术的快速发展&#xff0c;智慧公厕逐渐成为城市管理的热点项目。智慧公厕利用物联网技术与大数据、云计算、网络通信、自动化控制等先进技术相结合&#xff0c;公共厕所的管理变得更加快捷高效&#xff0c;实现了真正的智能化使用和智慧化管理。下…

LeetCode例题讲解:844.比较含退格的字符串

给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&#xff0c;返回 true 。# 代表退格字符。 注意&#xff1a;如果对空文本输入退格字符&#xff0c;文本继续为空。 示例 1&#xff1a; 输入&#xff1a;s "ab#c&qu…

大米自动化生产线揭秘:包装设备选择与维护之道

在现代化的大米生产过程中&#xff0c;自动化生产线的应用已经越来越广泛。其中&#xff0c;包装设备作为生产线上的重要一环&#xff0c;其选择与维护直接关系到产品的质量和生产效率。与星派一起探讨大米自动化生产线中包装设备的选择与维护之道。 一、包装设备的选择 在选择…

【C#】 SortedDictionary,查找字典中是否存在给定的关键字

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景场景说明红黑树原理判断代码Dictionary知识点相关文章 背景 最近…

全网最详细IOS系统APP上架教程(一)

准备材料 1、邮箱 2、手机号 3、官网&#xff08;网站必须能打的开&#xff0c;且为一级域名&#xff0c;域名必须与组织相关联&#xff09; 4、公司信息 5、申请人名字、电话号码、邮箱、身份证号码&#xff08;注册过程中会需要人脸识别认证&#xff09; 7、需要苹果手机和苹…

以太网技术介绍

随着通信和计算机技术的不断发展&#xff0c;无论是骨干网还是接入网&#xff0c;以太网都已成为应用场景最多&#xff0c;应用范围最广泛的技术之一。对于初次应用以太网的读者&#xff0c;本文主要给出以太网技术的基础知识&#xff0c;并对以太网涉及的部分协议进行简要说明…

【csdn】数据工程实践:从网络抓取到API调用,解析共享单车精准投放所需要的数据

共享单车作为一种便捷的出行方式&#xff0c;有效缓解了“最后一公里”难题&#xff0c;同时促进了绿色出行。然而&#xff0c;在高峰时段&#xff0c;供需不均和停车难成为普遍挑战&#xff0c;尤其是在通勤时间&#xff0c;热门地点如地铁站附近和办公区常常面临车辆短缺或停…

【程序设计和c语言-谭浩强配套】(适合专升本、考研)

一晃大半年没更新了&#xff0c;这一年一直在备考&#xff0c;想着这几天把前段时间学的c语言给大家分享一下&#xff0c;在此做了一个专栏&#xff0c;有需要的小伙伴可私信获取o。 简介&#xff1a;本专栏所有内容皆适合专升本、考研的复习资料&#xff0c;本人手上也有日常…

C# WinForm —— 13 ComboBox下拉框/组合框介绍

1. 简介 ComboBox 是由 textBox 和 listBox 组合而成的&#xff0c;只能选择一项&#xff0c;不能选择多项&#xff0c;其他功能和 listBox类似 ComboBox 下拉框的三种样式&#xff1a;&#xff08;通过 DropDownStyle属性 设置&#xff09; Simple: 最简单的样式&#xff0c…