1. 程式人生 > >MyBatis-Plus | 最簡單的查詢操作教程(Lambda)

MyBatis-Plus | 最簡單的查詢操作教程(Lambda)

引言

 

是對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));

測試:

自定義sql測試

封裝我們自己的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);
}

我們來試一下:

封裝service介面

哇!!!

是不是很爽!!!

資料

[1] MyBatis-Plus測試示例

[2] 官網測試例子:WrapperTest.java