MyBatis-Plus中最簡單的查詢操作教程(Lambda)
引言
MyBatis-Plus | 最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作
是對MyBatis-Plus的功能進行簡單介紹,雖然是介紹,也讓我們領略到他的優(yōu)雅與強大。你是不是已經被吸引了?別著急,上一節(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);
看一下測試結果(為了看好,我們轉成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();
}
第二步:寫分頁代碼(為了你能夠看得清楚,我截圖給你):

看結果(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));
對于這部分的測試,我想結果是毫無因為,那么你應該關注什么呢?沒錯,SQL,所以,我們直接看SQL。當然,結果也是可以看到的。
==> 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 = ?
這樣的話,我們就可以拼接各種條件了。那么問題來了:到底有哪些關鍵字呢?性能如何呢?
條件構造器
| 查詢方式 | 說明 |
|---|---|
| setSqlSelect | 設置 SELECT 查詢字段 |
| where | WHERE 語句,拼接 + WHERE 條件 |
| and | AND 語句,拼接 + AND 字段=值 |
| andNew | AND 語句,拼接 + AND (字段=值) |
| or | OR 語句,拼接 + OR 字段=值 |
| orNew | OR 語句,拼接 + OR (字段=值) |
| eq | 等于= |
| allEq | 基于 map 內容等于= |
| 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
如果官方提供的滿足不了你的需求,或者你的需求很復雜,導致你不知道如何使用條件構造器,那應該怎么辦呢?
很簡單。
第一步:找到 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] 官網測試例子:WrapperTest.java
總結
到此這篇關于MyBatis-Plus中最簡單的查詢操作的文章就介紹到這了,更多相關MyBatis-Plus查詢操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot集成Validation參數(shù)校驗
這篇文章主要為大家詳細介紹了SpringBoot集成Validation參數(shù)校驗,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
在SpringBoot中實現(xiàn)一個訂單號生成系統(tǒng)的示例代碼
在Spring Boot中設計一個訂單號生成系統(tǒng),主要考慮到生成的訂單號需要滿足的幾個要求:唯一性、可擴展性、以及可能的業(yè)務相關性,本文給大家介紹了幾種常見的解決方案及相應的示例代碼,需要的朋友可以參考下2024-02-02
深入解析Java的Hibernate框架中的一對一關聯(lián)映射
這篇文章主要介紹了Java的Hibernate框架的一對一關聯(lián)映射,包括對一對一外聯(lián)映射的講解,需要的朋友可以參考下2016-01-01

