赞
踩
queryWrapper是mybatis plus中实现查询的对象封装操作类,可以封装sql对象,包括where条件,order by排序,select哪些字段等等,他的层级关系如下:
Wrapper:条件构造抽象类,最顶端父类;
AbstractWrapper:用于查询条件封装,生成sql的where条件;
AbstractLambdaWrapper:Lambda语法使用Wrapper统一处理解析lambda获取column。
LambdaQueryWrapper:用于lambda语法使用的查询Wrapper;
LambdaUpdateWrapper:Lambda更新封装Wrapper;
QueryWrapper:Entity对象封装操作类,不是用lambda;
UpdateWrapper:Update条件封装,用于Entity对象更新操作。
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`name` varchar(255) DEFAULT NULL COMMENT '用户姓名',
`age` int(2) DEFAULT NULL COMMENT '用户年龄',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
`del_flag` int(1) DEFAULT '0' COMMENT '删除标识 0:正常 1:删除 默认0',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='用户表';
数据如下:
创建Springboot项目,集成mybatis-plus、web、mysql等相关依赖;搭建基础的demo操作:
(1)pom.xml:
<!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!--mybatis-plus自动的维护了mybatis以及mybatis-spring的依赖, 在springboot中这三者不能同时的出现,避免版本的冲突,表示:跳进过这个坑--> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- alibaba的druid数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.20</version> </dependency> <!-- alibaba的druid数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.20</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--工具类--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
(2)配置application.yml
# 服务端口 server: port: 8083 # 数据源配置 spring: datasource: name: test url: jdbc:mysql://localhost:3306/db_order?&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSl=false username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource ## 配置连接池信息 ## 初始化大小,最小,最大 initialSize: 5 minIdle: 5 maxActive: 30 ## 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 超过时间限制是否回收 removeAbandoned: true # 超时时间;单位为秒。180秒=3分钟 removeAbandonedTimeout: 180 # 关闭abanded连接时输出错误日志 logAbandoned: true # mybatis-plus 默认扫描mapper.xml的目录 mybatis-plus: mapper-locations: classpath*:/mapper/*.xml #配置sql打印日志 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
(3)创建一个实体类:
/** * @author qzz */ @Data @TableName("t_user") public class User implements Serializable { private static final long serialVersionUID = 1L; /** * 用户id */ @TableId(value="id", type = IdType.AUTO) private Integer id; /** * 名称 */ @TableField("name") private String name; /** * 年龄 */ @TableField("age") private Integer age; /** * 删除标识 0:正常 1:删除 默认0 */ @TableField("del_flag") private Integer del_flag; /** * 邮箱 */ @TableField("email") private String email; /** * 创建时间 */ @TableField(value = "create_time", fill = FieldFill.INSERT) private Date create_time; /** * 修改时间 */ @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private Date update_time; }
(4)编写一个mapper接口,只需继承BaseMapper,基本的单表查询都给你封装好了。
/**
* @author qzz
*/
@Repository
public interface UserMapper extends BaseMapper<User> {
}
官网上可以看到有很多条件构造器,下面将使用几个常用的作为示例进行使用,其实本质还是sql语句,如果想要打印sql日志,可以在application.yml文件中进行如下的配置:
mybatis-plus:
#配置sql打印日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
Wrapper是一个接口,官方提供了很多的实现类,我们通过其实现类去构造wrapper对象即可。
过滤条件:
sql实现:
select * from t_user
where del_flag = 0
<if test ="name!=null and ''!=name">
and name like concat('%',#{name},'%')
</if>
order by create_time desc
queryWrapper实现:
/** * 案例一:根据name模糊查看未删除的用户列表信息 * @param name * @return */ @RequestMapping("/list") public Map<String,Object> getList(@RequestParam String name){ Map<String,Object> result = new HashMap<>(); //构建一个查询的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //name不为空时,组装模糊查询条件 wrapper.like(StringUtils.isNotBlank(name),"name",name); //未删除 wrapper.eq("del_flag",0); //创建时间降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
启动项目,运行接口http://localhost:8083/user/list?name=小
测试,控制台sql如下:
sql实现:
select * from t_user
where del_flag = 0
and name like concat('李','%')
and email is not null
order by create_time desc
queryWrapper实现:
/** * 案例二:查看姓张的并且邮箱不为空的用户列表 * @return */ @RequestMapping("/list2") public Map<String,Object> getList2(){ Map<String,Object> result = new HashMap<>(); //构建一个查询的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //姓张的 wrapper.likeRight("name","张"); //邮箱不为空 wrapper.isNotNull("email"); //未删除 wrapper.eq("del_flag",0); //创建时间降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制台结果:
sql实现:
select * from t_user
where del_flag=0
and age between 20 and 30
order by create_time desc
queryWrapper实现:
/** * 案例三:年龄范围查询(20-30之间的) * @return */ @RequestMapping("/list3") public Map<String,Object> getList3(){ Map<String,Object> result = new HashMap<>(); //构建一个查询的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //年龄20-30之间的 wrapper.between("age",20,30); //未删除 wrapper.eq("del_flag",0); //创建时间降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制台结果:
sql实现:
select * from t_user
where del_flag=0
and DATE(create_time) = STR_TO_DATE('2021-08-13','%Y-%m-%d')
order by create_time desc
queryWrapper实现:
/** * 案例四:根据createTime查看当日的用户列表 * @return */ @RequestMapping("/list4") public Map<String,Object> getList4(@RequestParam String createTime){ Map<String,Object> result = new HashMap<>(); //构建一个查询的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //查询条件为创建时间 wrapper.apply(StringUtils.isNotBlank(createTime),"DATE(create_time) = STR_TO_DATE('"+createTime+"','%Y-%m-%d')"); //未删除 wrapper.eq("del_flag",0); //创建时间降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制台结果:
sql实现:
select * from t_user
where del_flag=0
and DATE(create_time) >= STR_TO_DATE('2021-08-01','%Y-%m-%d')
AND DATE(create_time) <= STR_TO_DATE('2021-08-13','%Y-%m-%d')
order by create_time desc
queryWrapper实现:
/** * 案例五:查看某个时间段内的用户列表 * @return */ @RequestMapping("/list5") public Map<String,Object> getList5(@RequestParam String startTime,@RequestParam String endTime){ Map<String,Object> result = new HashMap<>(); //构建一个查询的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //查询条件为创建时间 wrapper.apply(StringUtils.isNotBlank(startTime),"DATE(create_time) >= STR_TO_DATE('"+startTime+"','%Y-%m-%d')"); wrapper.apply(StringUtils.isNotBlank(endTime),"DATE(create_time) <= STR_TO_DATE('"+endTime+"','%Y-%m-%d')"); //未删除 wrapper.eq("del_flag",0); //创建时间降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制台结果:
sql实现:
select * from t_user
where del_flag=0
and name like concat('李','%')
and (email is not null or age>16)
order by create_time desc
queryWrapper实现:
and方法嵌套使用
/** * 案例六:查询姓李的并且邮箱不为空或者是年龄大于16的用户 * @return */ @RequestMapping("/list6") public Map<String,Object> getList6(){ Map<String,Object> result = new HashMap<>(); //构建一个查询的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //and方法嵌套 wrapper.likeRight("name","李").and( userQueryWrapper -> userQueryWrapper.isNotNull("email") .or().lt("age",16) ); //未删除 wrapper.eq("del_flag",0); //创建时间降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制台结果:
sql实现:
select * from t_user
where del_flag=0
and id in(1,2,3)
order by create_time desc
queryWrapper实现:
/** * 案例七:根据ids查看用户列表信息 * @return */ @RequestMapping("/list7") public Map<String,Object> getList7(@RequestParam String ids){ Map<String,Object> result = new HashMap<>(); //构建一个查询的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); if(StringUtils.isNotBlank(ids)){ //字符串转数组再转List Collection<String> collection = Arrays.asList(ids.split(",")); //in方法 wrapper.in(collection.size()>0,"id",collection); } //未删除 wrapper.eq("del_flag",0); //创建时间降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制台结果:
可点击此处下载!
本文介绍就到这里了,感兴趣的小伙伴可以自行测试哦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。