MyBatis-Plus | 最簡單的查詢操作教程(Lambda)
阿新 • • 發佈:2018-11-08
引言
是對MyBatis-Plus的功能進行簡單介紹,雖然是介紹,也讓我們領略到他的優雅與強大。你是不是已經被吸引了?彆著急,上一節,我們算是參觀了MyBatis的風景,這一節,我將帶你領略他獨特的魅力。
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,寫一個數據庫操作介面
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:
/**
* 查詢所有資料
* @return List<Student>
*/
List<Student> findAll();
/**
* 查詢部分資料
* @return List<Student>
*/
List<Student> findList();
/**
* 查詢一條資料
* @return Student
*/
Student findOne();
/**
* 根據主鍵ID查詢資料
* @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);
}
我們來試一下:
哇!!!
是不是很爽!!!
資料
[1] MyBatis-Plus測試示例
[2] 官網測試例子:WrapperTest.java