首頁 > 軟體

Mybatis-plus動態條件查詢QueryWrapper的使用案例

2022-07-18 14:04:57

一、queryWrapper介紹

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物件更新操作。

二、環境搭建

1.建立資料庫表並新增幾條資料:

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='使用者表';

資料如下:

2.建立Springboot專案

建立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> {
}

三、queryWrapper範例

官網上可以看到有很多條件構造器,下面將使用幾個常用的作為範例進行使用,其實本質還是sql語句,如果想要列印sql紀錄檔,可以在application.yml檔案中進行如下的設定:

mybatis-plus:
  #設定sql列印紀錄檔
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

Wrapper是一個介面,官方提供了很多的實現類,我們通過其實現類去構造wrapper物件即可。

1.案例一:根據name模糊檢視未刪除的使用者列表資訊

過濾條件:

  • name 使用者名稱稱 ,模糊檢視
  • del_flag = 0
  • 按照create_time建立時間降序

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如下:

2.案例二:檢視姓李的並且郵箱不為空的使用者列表

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;
    }

控制檯結果:

3.案例三:年齡範圍查詢(20-30之間的)

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;
    }

控制檯結果:

4.案例四:根據createTime檢視當日的使用者列表

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;
    }

控制檯結果:

5.案例五:檢視某個時間段內的使用者列表

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;
    }

控制檯結果:

6.案例六:查詢姓李的並且郵箱不為空或者是年齡大於16的使用者

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;
    }

控制檯結果:

7.案例七:查詢id為1,2,3的使用者列表資訊

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;
    }

控制檯結果:

四、範例原始碼

可點選此處下載!

本文介紹就到這裡了,感興趣的小夥伴可以自行測試哦。

總結

到此這篇關於Mybatis-plus動態條件查詢QueryWrapper使用的文章就介紹到這了,更多相關Mybatis-plus動態條件查詢QueryWrapper內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com