java-queryWrapper條件

y_d_g發表於2024-04-09

QueryWrapper
1. eq、ne
2. gt、ge、lt、le
3. between、notBetween
4. like、notLike、likeLeft、likeRight
5. isNull、isNotNull
6. in、notIn
7. or、and
8. orderByAsc、orderByDesc
9. inSql、notInSql (不常用)
10. exists、notExists (不常用)
11 List (不常用)
12 group by 分組(不常用) having:分組之後的條件篩選
13 nested(不常用)

——————————————————————————————————————————————————————————————————————————————————————————————
avg 平均數
sum 求和
max min 最大值 最小值
count 統計記錄數

limit 獲取前3條資料 limit 0,3 下標從0開始

group by 分組
執行順序
from -> where -> group by -> having -> select ->order by

// 鏈式查詢 普通
QueryChainWrapper<T> query();
例子
List<UserBean> userBeanList = userService.query()
.eq("sex", "男")
.gt("salary", 7000)
.lt("age", 30).list(); (.list() .one() count() )
返回一個結果列表 返回一個結果 返回資料記錄數
——————————————————————————————————————————————————————————————————————————————————————————————
AbstractWrapper 條件構造器

allEq
例1: allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null
例2: allEq({id:1,name:"老王",age:null}, false)--->id = 1 and name = '老王'、 false 對應的 SQL 語句,忽略了 value 等於 null 的條件 忽略了 value 等於 null 的條件

——————————————————————————————————————————————————————————————————————————————————————————————
eq
等於 =
例: eq("name", "老王")--->name = '老王'

——————————————————————————————————————————————————————————————————————————————————————————————
gt
大於 >
例: gt("age", 18)--->age > 18
——————————————————————————————————————————————————————————————————————————————————————————————

ge
於 >=
例: ge("age", 18)--->age >= 18
——————————————————————————————————————————————————————————————————————————————————————————————

lt
小於 <
例: lt("age", 18)--->age < 18
——————————————————————————————————————————————————————————————————————————————————————————————
le
小於等於 <=
例: le("age", 18)--->age <= 18

——————————————————————————————————————————————————————————————————————————————————————————————
between notbetween(加了not 表示取反)
BETWEEN 值1 AND 值2
例: between("age", 18, 30)--->age between 18 and 30 包括18和30

——————————————————————————————————————————————————————————————————————————————————————————————
like (notLike取反)
LIKE '%值%'
例: like("name", "王")--->name like '%王%' 含有“王”的資料

likeLeft (notLikeLeft取反)
LIKE '%值'
例: likeLeft("name", "王")--->name like '%王' 以“王”結尾的資料

likeRight (notLikeRight 取反)
LIKE '值%'
例: likeRight("name", "王")--->name like '王%' //以“王”開頭的資料

——————————————————————————————————————————————————————————————————————————————————————————————
isNull (isNotNull取反) 如果欄位的值是空值,則滿足查詢條件,該記錄將被查詢出來。如果欄位的值不是空值,則不滿足查詢條件。
欄位 IS NULL
例: isNull("name")--->name is null

——————————————————————————————————————————————————————————————————————————————————————————————
in (notIn取反)查詢某個範圍內的資料
例: in("age", 1, 2, 3)--->age in (1,2,3) 例項:查詢 年齡 為 1,2,3 的使用者資訊
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.in("age", 1, 2, 3); // 等價 SQL 語句:user_id in(1, 2, 3)

SELECT * FROM user WHERE uid IN(1,2,'3',)
SELECT * FROM user WHERE (uid=2 OR aid=3 OR aid=5)

——————————————————————————————————————————————————————————————————————————————————————————————
inSql (notInSql 取反) 同上的意思一樣 之後可以帶上sql語句
欄位 IN ( sql語句 )
例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)

例項:查詢使用者 ID 小於 10 的使用者資訊列表,如下:
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.inSql("user_id", "select user_id from user where user_id<10");
——————————————————————————————————————————————————————————————————————————————————————————————
or 查詢資料

/**
* 查詢姓李的或者郵箱不為空並且是女性的員工
* sql:SELECT * FROM t_employee WHERE NAME LIKE '李%' OR (email IS NOT NULL AND gender ='女')
*/
@Test
public void selectByQueryWrapper4(){
QueryWrapper<Employee> queryWrapper=new QueryWrapper();
// QueryWrapper<Employee> queryWrapper2=Wrappers.<Employee>query();
queryWrapper.likeRight("name","李").or(wq->wq.isNotNull("email").eq("gender","女"));
List<Employee> employeeList = employeeMapper.selectList(queryWrapper);
System.out.println(employeeList);
}

——————————————————————————————————————————————————————————————————————————————————————————————

and 查詢資料


/**
* 查詢姓李的並且郵箱不為空或者是女性的員工
* sql:SELECT * FROM t_employee WHERE NAME LIKE '李%' AND (email IS NOT NULL OR gender ='女')
*/
@Test
public void selectByQueryWrapper5(){
QueryWrapper<Employee> queryWrapper=new QueryWrapper();
// QueryWrapper<Employee> queryWrapper2=Wrappers.<Employee>query();
queryWrapper.likeRight("name","李").and(wq->wq.isNotNull("email").or().eq("gender","女"));
List<Employee> employeeList = employeeMapper.selectList(queryWrapper);
System.out.println(employeeList);

—————————————————————————————————————————————————————————————————————————————————————————————
orderByAsc(實現遞增排序) orderByDesc(實現遞減排序)

例項:根據使用者 ID 和 年齡遞增(遞減) 排序。
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("user_id", "age"); 遞增
wrapper.orderByDesc("user_id", "age"); (遞減)

/**
* 查詢屬於編號1,2,3部門的並且薪水小於等於3500的員工 根據年齡從大到小排序顯示
* sql:SELECT * FROM t_employee WHERE salary<=3500 AND departmentId IN (1,2,3) ORDER BY birthday ASC
*/
@Test
public void selectByQueryWrapper6(){
QueryWrapper<Employee> queryWrapper=new QueryWrapper();
// QueryWrapper<Employee> queryWrapper2=Wrappers.<Employee>query();
queryWrapper.likeRight("name","李").and(wq->wq.isNotNull("email").or().eq("gender","女"));
List<Employee> employeeList = employeeMapper.selectList(queryWrapper);
System.out.println(employeeList);
}

——————————————————————————————————————————————————————————————————————————————————————————————

exists (notExists 取反) (拼接 EXISTS sql語句
例項:如果在 user_contact 中存在 user_id 等於 1 的記錄,則返回 user 表的所有記錄。如下
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.exists("select id from user_contact where user_id=1");

——————————————————————————————————————————————————————————————————————————————————————————————

last 追加一個 SQL , 直接指定的 SQL 拼接到 SQL 的最後, 函式只能呼叫一次
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.last("limit 10"); 固定寫法 一般只是為了獲取前幾條資料

——————————————————————————————————————————————————————————————————————————————————————————————

apply 拼接SQL 它可用於動態的給資料庫函式傳入參

例項:使用 apply 方法拼接 SQL 語句,如下:
// 拼接:id = 100
apply("id = 100")

needSyn.apply("rownum < {0}" , 200);

/**
* 查詢姓李的,並且出生日期範圍是1993-02-09到1994-04-09的員工
* sql:SELECT * FROM t_employee WHERE DATE_FORMAT(birthday,'%Y-%m-%d')>='1993-02-09' AND DATE_FORMAT(birthday,'%Y-%m-%d')<='1994-04-09' AND NAME LIKE '李%'
*/
@Test
public void selectByQueryWrapper3(){
QueryWrapper<Employee> queryWrapper=new QueryWrapper();
// QueryWrapper<Employee> queryWrapper2=Wrappers.<Employee>query();
0代表第一個引數, 1 代表第二引數
queryWrapper.apply("DATE_FORMAT(birthday,'%Y-%m-%d')>={0} and DATE_FORMAT(birthday,'%Y-%m-%d')<={1}","1993-02-09","1994-04-09").likeRight("name","李");
List<Employee> employeeList = employeeMapper.selectList(queryWrapper);
System.out.println(employeeList);

apply 函式將使用後面的“2020-10-08”引數替換第一個引數中的 {0}
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.apply("date_format(borthday,'%Y-%m-%d') = {0}", "2020-10-08");

——————————————————————————————————————————————————————————————————————————————————————————————
nested 巢狀SQL
例項:查詢所有姓黃,性別為男,年齡大於 30,薪水大於 9000 的使用者資訊,如下:

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.likeRight("name", "黃");
wrapper.nested(new Consumer<QueryWrapper<UserBean>>() {
@Override
public void accept(QueryWrapper<UserBean> userBeanQueryWrapper) {
userBeanQueryWrapper.eq("sex", "男")
.gt("age", 30).gt("salary", 9000);
}
});

——————————————————————————————————————————————————————————————————————————————————————————————
group by 分組

例項:使用者資訊表根據 sex 和 age 列進行分組,如下:
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.groupBy("sex", "age");

-- 統計按 sex 和 age 分組後,每一個 sex 和 age 組合的總薪水
SELECT sex, age, sum(salary) FROM user GROUP BY sex,age;

-- 統計同一個 sex 和 age 的使用者數
SELECT sex, age, count(*) FROM user GROUP BY sex,age;

-- 統計同一個 sex 和 age 的使用者平均薪水
SELECT sex, age, avg(salary) FROM user GROUP BY sex,age;

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.groupBy("sex", "age");
wrapper.select("sex, age, sum(salary");

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.groupBy("sex", "age");
wrapper.select("sex, age, count(*)");

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.groupBy("sex", "age");
wrapper.select("sex, age, avg(salary) ");

——————————————————————————————————————————————————————————————————————————————————————————————
-- 查詢 使用者的建立時間是在2023年
SELECT
u.*
from
ts_user u WHERE year(u.create_time) = 2023;

--偽列 :不存在的列 常量的類
--偽表 dual
SELECT 100*200 FROM DUAL;
SELECT now() FROM dual;

--null 的處理
--isXX : 返回值為布林型別
--方法返回值為boolean 建議命名為isXXX

select *from ts_user u WHERE u.avatat is NULL;
select *from ts_user u WHERE u.avatat is not NULL;
select *from ts_user u WHERE not u.avatat is NULL;

--獲取員工的年薪(工資+津貼)*12
--WHERE 1=1 --id =id
--SELECT e.ename ,(e.sal+ IFNULL(E.com,0)*12)from emp e WHERE 1=1;
--mysql 處理方式
--IFNULL(expr1,expr2) ;
--當第一個引數值為 null 取第二個引數為預設值

-- 平均工資大於2000的部門編號
-- SELECT avg(e.sal) FROM emp e WHEN e.deptno is not null
-- group by e.depton
-- HAVING avg(e.sal)>2000

-- or and not 或 與 非

--獲取使用者的姓名,角色名稱
SELECT * FROM ts_user;
SELECT* FROM sys_role;

--連表查詢
SELECT r.role_key ,u.id FROM ts_user u, sys_role r WHERE u.id = r.create_by

--99語法
--JOIN 加入
--獲取使用者的姓名,角色名稱

--內連結
SELECT r.role_key ,u.id FROM ts_user u JOIN sys_role r ON (u.id = r.create_by)
--using 兩張表中同時要有 id 這個欄位,只能使用等值連結
--SELECT r.role_key ,u.id FROM ts_user u JOIN sys_role r USING (id)

--左外連線 LEFT JOIN ts_user 為主表, sys_role 為輔助表 。 sys_role 中的欄位 拼接到 ts_user
SELECT r.role_key ,u.id FROM ts_user u LEFT JOIN sys_role r ON (u.id = r.create_by)

--右外連線 LEFT JOIN ts_user 為主表, sys_role 為輔助表 。 sys_role 中的欄位 拼接到 ts_user
SELECT r.role_key ,u.id FROM ts_user u RIGHT JOIN sys_role r ON (u.id = r.create_by)

-- --avg 平均數
SELECT AVG(lk.`status`) FROM ts_link lk;

-- ----sum 求和
SELECT SUM(lk.`status`) FROM ts_link lk;
-- ----max min 最大值 最小值
SELECT MAX(u.phone_number) FROM ts_user u;
SELECT MIN(lk.`status`) FROM ts_link lk;

-- -- count 統計記錄數
select count(*) from ts_user;
select count(u.id) from ts_user u;

相關文章