Mybatis-plus動態(tài)條件查詢QueryWrapper的使用案例
一、queryWrapper介紹
queryWrapper是mybatis plus中實現(xiàn)查詢的對象封裝操作類,可以封裝sql對象,包括where條件,order by排序,select哪些字段等等,他的層級關(guān)系如下:
Wrapper:條件構(gòu)造抽象類,最頂端父類;
AbstractWrapper:用于查詢條件封裝,生成sql的where條件;
AbstractLambdaWrapper:Lambda語法使用Wrapper統(tǒng)一處理解析lambda獲取column。
LambdaQueryWrapper:用于lambda語法使用的查詢Wrapper;
LambdaUpdateWrapper:Lambda更新封裝Wrapper;
QueryWrapper:Entity對象封裝操作類,不是用lambda;
UpdateWrapper:Update條件封裝,用于Entity對象更新操作。
二、環(huán)境搭建
1.創(chuàng)建數(shù)據(jù)庫表并添加幾條數(shù)據(jù):
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 '創(chuàng)建時間', `update_time` datetime DEFAULT NULL COMMENT '更新時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='用戶表';
數(shù)據(jù)如下:
2.創(chuàng)建Springboot項目
創(chuàng)建Springboot項目,集成mybatis-plus、web、mysql等相關(guān)依賴;搭建基礎(chǔ)的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中這三者不能同時的出現(xiàn),避免版本的沖突,表示:跳進過這個坑--> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <!--mysql驅(qū)動--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- alibaba的druid數(shù)據(jù)庫連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.20</version> </dependency> <!-- alibaba的druid數(shù)據(jù)庫連接池 --> <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
# 服務(wù)端口 server: port: 8083 # 數(shù)據(jù)源配置 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 # 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一個連接在池中最小生存的時間,單位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻 filters: stat,wall # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 超過時間限制是否回收 removeAbandoned: true # 超時時間;單位為秒。180秒=3分鐘 removeAbandonedTimeout: 180 # 關(guān)閉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)創(chuàng)建一個實體類:
/** * @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; /** * 創(chuàng)建時間 */ @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> { }
三、queryWrapper示例
官網(wǎng)上可以看到有很多條件構(gòu)造器,下面將使用幾個常用的作為示例進行使用,其實本質(zhì)還是sql語句,如果想要打印sql日志,可以在application.yml文件中進行如下的配置:
mybatis-plus: #配置sql打印日志 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
Wrapper是一個接口,官方提供了很多的實現(xiàn)類,我們通過其實現(xiàn)類去構(gòu)造wrapper對象即可。
1.案例一:根據(jù)name模糊查看未刪除的用戶列表信息
過濾條件:
- name 用戶名稱 ,模糊查看
- del_flag = 0
- 按照create_time創(chuàng)建時間降序
sql實現(xiàn):
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實現(xiàn):
/** * 案例一:根據(jù)name模糊查看未刪除的用戶列表信息 * @param name * @return */ @RequestMapping("/list") public Map<String,Object> getList(@RequestParam String name){ Map<String,Object> result = new HashMap<>(); //構(gòu)建一個查詢的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //name不為空時,組裝模糊查詢條件 wrapper.like(StringUtils.isNotBlank(name),"name",name); //未刪除 wrapper.eq("del_flag",0); //創(chuàng)建時間降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
啟動項目,運行接口http://localhost:8083/user/list?name=小
測試,控制臺sql如下:
2.案例二:查看姓李的并且郵箱不為空的用戶列表
sql實現(xiàn):
select * from t_user where del_flag = 0 and name like concat('李','%') and email is not null order by create_time desc
queryWrapper實現(xiàn):
/** * 案例二:查看姓張的并且郵箱不為空的用戶列表 * @return */ @RequestMapping("/list2") public Map<String,Object> getList2(){ Map<String,Object> result = new HashMap<>(); //構(gòu)建一個查詢的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //姓張的 wrapper.likeRight("name","張"); //郵箱不為空 wrapper.isNotNull("email"); //未刪除 wrapper.eq("del_flag",0); //創(chuàng)建時間降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制臺結(jié)果:
3.案例三:年齡范圍查詢(20-30之間的)
sql實現(xiàn):
select * from t_user where del_flag=0 and age between 20 and 30 order by create_time desc
queryWrapper實現(xiàn):
/** * 案例三:年齡范圍查詢(20-30之間的) * @return */ @RequestMapping("/list3") public Map<String,Object> getList3(){ Map<String,Object> result = new HashMap<>(); //構(gòu)建一個查詢的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //年齡20-30之間的 wrapper.between("age",20,30); //未刪除 wrapper.eq("del_flag",0); //創(chuàng)建時間降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制臺結(jié)果:
4.案例四:根據(jù)createTime查看當日的用戶列表
sql實現(xiàn):
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實現(xiàn):
/** * 案例四:根據(jù)createTime查看當日的用戶列表 * @return */ @RequestMapping("/list4") public Map<String,Object> getList4(@RequestParam String createTime){ Map<String,Object> result = new HashMap<>(); //構(gòu)建一個查詢的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //查詢條件為創(chuàng)建時間 wrapper.apply(StringUtils.isNotBlank(createTime),"DATE(create_time) = STR_TO_DATE('"+createTime+"','%Y-%m-%d')"); //未刪除 wrapper.eq("del_flag",0); //創(chuàng)建時間降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制臺結(jié)果:
5.案例五:查看某個時間段內(nèi)的用戶列表
sql實現(xiàn):
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實現(xiàn):
/** * 案例五:查看某個時間段內(nèi)的用戶列表 * @return */ @RequestMapping("/list5") public Map<String,Object> getList5(@RequestParam String startTime,@RequestParam String endTime){ Map<String,Object> result = new HashMap<>(); //構(gòu)建一個查詢的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); //查詢條件為創(chuàng)建時間 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); //創(chuàng)建時間降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制臺結(jié)果:
6.案例六:查詢姓李的并且郵箱不為空或者是年齡大于16的用戶
sql實現(xiàn):
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實現(xiàn):and方法嵌套使用
/** * 案例六:查詢姓李的并且郵箱不為空或者是年齡大于16的用戶 * @return */ @RequestMapping("/list6") public Map<String,Object> getList6(){ Map<String,Object> result = new HashMap<>(); //構(gòu)建一個查詢的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); //創(chuàng)建時間降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制臺結(jié)果:
7.案例七:查詢id為1,2,3的用戶列表信息
sql實現(xiàn):
select * from t_user where del_flag=0 and id in(1,2,3) order by create_time desc
queryWrapper實現(xiàn):
/** * 案例七:根據(jù)ids查看用戶列表信息 * @return */ @RequestMapping("/list7") public Map<String,Object> getList7(@RequestParam String ids){ Map<String,Object> result = new HashMap<>(); //構(gòu)建一個查詢的wrapper QueryWrapper<User> wrapper = new QueryWrapper<User>(); if(StringUtils.isNotBlank(ids)){ //字符串轉(zhuǎn)數(shù)組再轉(zhuǎn)List Collection<String> collection = Arrays.asList(ids.split(",")); //in方法 wrapper.in(collection.size()>0,"id",collection); } //未刪除 wrapper.eq("del_flag",0); //創(chuàng)建時間降序 wrapper.orderByDesc("create_time"); List<User> list = userMapper.selectList(wrapper); result.put("data",list); return result; }
控制臺結(jié)果:
四、示例源碼
可點擊此處下載!
本文介紹就到這里了,感興趣的小伙伴可以自行測試哦。
總結(jié)
到此這篇關(guān)于Mybatis-plus動態(tài)條件查詢QueryWrapper使用的文章就介紹到這了,更多相關(guān)Mybatis-plus動態(tài)條件查詢QueryWrapper內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何使用Jetty實現(xiàn)嵌入式的Servlet容器
這篇文章主要介紹了Java使用Jetty實現(xiàn)嵌入式的Servlet容器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們來一起了解一下吧2019-06-06MybatisPlus為何可以不用@MapperScan詳解
這篇文章主要給大家介紹了關(guān)于MybatisPlus為何可以不用@MapperScan的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家學習或者使用MybatisPlus具有一定的參考學習價值,需要的朋友可以參考下2023-04-04RabbitMQ 3.9.7 鏡像模式集群與Springboot 2.5.5 整合
今天我們來聊聊 RabbitMQ 3.9.7 鏡像模式集群與Springboot 2.5.5 整合,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2021-10-10