MyBatis-Plus中最簡單的查詢操作教程(Lambda)
引言
MyBatis-Plus | 最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作
是對MyBatis-Plus的功能進行簡單介紹,雖然是介紹,也讓我們領略到他的優(yōu)雅與強大。你是不是已經(jīng)被吸引了?別著急,上一節(jié),我們算是參觀了MyBatis的風景,這一節(jié),我將帶你領略他獨特的魅力。
Lambda
官方表示,3.x支持Lambda表達式,那應該怎么使用呢?我們來看個例子:
QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(Student::getName, "馮文議"); List<Student> studentList = list(queryWrapper); for (Student student : studentList) Console.info(student);
看一下測試結(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
}
如果你使用了我的配置,你也能看到相應的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
分頁查詢
感覺哈,分頁查詢是他們框架的起因,那我們先說分頁查詢。直接看代碼:
第一步:在 Application 中配置
/** * 分頁插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }
第二步:寫分頁代碼(為了你能夠看得清楚,我截圖給你):
看結(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
}
不要問我前端應該怎么寫,表示我也不會寫。
條件查詢
終于要進入這里了,是不是很激動啊。別急,客官,抽根煙先,我們慢慢來。
【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));
對于這部分的測試,我想結(jié)果是毫無因為,那么你應該關注什么呢?沒錯,SQL,所以,我們直接看SQL。當然,結(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 = ?
這樣的話,我們就可以拼接各種條件了。那么問題來了:到底有哪些關鍵字呢?性能如何呢?
條件構(gòu)造器
查詢方式 | 說明 |
---|---|
setSqlSelect | 設置 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 關鍵詞 |
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 都是另起 ( ... )
括號包裹。
自定義sql
如果官方提供的滿足不了你的需求,或者你的需求很復雜,導致你不知道如何使用條件構(gòu)造器,那應該怎么辦呢?
很簡單。
第一步:找到 Dao,寫一個數(shù)據(jù)庫操作接口
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));
測試:
封裝我們自己的Service
前面我們就說了,我是很不喜歡MP的查詢接口的,我們就把他弄成我們喜歡的吧,我這里借鑒 JPA接口了,哈哈
interface:
/** * 查詢所有數(shù)據(jù) * @return List<Student> */ List<Student> findAll(); /** * 查詢部分數(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); }
我們來試一下:
哇?。?!
是不是很爽?。。?/p>
資料
[1] MyBatis-Plus測試示例
[2] 官網(wǎng)測試例子:WrapperTest.java
總結(jié)
到此這篇關于MyBatis-Plus中最簡單的查詢操作的文章就介紹到這了,更多相關MyBatis-Plus查詢操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java實現(xiàn)數(shù)據(jù)結(jié)構(gòu)單鏈表示例(java單鏈表)
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)實現(xiàn)單鏈表示例,需要的朋友可以參考下2014-03-03springboot實現(xiàn)全局異常處理及自定義異常類
這篇文章主要介紹了springboot實現(xiàn)全局異常處理及自定義異常類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02springboot項目讀取resources目錄下的文件的9種方式
本文主要介紹了springboot項目讀取resources目錄下的文件的9種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04Java數(shù)組常見應用詳解【創(chuàng)建、遍歷、排序、查找】
這篇文章主要介紹了Java數(shù)組常見應用,結(jié)合實例形式詳細分析了java數(shù)組的基本定義、創(chuàng)建、遍歷、排序、查找等相關操作技巧與使用注意事項,需要的朋友可以參考下2020-02-02Java自定義注解實現(xiàn)數(shù)據(jù)脫敏
在實際開發(fā)中經(jīng)常會遇到有一些信息不能全部展示用戶,需要隱藏(可以叫脫敏),所以本文為大家分享了利用自定義注解實現(xiàn)數(shù)據(jù)脫敏的示例代碼,需要的可以參考下2023-07-07