一、条件构造器关系介绍


CREATE TABLE `tb_student` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT 'age',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`del_flag` tinyint(1) DEFAULT NULL COMMENT '0:存在,1:删除',
`manager_id` int DEFAULT NULL COMMENT '上级领导id',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'email',
`sex` int DEFAULT NULL COMMENT '1:男,2:女:3未知',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `tb_student` (`id`, `name`, `age`, `create_time`, `update_time`, `del_flag`, `manager_id`, `email`, `sex`)
VALUES
(1, '孙悟空', 99, '2023-04-07 01:57:28', '2023-04-07 02:01:25', 0, 4, 'sunwukong@qq.com', 1),
(2, '猪八戒', 40, '2023-04-07 01:57:28', NULL, 0, 4, 'zhubajie@qq.com', 1),
(3, '孙悟空', 99, '2023-04-07 01:57:28', NULL, 0, 4, 'sunwukong@qq.com', 1),
(4, '唐僧', 99, '2023-04-07 01:57:28', '2023-04-07 02:01:25', 0, 0, 'tangseng@qq.com', 2),
(5, '白龙马', 40, '2023-04-07 01:57:28', NULL, 0, 4, 'bailongma@qq.com', 1),
(6, '猪悟能', 40, '2023-04-07 01:57:28', NULL, 0, 4, 'zhuwuneng@qq.com', 1);

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TbStudent implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String name;
private Integer age;
private Date createTime;
private Date updateTime;
private int delFlag;
private Integer managerId;
private String email;
private Integer sex;
@Resource
private TbStudentMapper tbStudentMapper;
/**
* 1.通过单个ID主键进行查询
*/
@Test
public void selectById() {
TbStudent tbStudent = tbStudentMapper.selectById(1);
System.out.println(tbStudent);
}
/**
* 2. 通过多个ID主键查询
* WHERE id IN ( 1, 2 )
*/
@Test
public void selectByList() {
List<Long> longs = Arrays.asList(1L, 2L);
List<TbStudent> students = tbStudentMapper.selectBatchIds(longs);
students.forEach(System.out::println);
}
/**
* 3. 通过Map参数进行查询
* WHERE name = '唐僧'
*/
@Test
public void selectByMap() {
Map<String, Object> params = new HashMap<>();
params.put("name", "唐僧");
List<TbStudent> students = tbStudentMapper.selectByMap(params);
students.forEach(System.out::println);
}
/**
* Wrapper条件构造器使用
*/
/**
* 4.名字包含悟空并且年龄小于40
* WHERE (name LIKE %悟空% AND age < 40)
*/
@Test
public void selectByWrapperOne() {
QueryWrapper<TbStudent> wrapper = new QueryWrapper();
wrapper.like("name", "悟空").lt("age", 40);
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 5.名字包含悟空年龄大于20小于40邮箱不能为空
* WHERE name LIKE '%雨%' AND age BETWEEN 20 AND 40 AND email IS NOT NULL
*/
@Test
public void selectByWrapperTwo() {
QueryWrapper<TbStudent> wrapper = Wrappers.query();
wrapper.like("name", "悟空").between("age", 20, 40).isNotNull("email");
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 6.名字为猪姓或者年龄大于等于25,按照年龄降序排序,年龄相同按照id升序排序
* <p>
* WHERE name LIKE '猪%' or age >= 25 ORDER BY age DESC , id ASC
*/
@Test
public void selectByWrapperThree() {
QueryWrapper<TbStudent> wrapper = Wrappers.query();
wrapper.likeRight("name", "猪").or()
.ge("age", 25).orderByDesc("age").orderByAsc("id");
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 7. 查询创建时间为2019年2月14 并且上级领导姓唐
* WHERE date_format(create_time,'%Y-%m-%d') = '2019-02-14' AND manager_id IN (select id from user where name like '王%')
*/
@Test
public void selectByWrapperFour() {
QueryWrapper<TbStudent> wrapper = Wrappers.query();
wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14")
.inSql("manager_id", "select id from tb_student where name like '唐%'");
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 8.查询猪姓,并且年龄小于40或者邮箱不为空
* WHERE name LIKE '猪%' AND ( age < 40 OR email IS NOT NULL )
*/
@Test
public void selectByWrapperFive() {
QueryWrapper<TbStudent> wrapper = Wrappers.query();
wrapper.likeRight("name", "猪").and(qw -> qw.lt("age", 40).or().isNotNull("email"));
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 9.查询猪姓,或者 年龄大于20 、年龄小于40、邮箱不能为空
* WHERE name LIKE ? OR ( age BETWEEN ? AND ? AND email IS NOT NULL )
*/
@Test
public void selectByWrapperSix() {
QueryWrapper<TbStudent> wrapper = Wrappers.query();
wrapper.likeRight("name", "猪").or(
qw -> qw.between("age", 20, 40).isNotNull("email")
);
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 10.(年龄小于40或者邮箱不为空) 并且名字姓猪
* WHERE ( age < 40 OR email IS NOT NULL ) AND name LIKE '王%'
*/
@Test
public void selectByWrapperSeven() {
QueryWrapper<TbStudent> wrapper = Wrappers.query();
wrapper.nested(qw -> qw.lt("age", 40).or().isNotNull("email"))
.likeRight("name", "猪");
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 11.查询年龄为23, 42, 54
* WHERE age IN (?,?,?)
*/
@Test
public void selectByWrapperEight() {
QueryWrapper<TbStudent> wrapper = Wrappers.query();
wrapper.in("age", Arrays.asList(23, 42, 54));
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 12.查询一条数据
* limit 1
*/
@Test
public void selectByWrapperNine() {
QueryWrapper<TbStudent> wrapper = Wrappers.query();
wrapper.in("age", Arrays.asList(23, 42, 54)).last("limit 1");
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 13.根据条件删除数据
* DELETE FROM tb_student WHERE (name IS NULL AND age >= ? AND email IS NOT NULL)
*/
@Test
public void testDelete() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
queryWrapper
.isNull("name")
.ge("age", 12)
.isNotNull("email");
int result = tbStudentMapper.delete(queryWrapper);
System.out.println("delete return count = " + result);
}
/**
* 14.eq的用法
* tb_student WHERE (name = ?)
*
* @return
*/
@Test
public void testSelectOne() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "孙悟空");
TbStudent students = tbStudentMapper.selectOne(queryWrapper);
System.out.println(students);
}
/**
* 14.between、notBetween用法
* between、notBetween
* WHERE (age BETWEEN ? AND ?)
* 包含大小边界
*/
@Test
public void testSelectCount() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
queryWrapper.between("age", 10, 50);
Integer count = tbStudentMapper.selectCount(queryWrapper);
System.out.println(count);
}
/**
* 15.allEq的用法
* WHERE (name = ? AND id = ? AND age = ?)
*/
@Test
public void testSelectList() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
Map<String, Object> map = new HashMap<>();
map.put("id", 4);
map.put("name", "唐僧");
map.put("age", 12);
queryWrapper.allEq(map);
List<TbStudent> students = tbStudentMapper.selectList(queryWrapper);
students.forEach(System.out::println);
}
/**
* 16.like、notLike、likeLeft、likeRight的用法
* WHERE (name NOT LIKE %唐% AND email LIKE tang%)
*/
@Test
public void testSelectMaps() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
queryWrapper
.notLike("name", "唐")
.likeRight("email", "tang");
//返回值是Map列表
List<Map<String, Object>> maps = tbStudentMapper.selectMaps(queryWrapper);
maps.forEach(System.out::println);
}
/**
* 17.in、notIn 的用法
* WHERE (id NOT IN (1,2,3))
*/
@Test
public void testIn() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
queryWrapper.notIn("id", 1, 2, 3);
//返回值是Map列表
List<Map<String, Object>> maps = tbStudentMapper.selectMaps(queryWrapper);
maps.forEach(System.out::println);
}
/**
* 18. inSql、notinSql:实现子查询
* <p>
* WHERE (id IN (select id from tb_student where id < 3))
*/
@Test
public void testSelectObjs() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
queryWrapper.inSql("id", "select id from tb_student where id < 3");
//返回值是Object列表
List<Object> objects = tbStudentMapper.selectObjs(queryWrapper);
objects.forEach(System.out::println);
}
/** * 19 or、and 用法
* 注意:这里使用的是 UpdateWrapper 不调用or则默认为使用 and 连
* UPDATE tb_student SET age=40, create_time='2023-04-07' WHERE (name LIKE %唐% OR age BETWEEN 20 AND 88)
*/
@Test
public void testUpdate1() {
//修改值
TbStudent student = new TbStudent();
student.setAge(40);
student.setCreateTime(new Date());
//修改条件
UpdateWrapper<TbStudent> studentUpdateWrapper = new UpdateWrapper<>();
studentUpdateWrapper
.like("name", "唐")
.or()
.between("age", 20, 88);
int result = tbStudentMapper.update(student, studentUpdateWrapper);
System.out.println(result);
}
/**
* 20、嵌套or、嵌套and
* 这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号
* UPDATE tb_student SET age=?, update_time=? WHERE (name LIKE ? OR (name = ? AND age <> ?))
*/
@Test
public void testUpdate2() {
//修改值
TbStudent student = new TbStudent();
student.setAge(99);
student.setUpdateTime(new Date());
//修改条件
UpdateWrapper<TbStudent> studentUpdateWrapper = new UpdateWrapper<>();
studentUpdateWrapper
.like("name", "唐")
.or(i -> i.eq("name", "孙悟空").ne("age", 20));
int result = tbStudentMapper.update(student, studentUpdateWrapper);
System.out.println(result);
}
/**
* 21 orderBy、orderByDesc、orderByAsc
* FROM tb_student ORDER BY id DESC
*/
@Test
public void testSelectListOrderBy() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
//queryWrapper.orderByDesc("id");
//queryWrapper.orderByAsc("id");
//ORDER BY age ASC
queryWrapper.orderBy(true, true, "age");
List<TbStudent> users = tbStudentMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
/**
* 22.last用法
* 代表直接拼接到 sql 的最后
* 注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用
* FROM tb_student limit 1
*/
@Test
public void testSelectListLast() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
queryWrapper.last("limit 1");
List<TbStudent> students = tbStudentMapper.selectList(queryWrapper);
students.forEach(System.out::println);
}
/**
* 23.指定要查询的列
* SELECT id,name,age FROM tb_student
*/
@Test
public void testSelectListColumn() {
QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "name", "age");
List<TbStudent> users = tbStudentMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
/**
* 24、set、setSql的用法
* 最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段
* UPDATE tb_student SET age=99 name='孙悟空', email = 'sunwukong@qq.com' WHERE (name LIKE %沙和尚%()
*/
@Test
public void testUpdateSet() {
//修改值
TbStudent student = new TbStudent();
student.setAge(99);
//修改条件
UpdateWrapper<TbStudent> studentUpdateWrapper = new UpdateWrapper<>();
studentUpdateWrapper
.like("name", "沙和尚")
//除了可以查询还可以使用set设置修改的字段
.set("name", "孙悟空")
//可以有子查询
.setSql(" email = 'sunwukong@qq.com'");
int result = tbStudentMapper.update(student, studentUpdateWrapper);
System.out.println(result);
}
/**
* 25. LambdaQueryWrapper使用方式
* FROM tb_student WHERE (age = ? AND name = ?)
*/
@Test
public void lambdaQueryWrappertest1() {
LambdaQueryWrapper<TbStudent> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(TbStudent::getAge, "88");
wrapper.eq(TbStudent::getName, "唐三藏");
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}
/**
* 26.ge le ge,between等比较方法
* WHERE (age BETWEEN ? AND ?)
*/
@Test
public void lambdaQueryWrappertest2() {
LambdaQueryWrapper<TbStudent> wrapper = new LambdaQueryWrapper<>();
wrapper.between(TbStudent::getAge, 23, 88);
List<TbStudent> students = tbStudentMapper.selectList(wrapper);
students.forEach(System.out::println);
}

文章转载自程序员恰恰,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




