https://blog.csdn.net/MinggeQingchun/article/details/126521908
https://blog.csdn.net/MinggeQingchun/article/details/126533536
https://blog.csdn.net/MinggeQingchun/article/details/126539292
条件构造器 Wrapper 就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最主要的就是最下面的四个子类:
QueryWrapper:用来删改查
UpdateWrapper:在修改操作时不必创建实体类对象的操作
LambdaQueryWrapper 和 LambdaUpdateWrapper 则是在字段参数的调用上进行了升级,其他都一样。因为增删改查中的增加记录不需要条件即可完成,所以增加方法无需条件构造器wrapper,其他的删改查则是有这个条件构造器参数的

AbstractWrapper:
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类
用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件
| 函数名(条件) | 说明 |
| allEq | 基于map的相等 |
| eq | 等于= |
| ne | 不等于> |
| gt | 大于> |
| ge | 大于等于>= |
| lt | 小于< |
| le | 小于等于<= |
| between | BETWEEN 值1AND值⒉ |
| notBetween | NOT BETWEEN 值1AND值2 |
| like | LIKE '%值%' |
| notlike | NOT LIKE'%值%' |
| likeLeft | LIKE '%值' |
| likeRight | LIKE '值%' |
| isNull | 字段IS NULL |
| isNotNull | 字段IS NOT NULL |
| in | 字段IN(value1, value2,...) |
| notIn | 字段NOT IN(value1, value2,...) |
| inSql | 字段IN ( sql语句) 例: inSql""age", "1,2,3")--->age in (1,2,3,4,5,6) 例: insql(" id" , "select id from table where id <3")--sidin (select id from table where id <3) |
| notInSql | 字段NOT IN ( sql语句) |
| groupBy | GROUP BY字段 |
| orderByAsc | 升序ORDER BY字段,...ASC |
| orderByDesc | 降序ORDER BY字段,... DESC |
| orderBy | 自定义字段排序 |
| having | 条件分组 |
| or | OR语句,拼接+OR字段=值 |
| and | AND语句,拼接+AND字段=值 |
| apply | 拼接sql |
| last | 在sql语句后拼接自定义条件 |
| exists | 拼接EXISTS ( sql语句) |
| notExists | 拼接NOT EXISTS ( sql语句) |
| nested | 正常嵌套不带AND或者OR |
- @Test
- public void testAllEq() {
- QueryWrapper
qw = new QueryWrapper<>(); - //组装条件
- Map
param = new HashMap<>(); - //map
key列名 , value:查询的值 - param.put("name", "张三");
- param.put("age", 22);
- param.put("status", null);
-
- qw.allEq(param);
- //调用MP自己的查询方法
- //SELECT id,name,age,email,status FROM student WHERE name = ? AND age = ?
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println(stu));
- }
-
- /**
- * 1、Map对象中有 key的value是null
- * 使用的是 qw.allEq(param,true);
- * 结果:WHERE name = ? AND age IS NULL
- *
- * 2、Map对象中有 key的value是null
- * qw.allEq(param,false);
- * 结果:WHERE name = ?
- *
- * 总结:
- * allEq(map,boolean)
- * true:处理null值,where 条件加入 字段 is null
- * false:忽略null ,不作为where 条件
- */
- @Test
- public void testAllEq1() {
- QueryWrapper
qw = new QueryWrapper<>(); - //组装条件
- Map
param = new HashMap<>(); - //map
key列名 , value:查询的值 - param.put("name", "张三");
- param.put("age", 22);
- param.put("status", null);
-
- qw.allEq(param,false);
- //调用MP自己的查询方法
- //SELECT id,name,age,email,status FROM student WHERE name = ? AND age = ?
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println(stu));
- }
- /**
- * eq 等于=
- * eq("列名",值)
- */
- @Test
- public void testEq() {
- QueryWrapper
qw = new QueryWrapper<>(); - //组成条件
- qw.eq("name", "李四");
- //WHERE name = ?
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println("查询eq:" + stu));
-
- }
- /**
- * ne 不等于 <>
- * ne("列名",值)
- */
- @Test
- public void testNe() {
- QueryWrapper
qw = new QueryWrapper<>(); - //组成条件
- qw.ne("name", "张三");
- // WHERE name <> ?
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println("查询ne:" + stu));
- }
- /**
- * gt 大于( > )
- */
- @Test
- public void testGt() {
- QueryWrapper
qw = new QueryWrapper<>(); - qw.gt("age", 30); //age > 30
- // WHERE age > ?
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println("stu:" + stu));
- }
- /**
- * ge 大于等于 ( >=)
- */
- @Test
- public void testGe() {
- QueryWrapper
qw = new QueryWrapper<>(); - qw.ge("age", 31);// >=31
- //WHERE age >= ?
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println("student:" + stu));
- }
- /**
- * lt 小于 <
- */
- @Test
- public void testLt() {
- QueryWrapper
qw = new QueryWrapper<>(); - qw.lt("age", 32);
- // WHERE age < ?
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println("student:" + stu));
- }
- /**
- * le 小于等于 <=
- */
- @Test
- public void testLe() {
- QueryWrapper
qw = new QueryWrapper<>(); - qw.le("age", 32);
- // WHERE age <= ?
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println("student:" + stu));
- }
- /**
- * between ( ? and ? )
- */
- @Test
- public void testBetween() {
- QueryWrapper
qw = new QueryWrapper<>(); - //between("列名",开始值,结束值)
- qw.between("age", 22, 28);
- // where age >= 12 and age < 28
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println(stu));
- }
- /**
- * notBetween(不在范围区间内)
- */
- @Test
- public void testNotBetween() {
- QueryWrapper
qw = new QueryWrapper<>(); - qw.notBetween("age", 18, 28);
- //WHERE age NOT BETWEEN ? AND ?
- // where age < 18 or age > 28
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println(stu));
- }
- /**
- * like 匹配某个值
- */
- @Test
- public void testLike() {
- QueryWrapper
qw = new QueryWrapper<>(); - qw.like("name", "张");
- // WHERE name LIKE %张%
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println(stu));
- }
- /**
- * notLike 不匹配某个值
- */
- @Test
- public void testNotLike() {
- QueryWrapper
qw = new QueryWrapper<>(); - qw.notLike("name", "张");
- // WHERE name NOT LIKE ? %张%
- List
students = studentMapper.selectList(qw); - students.forEach(stu -> System.out.println(stu));
- }
- /**
- * likeLeft "%值"
- */
- @Test
- public void testLikeLeft() {
- QueryWrapper
qw = new QueryWrapper<>(); - qw.likeLeft("name", "张");
- //WHERE name LIKE %张
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * likeRight "%值"
- */
- @Test
- public void testLikeRight() {
- QueryWrapper
qw = new QueryWrapper<>(); - qw.likeRight("name", "李");
- //WHERE name LIKE 李%
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * isNull , 判断字段是 null
- */
- @Test
- public void testIsNull(){
- QueryWrapper
qw = new QueryWrapper<>(); - //判断email is null
- //WHERE email IS NULL
- qw.isNull("email");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * isNotNull , 判断字段是 is not null
- */
- @Test
- public void testIsNotNull(){
- QueryWrapper
qw = new QueryWrapper<>(); - // WHERE email IS NOT NULL
- qw.isNotNull("email");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * in 值列表
- */
- @Test
- public void testIn(){
- QueryWrapper
qw = new QueryWrapper<>(); - //in(列名,多个值的列表)
- //WHERE name IN (?,?,?)
- qw.in("name","张三","李四","周丽");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
-
-
- /**
- * in 值列表
- */
- @Test
- public void testIn2(){
- QueryWrapper
qw = new QueryWrapper<>(); - List
- list.add(1);
- list.add(2);
- //WHERE status IN (?,?)
- qw.in("status",list);
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * notIn 不在值列表
- */
- @Test
- public void testNoIn(){
- QueryWrapper
qw = new QueryWrapper<>(); - //in(列名,多个值的列表)
- //WHERE name NOT IN (?,?,?)
- qw.notIn("name","张三","李四","周丽");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * inSql() : 使用子查询
- */
- @Test
- public void testInSQL(){
- QueryWrapper
qw = new QueryWrapper<>(); - //WHERE age IN (select age from student where id=1)
- qw.inSql("age","select age from student where id=1");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * notInSql() : 使用子查询
- */
- @Test
- public void testNotInSQL(){
- QueryWrapper
qw = new QueryWrapper<>(); - //WHERE age NOT IN (select age from student where id=1)
- qw.notInSql("age","select age from student where id=1");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * groupBy:分组
- */
- @Test
- public void testGroupby(){
- QueryWrapper
qw = new QueryWrapper<>(); - qw.select("name,count(*) personNumbers");//select name,count(*) personNumbers
- qw.groupBy("name");
- // SELECT name,count(*) personNumbers FROM student GROUP BY name
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * orderbyAsc : 按字段升序
- */
- @Test
- public void testOrderByAsc(){
- QueryWrapper
qw= new QueryWrapper<>(); - //FROM student ORDER BY name ASC , age ASC
- qw.orderByAsc("name","age");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * orderbyDesc : 按字段降序
- */
- @Test
- public void testOrderByDesc(){
- QueryWrapper
qw= new QueryWrapper<>(); - // ORDER BY name DESC , id DESC
- qw.orderByDesc("name","id");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * order :指定字段和排序方向
- *
- * boolean condition : 条件内容是否加入到 sql语句的后面。
- * true:条件加入到sql语句
- * FROM student ORDER BY name ASC
- *
- * false:条件不加入到sql语句
- * FROM student
- */
- @Test
- public void testOrder(){
- QueryWrapper
qw = new QueryWrapper<>(); - qw.orderBy(true,true,"name")
- .orderBy(true,false,"age")
- .orderBy(true,false,"email");
- // name asc, age desc , email desc
- //FROM student ORDER BY name ASC , age DESC , email DESC
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * and ,or方法
- */
- @Test
- public void testOr(){
- QueryWrapper
qw= new QueryWrapper<>(); - //WHERE name = ? OR age = ?
- qw.eq("name","张三")
- .or()
- .eq("age",22);
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * last : 拼接sql语句到MP的sql语句的最后
- */
- @Test
- public void testLast(){
- QueryWrapper
qw = new QueryWrapper<>(); - //SELECT id,name,age,email,status FROM student WHERE name = ? OR age = ? limit 1
- qw.eq("name","张三")
- .or()
- .eq("age",22)
- .last("limit 1");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
- /**
- * exists : 判断条件
- *
- * notExists
- */
- @Test
- public void testExists(){
- QueryWrapper
qw= new QueryWrapper<>(); - //SELECT id,name,age,email,status FROM student
- // WHERE EXISTS (select id from student where age > 20)
- //qw.exists("select id from student where age > 90");
-
- //SELECT id,name,age,email,status FROM student WHERE
- // NOT EXISTS (select id from student where age > 90)
-
- qw.notExists("select id from student where age > 90");
- List
students = studentMapper.selectList(qw); - students.forEach(student -> System.out.println(student));
- }
1、配置分页,实现物理分页(默认内存分页)
- /**
- * @Configuration: 标注的类就相当于xml配置文件
- */
- @Configuration
- public class Config {
-
- /***
- * 定义方法,返回的返回值是java 对象,这个对象是放入到spring容器中
- * 使用@Bean修饰方法
- * @Bean 等同于
- */
- @Bean
- public PaginationInnerInterceptor paginationInnerInterceptor(){
- return new PaginationInnerInterceptor();
- }
- }
2、 测试
- /**
- * 分页:
- * 1.统计记录数,使用count(1)
- * SELECT COUNT(1) FROM student WHERE age > ?
- * 2.实现分页,在sql语句的末尾加入 limit 0,3
- * SELECT id,name,age,email,status FROM student WHERE age > ? LIMIT 0,3
- */
- @Test
- public void testPage(){
- QueryWrapper
qw = new QueryWrapper<>(); - qw.gt("age",22);
-
- IPage
page = new Page<>(); - //设置分页的数据
- page.setCurrent(1);//第一页
- page.setSize(3);// 每页的记录数
-
- IPage
result = studentMapper.selectPage(page,qw); -
- //获取分页后的记录
- List
students = result.getRecords(); - System.out.println("students.size()="+students.size());
-
- //分页的信息
- long pages = result.getPages();
- System.out.println("页数:"+pages);
- System.out.println("总记录数:"+result.getTotal());
- System.out.println("当前页码:"+result.getCurrent());
- System.out.println("每页的记录数:"+result.getSize());
- }
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率
1、添加依赖
-
-
- <dependency>
- <groupId>org.apache.velocitygroupId>
- <artifactId>velocity-engine-coreartifactId>
- <version>2.0version>
- dependency>
-
-
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-generatorartifactId>
- <version>3.3.0version>
- dependency>
2、自动生成类
- import com.baomidou.mybatisplus.annotation.IdType;
- import com.baomidou.mybatisplus.generator.AutoGenerator;
- import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
- import com.baomidou.mybatisplus.generator.config.GlobalConfig;
- import com.baomidou.mybatisplus.generator.config.PackageConfig;
- import com.baomidou.mybatisplus.generator.config.StrategyConfig;
- import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
-
- public class AutoMapper {
- public static void main(String[] args) {
- //创建AutoGenerator ,MP中对象
- AutoGenerator ag = new AutoGenerator();
-
- /**-------- 设置全局配置 --------*/
- GlobalConfig gc = new GlobalConfig();
- //设置代码的生成位置, 磁盘的目录
- String path = System.getProperty("user.dir");
- gc.setOutputDir(path+"/src/main/java");
- //设置生成的类的名称(命名规则)
- gc.setMapperName("%sMapper");//所有的Dao类都是Mapper结尾的,例如DeptMapper
- //设置Service接口的命名
- gc.setServiceName("%sService");//DeptService
- //设置Service实现类的名称
- gc.setServiceImplName("%sServiceImpl");//DeptServiceImpl
- //设置Controller类的命名
- gc.setControllerName("%sController");//DeptController
- //设置作者
- gc.setAuthor("ming");
- //设置主键id的配置
- gc.setIdType(IdType.ASSIGN_ID);
- ag.setGlobalConfig(gc);
-
- /**-------- 设置数据源DataSource --------*/
- DataSourceConfig ds = new DataSourceConfig();
- //驱动
- ds.setDriverName("com.mysql.cj.jdbc.Driver");
- //设置url
- ds.setUrl("jdbc:mysql://localhost:3306/mybatisplusdb");
- //设置数据库的用户名
- ds.setUsername("root");
- //设置密码
- ds.setPassword("admin123456");
- //把DataSourceConfig赋值给AutoGenerator
- ag.setDataSource(ds);
-
- /**-------- 设置Package信息 --------*/
- PackageConfig pc = new PackageConfig();
- //设置模块名称, 相当于包名, 在这个包的下面有 mapper, service, controller。
- pc.setModuleName("user");
- //设置父包名,order就在父包的下面生成
- pc.setParent("com.company"); //com.company.user
- ag.setPackageInfo(pc);
-
- /**-------- 设置策略 --------*/
- StrategyConfig sc = new StrategyConfig();
- sc.setNaming(NamingStrategy.underline_to_camel);
- //设置支持驼峰的命名规则
- sc.setColumnNaming(NamingStrategy.underline_to_camel);
- ag.setStrategy(sc);
-
- //执行代码的生成
- ag.execute();
- }
- }
可能会报错
mp 报错‘AutoGenerator ()‘ has private access in ‘com.baomidou.mybatisplus.generator.AutoGenerator‘
我用的 mybatis-plus-generator 依赖 是 3.5.0,我用的 mybatis-Plus 依赖版本是 3.5.1, 在网上查了下,应该就是版本问题,后来我把 mybatis-plus-generator 依赖 换成 3.3.0 即可
生成完成,且会自动打开生成文件所在文件夹
