首頁 > 軟體

Mybatis Plus 中的LambdaQueryWrapper範例詳解

2022-03-17 10:00:13

前言

之前寫過 Mybatis Plus 的基本設定和使用。

Mybatis-Plus 看這一篇就夠了

當初在進行查詢時,雖然沒有寫硬SQL進行查詢資料庫操作,但是也不是太友好!

QueryWrapper

為什麼說不夠友好,客官大姥爺們先看一個例子,假設資料庫中,存在一個user表,表結構呢相對簡單,如下所示:

CREATE TABLE user1
(
	id BIGINT(20) NOT NULL COMMENT '主鍵ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年齡',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
	PRIMARY KEY (id)
);

在使用mybatis-plus查詢時,只需要編寫pojo類,關聯對映,如下所示:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "user1")
public class User1 implements Serializable {
    @TableId(value = "id")
    private Long id;
    @TableField(value = "name")
    private String userName;
    @TableField(value = "age")
    private Integer userAge;
    @TableField(value = "email")
    private String userEmail;
}

再編寫一個持久層的mapper介面:

import cn.linkpower.pojo.User1;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;

@Repository
public interface User1Mapper extends BaseMapper<User1> {
}

就能進行查詢操作,如下所示:

import cn.linkpower.mapper.User1Mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class LombokQueryTest {

    @Autowired
    private User1Mapper user1Mapper;

    @Test
    public void test(){
        QueryWrapper<User1> user1QueryWrapper = new QueryWrapper<>();
        user1QueryWrapper.eq("age",20);

        user1Mapper.selectOne(user1QueryWrapper);
    }
}

雖然很方便,但是這裡需要注意一個問題:

QueryWrapper中的eqin等操作,第一個引數往往是列名

【問題:】這裡就引申出一個問題:

如果實際開發中表結構經常改變,豈不是涉及到變動的列名相關程式碼都需要改!!!!

針對上面問題的出現,可以考慮使用LambdaQueryWrapper解決!

LambdaQueryWrapper

那麼現在就變更表的列名。

新建一個類似的表。

表結構如下所示:

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主鍵ID',
	user_name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	user_age INT(11) NULL DEFAULT NULL COMMENT '年齡',
	user_email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
	PRIMARY KEY (id)
);

INSERT INTO user (id, user_name, user_age, user_email) VALUE
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

依舊還是編寫pojo類,實現對映對應關係:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "user")
public class User2 implements Serializable {

    @TableId(value = "id")
    private Long id;

    @TableField(value = "user_name")
    private String userName;
    @TableField(value = "user_age")
    private Integer userAge;
    @TableField(value = "user_email")
    private String userEmail;
}

編寫一個持久層的介面:

import cn.linkpower.pojo.User2;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;

@Repository
public interface User2Mapper extends BaseMapper<User2> {
}

編寫測試類:

@Autowired
private User2Mapper user2Mapper;

@Test
public void test1(){
    LambdaQueryWrapper<User2> queryWrapper = new LambdaQueryWrapper();
    queryWrapper.eq(User2::getUserName,"Jack");
    User2 users = user2Mapper.selectOne(queryWrapper);
}

測試執行:

總結

從上面的QueryWrapperLambdaQueryWrapper,傳遞引數資訊很容易發現:

LambdaQueryWrapper的傳參支援User2::getUserName語法!

這麼做的好處就是:

當表結構發生改變時,如@TableField(value = "user_name") 更改為 @TableField(value = "name")只要類的成員變數別名不變,就不會影響到程式結果的獲取!

到此這篇關於Mybatis Plus 中的LambdaQueryWrapper的文章就介紹到這了,更多相關Mybatis Plus  LambdaQueryWrapper內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com