MyBatis-Plus中最簡(jiǎn)單的查詢操作教程(Lambda)
引言
MyBatis-Plus | 最優(yōu)雅最簡(jiǎn)潔地完成數(shù)據(jù)庫(kù)操作
是對(duì)MyBatis-Plus的功能進(jìn)行簡(jiǎn)單介紹,雖然是介紹,也讓我們領(lǐng)略到他的優(yōu)雅與強(qiáng)大。你是不是已經(jīng)被吸引了?別著急,上一節(jié),我們算是參觀了MyBatis的風(fēng)景,這一節(jié),我將帶你領(lǐng)略他獨(dú)特的魅力。
Lambda
官方表示,3.x支持Lambda表達(dá)式,那應(yīng)該怎么使用呢?我們來看個(gè)例子:
QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(Student::getName, "馮文議"); List<Student> studentList = list(queryWrapper); for (Student student : studentList) Console.info(student);
看一下測(cè)試結(jié)果(為了看好,我們轉(zhuǎn)成json):
{
"id":1035789714459471874,
"name":"馮文議",
"age":26,
"info":"無畏造英雄",
"isDelete":false,
"createTime":"Sep 1, 2018 3:21:26 PM",
"updateTime":"Sep 1, 2018 3:21:26 PM",
"gender":"MALE",
"idcardId":1035789714388168706,
"cityId":1035762001753501698
}
如果你使用了我的配置,你也能看到相應(yīng)的SQL
==> Preparing: SELECT id,name,age,info,is_delete,create_time,update_time,gender,idcard_id,city_id FROM t_student WHERE name = ?
==> Parameters: 馮文議(String)
<== Columns: id, name, age, info, is_delete, create_time, update_time, gender, idcard_id, city_id
<== Row: 1035789714459471874, 馮文議, 26, <<BLOB>>, 0, 2018-09-01 15:21:26.0, 2018-09-01 15:21:26.0, 1, 1035789714388168706, 1035762001753501698
<== Total: 1
分頁(yè)查詢
感覺哈,分頁(yè)查詢是他們框架的起因,那我們先說分頁(yè)查詢。直接看代碼:
第一步:在 Application 中配置
/** * 分頁(yè)插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }
第二步:寫分頁(yè)代碼(為了你能夠看得清楚,我截圖給你):
看結(jié)果(json):
{
"records":[
{
"id":1035788325322752001,
"name":"1",
"age":1,
"info":"1",
"isDelete":false,
"createTime":"Sep 1, 2018 3:15:55 PM",
"updateTime":"Sep 1, 2018 3:15:55 PM",
"gender":"MALE",
"idcardId":1035788325276614657,
"cityId":1035788325201117185
},
{
"id":1035789714459471874,
"name":"馮文議",
"age":26,
"info":"無畏造英雄",
"isDelete":false,
"createTime":"Sep 1, 2018 3:21:26 PM",
"updateTime":"Sep 1, 2018 3:21:26 PM",
"gender":"MALE",
"idcardId":1035789714388168706,
"cityId":1035762001753501698
}
],
"total":2,
"size":2,
"current":1,
"optimizeCountSql":true
}
不要問我前端應(yīng)該怎么寫,表示我也不會(huì)寫。
條件查詢
終于要進(jìn)入這里了,是不是很激動(dòng)啊。別急,客官,抽根煙先,我們慢慢來。
【1】多eq
QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .eq(Student::getName, "馮文議") .eq(Student::getAge, 26); List<Student> studentList = list(queryWrapper); for (Student student : studentList) Console.info(new Gson().toJson(student));
對(duì)于這部分的測(cè)試,我想結(jié)果是毫無因?yàn)?,那么你?yīng)該關(guān)注什么呢?沒錯(cuò),SQL,所以,我們直接看SQL。當(dāng)然,結(jié)果也是可以看到的。
==> Preparing: SELECT id,name,age,info,is_delete,create_time,update_time,gender,idcard_id,city_id FROM t_student WHERE name = ? AND age = ?
==> Parameters: 馮文議(String), 26(Integer)
<== Columns: id, name, age, info, is_delete, create_time, update_time, gender, idcard_id, city_id
<== Row: 1035789714459471874, 馮文議, 26, <<BLOB>>, 0, 2018-09-01 15:21:26.0, 2018-09-01 15:21:26.0, 1, 1035789714388168706, 1035762001753501698
<== Total: 1
我們還可以這樣寫:
QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .and(obj -> obj.eq(Student::getName, "馮文議") .eq(Student::getAge, 26)); List<Student> studentList = list(queryWrapper); for (Student student : studentList) Console.info(new Gson().toJson(student));
【2】or
第一種:
QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .or(obj1 -> obj1.eq(Student::getName, "馮文議")) .or(obj2 -> obj2.eq(Student::getName, "1")); List<Student> studentList = list(queryWrapper); for (Student student : studentList) Console.info(new Gson().toJson(student));
sql:
SELECT * FROM t_student WHERE ( name = ? ) OR ( name = ? )
第二種:
QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .eq(Student::getName, "馮文議") .or() .eq(Student::getName, "1"); List<Student> studentList = list(queryWrapper); for (Student student : studentList) Console.info(new Gson().toJson(student));
SQL:
SELECT * FROM t_student WHERE name = ? OR name = ?
這樣的話,我們就可以拼接各種條件了。那么問題來了:到底有哪些關(guān)鍵字呢?性能如何呢?
條件構(gòu)造器
查詢方式 | 說明 |
---|---|
setSqlSelect | 設(shè)置 SELECT 查詢字段 |
where | WHERE 語句,拼接 + WHERE 條件 |
and | AND 語句,拼接 + AND 字段=值 |
andNew | AND 語句,拼接 + AND (字段=值) |
or | OR 語句,拼接 + OR 字段=值 |
orNew | OR 語句,拼接 + OR (字段=值) |
eq | 等于= |
allEq | 基于 map 內(nèi)容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查詢 LIKE |
notLike | 模糊查詢 NOT LIKE |
in | IN 查詢 |
notIn | NOT IN 查詢 |
isNull | NULL 值查詢 |
isNotNull | IS NOT NULL |
groupBy | 分組 GROUP BY |
having | HAVING 關(guān)鍵詞 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 條件語句 |
notExists | NOT EXISTS 條件語句 |
between | BETWEEN 條件語句 |
notBetween | NOT BETWEEN 條件語句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last(“LIMIT 1”) |
注意! xxNew 都是另起 ( ... )
括號(hào)包裹。
自定義sql
如果官方提供的滿足不了你的需求,或者你的需求很復(fù)雜,導(dǎo)致你不知道如何使用條件構(gòu)造器,那應(yīng)該怎么辦呢?
很簡(jiǎn)單。
第一步:找到 Dao,寫一個(gè)數(shù)據(jù)庫(kù)操作接口
public interface StudentDao extends BaseMapper<Student> { List<Student> selectAll(); }
第二步:在xml文件中寫sql
<!--List<Student> selectAll();--> <select id="selectAll" resultMap="BaseResultMap"> select * from t_student </select>
這樣我們就可以使用了:
@Resource StudentDao studentDao; List<Student> studentList = studentDao.selectAll(); for (Student student : studentList) Console.info(new Gson().toJson(student));
測(cè)試:
封裝我們自己的Service
前面我們就說了,我是很不喜歡MP的查詢接口的,我們就把他弄成我們喜歡的吧,我這里借鑒 JPA接口了,哈哈
interface:
/** * 查詢所有數(shù)據(jù) * @return List<Student> */ List<Student> findAll(); /** * 查詢部分?jǐn)?shù)據(jù) * @return List<Student> */ List<Student> findList(); /** * 查詢一條數(shù)據(jù) * @return Student */ Student findOne(); /** * 根據(jù)主鍵ID查詢數(shù)據(jù) * @param id 主鍵ID,為null,返回null * @return Student */ Student findById(Long id);
impl:
@Override public List<Student> findAll() { return list(null); } @Override public List<Student> findList() { return list(null); } @Override public Student findOne() { return getOne(null); } @Override public Student findById(Long id) { ExceptionUtil.notNull(id, "id must not null."); return getById(id); }
我們來試一下:
哇?。?!
是不是很爽!??!
資料
[2] 官網(wǎng)測(cè)試?yán)樱?a target="_blank">WrapperTest.java
總結(jié)
到此這篇關(guān)于MyBatis-Plus中最簡(jiǎn)單的查詢操作的文章就介紹到這了,更多相關(guān)MyBatis-Plus查詢操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot動(dòng)態(tài)加載Echarts柱狀圖
這篇文章主要為大家詳細(xì)介紹了springboot動(dòng)態(tài)加載Echarts柱狀圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12java實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)單鏈表示例(java單鏈表)
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)單鏈表示例,需要的朋友可以參考下2014-03-03springboot實(shí)現(xiàn)全局異常處理及自定義異常類
這篇文章主要介紹了springboot實(shí)現(xiàn)全局異常處理及自定義異常類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02springboot項(xiàng)目讀取resources目錄下的文件的9種方式
本文主要介紹了springboot項(xiàng)目讀取resources目錄下的文件的9種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04在controller中如何設(shè)置接收參數(shù)的默認(rèn)值
這篇文章主要介紹了在controller中如何設(shè)置接收參數(shù)的默認(rèn)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java數(shù)組常見應(yīng)用詳解【創(chuàng)建、遍歷、排序、查找】
這篇文章主要介紹了Java數(shù)組常見應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了java數(shù)組的基本定義、創(chuàng)建、遍歷、排序、查找等相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-02-02Java自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏
在實(shí)際開發(fā)中經(jīng)常會(huì)遇到有一些信息不能全部展示用戶,需要隱藏(可以叫脫敏),所以本文為大家分享了利用自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏的示例代碼,需要的可以參考下2023-07-07