mybatis-plus深入学习篇(三)
1 准备工作
1.1 建表sql语句(Emp表)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`EMPNO` int NOT NULL AUTO_INCREMENT,
`ENAME` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`JOB` varchar(9) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`MGR` double NULL DEFAULT NULL,
`HIREDATE` date NULL DEFAULT NULL,
`SAL` double NULL DEFAULT NULL,
`COMM` double NULL DEFAULT NULL,
`DEPTNO` int NULL DEFAULT NULL,
PRIMARY KEY (`EMPNO`) USING BTREE,
INDEX `DEPTNO`(`DEPTNO`) USING BTREE,
CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 8900 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `emp` VALUES (7369, '老张123', 'CLERK', 7902, '1980-12-30', 1200, 0, 20);
INSERT INTO `emp` VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1700, 1200, 30);
INSERT INTO `emp` VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
INSERT INTO `emp` VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 3975, NULL, 20);
INSERT INTO `emp` VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
INSERT INTO `emp` VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, NULL, 30);
INSERT INTO `emp` VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, NULL, 10);
INSERT INTO `emp` VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-07-13', 4000, NULL, 20);
INSERT INTO `emp` VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO `emp` VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
INSERT INTO `emp` VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-07-13', 2100, NULL, 20);
INSERT INTO `emp` VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, NULL, 30);
INSERT INTO `emp` VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 4000, NULL, 20);
INSERT INTO `emp` VALUES (8896, '小明', 'MANAGER', 7698, '2023-01-02', 6666, 800, 10);
INSERT INTO `emp` VALUES (8897, '小红', 'SALESMAN', 7698, '2023-02-08', 5000, 1000, 10);
INSERT INTO `emp` VALUES (8898, 'zhang1', 'SALESMAN', 7698, '2023-01-31', 1243, 234, 10);
INSERT INTO `emp` VALUES (8900, '雄安', 'MANAGER', 7698, '2023-02-05', 13, 123, 10);
SET FOREIGN_KEY_CHECKS = 1;
1.2 准备好测试环境
import com.zlz.ShiroStart2;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = ShiroStart2.class,webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class DemoTest {
}
2 使用UpdateWrapper实现修改功能
2.1 题目内容
//对用户名中含有z且(工资大于1000或者入职日期为2023-01-01)的用户信息进行修改,修改其津贴(comm)为888,并把部门编号改成20
2.2 对应的sql语句
UPDATE emp SET comm=888,deptno=20 WHERE (ename LIKE '%z%' AND (sal > 1000 OR hiredate = '2023-01-01'))
2.3 示例代码
@Test
public void a8(){
UpdateWrapper<Emp> updateWrapper= new UpdateWrapper<>();
updateWrapper.like("ename",'z' )
.and(i->i.gt("sal", 1000).or().eq("hiredate", "2023-01-01"));
updateWrapper.set("comm", 888).set("deptno", "20");
int update = empMapper.update(null, updateWrapper);
System.out.println("受影响行数为: "+update);
}
2.4 运行截图
2.4.1 实际执行的sql语句截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/95807f6d3e902fa802d62848b764156b.png#pic_center)
2.4.2 数据显示截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9e432dc10248f944e095ddc650b418a8.png#pic_center)
2.4.3 修改前数据库的数据
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/19a47385cd290d33ac4c31f80ff356ee.png#pic_center)
2.4.4 修改后数据库的数据
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/406dec9b48df553ab0270099cc770472.png#pic_center)
3 组装条件查询1(if判断的形式)
3.1 题目内容
//模拟在用户点击查询时的,对应的搜索关键字的情况
3.2 对应的sql语句
SELECT EMPNO,ename,job,mgr,hiredate,sal,comm,deptno FROM emp WHERE (sal >= 1000 AND sal <= 2000)
3.3 示例代码
@Test
public void a9(){
String ename="";
Integer salStart=1000;
Integer salEnd=2000;
QueryWrapper<Emp> empQueryWrapper = new QueryWrapper<>();
if(StringUtils.isNotBlank(ename)){
empQueryWrapper.like("ename",ename);
}
if (salStart != null) {
empQueryWrapper.ge("sal", salStart);
}
if (salEnd != null) {
empQueryWrapper.le("sal", salEnd);
}
List<Emp> emps = empMapper.selectList(empQueryWrapper);
emps.forEach(System.out::println);
}
3.4 运行截图
3.4.1 实际执行的sql语句截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1c59249d04d2432147abf97fc46a6de3.png#pic_center)
3.4.2 数据显示截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/84b28d1c3880b886e671f15bb85bdc70.png#pic_center)
4 组装条件查询2(使用condition)
4.1 题目内容
//模拟在用户点击查询时的,对应的搜索关键字的情况
4.2 对应的sql语句
SELECT EMPNO,ename,job,mgr,hiredate,sal,comm,deptno FROM emp WHERE (sal >= 1000 AND sal <= 2000)
4.3 示例代码
@Test
public void a10(){
String ename="";
Integer salStart=1000;
Integer salEnd=2000;
QueryWrapper<Emp> empQueryWrapper = new QueryWrapper<>();
empQueryWrapper.like(StringUtils.isNotBlank(ename),"ename", ename);
empQueryWrapper.ge(salStart != null,"sal", salStart);
empQueryWrapper.le(salEnd != null,"sal", salEnd);
List<Emp> emps = empMapper.selectList(empQueryWrapper);
emps.forEach(System.out::println);
}
4.4 运行截图
4.4.1 实际执行的sql语句截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1bdc122d1cfbb51b1781d84e51a1a91c.png#pic_center)
4.4.2 数据显示截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ac5a43f298e3c81033c4e76d248a20b0.png#pic_center)
5 使用LambdaQueryWrapper构造器
5.1 题目内容
//模拟在用户点击查询时的,对应的搜索关键字的情况
//查询工资为1000-2000范围内的员工信息
5.2 对应的sql语句
SELECT EMPNO,ename,job,mgr,hiredate,sal,comm,deptno FROM emp WHERE (sal >= 1000 AND sal <= 2000)
5.3 示例代码
@Test
public void a11(){
String ename="";
Integer salStart=1000;
Integer salEnd=2000;
LambdaQueryWrapper<Emp> qw= new LambdaQueryWrapper<>();
qw.like(StringUtils.isNotBlank(ename),Emp::getEname,ename)
.ge(salStart!=null, Emp::getSal, salStart)
.le(salEnd!=null, Emp::getSal, salEnd);
List<Emp> emps = empMapper.selectList(qw);
emps.forEach(System.out::println);
}
5.4 运行截图
5.4.1 实际执行的sql语句截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ddc81751b59c9392ff9acc11b71f871d.png#pic_center)
5.4.2 数据显示截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bb63e62f60bba553f5746c4a3acb8d8b.png#pic_center)
6 使用LambdaUpdateWrapper构造器
6.1 题目内容
//对用户名中含有z且(工资大于1000或者入职日期为2023-01-01)的用户信息进行修改,修改其津贴(comm)为1666,并把部门编号改成10
6.2 对应的sql语句
UPDATE emp SET comm=1600,deptno=10 WHERE (ename LIKE '%z%' AND (sal > 1000 OR hiredate = '2023-01-01'))
6.3 示例代码
@Test
public void a12(){
LambdaUpdateWrapper<Emp> updateWrapper= new LambdaUpdateWrapper<>();
updateWrapper.like(Emp::getEname,'z' )
.and(i->i.gt(Emp::getSal, 1000).or().eq(Emp::getHiredate, "2023-01-01"));
updateWrapper.set(Emp::getComm,1666).set(Emp::getDeptno, "10");
int update = empMapper.update(null, updateWrapper);
System.out.println("受影响行数为: "+update);
}
6.4 运行截图
6.4.1 实际执行的sql语句截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/538420bbb2b394fb1fc58ab0548ecf39.png#pic_center)
6.4.2 数据显示截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ba4ed06c24e7338dbca2c24145c07f9d.png#pic_center)
6.4.3 修改前数据库的数据
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dccedcf8819d2865f6899b9259ca045d.png#pic_center)
6.4.4 修改后数据库的数据
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a2851a2a1db4f3e4214e534d2bbdf337.png#pic_center)