Mybatis?Plus?中的LambdaQueryWrapper示例詳解
前言
之前寫(xiě)過(guò) Mybatis Plus 的基本配置和使用。
當(dāng)初在進(jìn)行查詢時(shí),雖然沒(méi)有寫(xiě)硬SQL進(jìn)行查詢數(shù)據(jù)庫(kù)操作,但是也不是太友好!
QueryWrapper
為什么說(shuō)不夠友好,客官大姥爺們先看一個(gè)例子,假設(shè)數(shù)據(jù)庫(kù)中,存在一個(gè)user表,表結(jié)構(gòu)呢相對(duì)簡(jiǎn)單,如下所示:
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查詢時(shí),只需要編寫(xiě)pojo類(lèi),關(guān)聯(lián)映射,如下所示:
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;
}再編寫(xiě)一個(gè)持久層的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> {
}
就能進(jìn)行查詢操作,如下所示:
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);
}
}

雖然很方便,但是這里需要注意一個(gè)問(wèn)題:

QueryWrapper中的eq、in等操作,第一個(gè)參數(shù)往往是列名!
【問(wèn)題:】這里就引申出一個(gè)問(wèn)題:
如果實(shí)際開(kāi)發(fā)中表結(jié)構(gòu)經(jīng)常改變,豈不是涉及到變動(dòng)的列名相關(guān)代碼都需要改?。。?!
針對(duì)上面問(wèn)題的出現(xiàn),可以考慮使用LambdaQueryWrapper解決!
LambdaQueryWrapper
那么現(xiàn)在就變更表的列名。
新建一個(gè)類(lèi)似的表。
表結(jié)構(gòu)如下所示:
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');
依舊還是編寫(xiě)pojo類(lèi),實(shí)現(xiàn)映射對(duì)應(yīng)關(guān)系:
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;
}
編寫(xiě)一個(gè)持久層的接口:
import cn.linkpower.pojo.User2;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface User2Mapper extends BaseMapper<User2> {
}
編寫(xiě)測(cè)試類(lèi):
@Autowired
private User2Mapper user2Mapper;
@Test
public void test1(){
LambdaQueryWrapper<User2> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(User2::getUserName,"Jack");
User2 users = user2Mapper.selectOne(queryWrapper);
}
測(cè)試運(yùn)行:

總結(jié)
從上面的QueryWrapper和LambdaQueryWrapper,傳遞參數(shù)信息很容易發(fā)現(xiàn):
LambdaQueryWrapper的傳參支持User2::getUserName語(yǔ)法!
這么做的好處就是:
當(dāng)表結(jié)構(gòu)發(fā)生改變時(shí),如
@TableField(value = "user_name")更改為@TableField(value = "name")只要類(lèi)的成員變量別名不變,就不會(huì)影響到程序結(jié)果的獲?。?/p>
到此這篇關(guān)于Mybatis Plus 中的LambdaQueryWrapper的文章就介紹到這了,更多相關(guān)Mybatis Plus LambdaQueryWrapper內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Java繼承中的轉(zhuǎn)型及其內(nèi)存分配
這篇文章主要介紹了淺談Java繼承中的轉(zhuǎn)型及其內(nèi)存分配,首先分享了簡(jiǎn)單的代碼及運(yùn)行結(jié)果,然后對(duì)其進(jìn)行分析,繼而引出了2017-11-11
java全角、半角字符的關(guān)系以及轉(zhuǎn)換詳解
這篇文章主要介紹了2013-11-11
使用Java的Graphics類(lèi)進(jìn)行繪圖的方法詳解
這篇文章主要介紹了使用Java的Graphics類(lèi)進(jìn)行繪圖的方法,是Java的GUI編程的基礎(chǔ),需要的朋友可以參考下2015-10-10
Java線程之間數(shù)據(jù)傳遞的實(shí)現(xiàn)示例(4種)
我們經(jīng)常會(huì)遇到父子線程數(shù)據(jù)傳遞(非調(diào)用參數(shù))的場(chǎng)景,本文主要介紹了Java線程之間數(shù)據(jù)傳遞的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
idea?intellij快速修復(fù)if語(yǔ)句缺少大括號(hào)的問(wèn)題
這篇文章主要介紹了idea?intellij快速修復(fù)if語(yǔ)句缺少大括號(hào)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

