ORM(object relational mapping)框架的作用是將程序中的對象與資料庫中的關係型數據表之間建立映射關係,大大簡化了開發難度。lambdaQuery作為一款優秀的ORM框架,其最大的特點就是簡單易用,支持鏈式調用,讓編程更加優雅。下面我們將從幾個方面來闡述lambdaQuery的特點和優勢。
一、lambdaQuery()
lambdaQuery()是lambdaQuery框架的入口方法,用於開啟一個查詢。lambdaQuery()方法返回一個Query對象,通過鏈式調用可以簡單方便地構造查詢條件。
List<User> list = lambdaQuery(User.class)
.eq(User::getUserName, "admin")
.ne(User::getStatus, 0)
.like(User::getRealName, "張三")
.list();
上述代碼演示了利用lambdaQuery()方法進行查詢的基本用法,首先指定查詢的實體類User,然後通過鏈式調用指定查詢條件,最後通過list()方法獲取查詢結果。
二、lambdaQuery if else
lambdaQuery支持類似Java流程式控制制語句的if-else條件判斷,可以根據不同的條件指定不同的查詢條件。
QueryWrapper<User> wrapper = lambdaQueryWrapper(User.class)
.eq(User::getUserName, "admin")
.eq(User::getStatus, 1)
.ifPresent(username, p -> p.like(User::getRealName, "%張三%"))
.ifPresent(status, p -> p.lt(User::getCreateTime, LocalDateTime.now()))
.ifPresent(StringUtils::isNotBlank, password, p -> p.like(User::getPassword, password));
List<User> list = wrapper.list();
在以上代碼中,利用QueryWrapper對象的ifPresent()方法實現了if-else條件判斷,當username不為空時,添加like(User::getRealName, “%張三%”)條件;當status不為空時,添加lt(User::getCreateTime, LocalDateTime.now())條件;當password不為空時,添加like(User::getPassword, password)條件。
三、lambdaQueryWrapper多表查詢
除了基本的單表查詢之外,lambdaQuery還支持多表查詢,可以根據不同的關聯關係構造查詢條件。
List<UserOrderVO> list = lambdaQueryWrapper(UserOrderVO.class)
.leftJoin(User.class, UserOrderVO::getUserId, User::getId)
.eq(User::getUserName, "admin")
.select(User::getId, UserOrderVO::getTotalPrice)
.groupBy(User::getId)
.list();
以上代碼演示了利用lambdaQueryWrapper對象進行多表聯合查詢的基本用法,通過leftJoin()方法指定左連接的表和關聯關係,然後通過鏈式調用指定查詢條件和查詢欄位,最後通過groupBy()指定分組條件。
四、lambdaQuery if else條件
與單表查詢類似,lambdaQueryWrapper對象也支持if-else條件判斷,根據不同的條件指定不同的查詢條件。
QueryWrapper<UserOrderVO> wrapper = lambdaQueryWrapper(UserOrderVO.class)
.eq(UserOrderVO::getStatus, 0)
.eq(UserOrderVO::getOrderType, 1)
.ifPresent(StringUtils::isNotBlank, userName, w -> w.like(User::getUserName, userName))
.ifPresent(StringUtils::isNotBlank, realName, w -> w.like(User::getRealName, realName));
List<UserOrderVO> list = wrapper.list();
在以上代碼中,利用QueryWrapper對象的ifPresent()方法實現了if-else條件判斷,當userName不為空時,添加like(User::getUserName, userName)條件;當realName不為空時,添加like(User::getRealName, realName)條件。
五、lambdaQueryWrapper查詢指定欄位
在實際開發中,有時候我們並不需要查詢表中所有的欄位,這時候可以利用lambdaQueryWrapper的select()方法指定查詢的欄位。
List<UserVO> list = lambdaQueryWrapper(User.class)
.eq(User::getUserName, "admin")
.select(User::getRealName, User::getPhone)
.listAs(UserVO.class);
在以上代碼中,通過select()方法指定查詢的欄位,只查詢了User表中的realName和phone欄位,最後通過listAs()方法指定返回類型為UserVO,即只返回實體類中指定的欄位。
六、lambdaQueryWrapper方法
除了上述方法外,lambdaQueryWrapper還提供了一些常用的方法,如orderBy()、likeLeft()、likeRight()等。
List<User> list = lambdaQueryWrapper(User.class)
.ne(User::getStatus, 0)
.orderByDesc(User::getCreateTime)
.likeLeft(User::getRealName, "張")
.list();
在以上代碼中,通過orderByDesc()方法指定查詢結果按createTime降序排列,通過likeLeft()方法指定查詢realName以「張」開頭的記錄。
七、lambdaQuery trim
在SQL語句中,有時候會出現多餘的空格和換行符,這樣會導致SQL語句的可讀性下降,影響代碼的維護性。lambdaQuery提供了trim()方法,可去掉SQL語句中的前綴、後綴和多餘的空格和換行符。
String sql = lambdaQueryWrapper(User.class)
.select(User::getId, User::getUserName)
.eq(User::getStatus, 1)
.eq(User::getGender, 1)
.orderByAsc(User::getCreateTime)
.trim()
.getSql();
在以上代碼中,利用lambdaQueryWrapper對象的getSql()方法獲取查詢的SQL語句,然後通過trim()方法去除SQL語句中的多餘空格和換行符。
八、lambdaQueryWrapper查詢空字元
在查詢時,可能需要查詢某個欄位為空的記錄,lambdaQueryWrapper提供了isNull()和isNotNull()方法,用於查詢空值和非空值。
List<User> list = lambdaQueryWrapper(User.class)
.isNull(User::getRealName)
.list();
在以上代碼中,通過isNull()方法查詢realName欄位為空的記錄。
總結
本文從lambdaQuery()、lambdaquery if else、lambdaquerywrapper多表查詢、lambdaquery if else條件、lambdaquerywrapper查詢指定欄位、lambdaquerywrapper方法、lambdaquery trim、lambdaQueryWrapper查詢空字元等多個方面詳細闡述了lambdaQuery框架的特點和優勢,其簡單易用、支持鏈式調用等特點讓開發更加高效、優雅。感興趣的讀者可以去GitHub上查看其源碼,學習更多高級用法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/295679.html