前言
本章主要介紹MyBatis-Plus的條件構(gòu)造器,條件構(gòu)造器是MyBatis-Plus的核心,可以使用面向?qū)ο蟮姆绞絹?lái)實(shí)現(xiàn)查詢,本文內(nèi)容涵蓋開(kāi)發(fā)的90%以上查詢場(chǎng)景,我們慢慢往下看
一、條件構(gòu)造器
1.1、官網(wǎng)的弊端
MyBatis-plus官網(wǎng) 一上來(lái)對(duì)條件構(gòu)造器的介紹比較模糊,看不懂,不信您看一下
并且下方的案例中也沒(méi)有創(chuàng)建WrApper對(duì)象的步驟,初學(xué)者在剛接觸時(shí)比較抽象,看完這篇文章之后再去看官網(wǎng)就會(huì)比較清晰了。
1.2、條件構(gòu)造器到底是什么
條件構(gòu)造器就是可以幫助我們使用面向?qū)ο蟮姆绞綄?shí)現(xiàn)數(shù)據(jù)庫(kù)操作的where條件,在MyBatis-Plus中將它封裝成了一個(gè)Wrapper對(duì)象,在使用時(shí)我們創(chuàng)建條件構(gòu)造器對(duì)象。Wrapper對(duì)象的體系的結(jié)構(gòu)大致如下:
其中 Wrapper 和 AbstractWrapper是兩個(gè)抽象類(lèi)不能直接實(shí)例化,我們?cè)谑褂脮r(shí)常用的具體實(shí)現(xiàn)是QueryWrapper 和 UpdateWrapper,看名字好像是QueryWapper是查詢時(shí)使用而UpdateWrapper是修改時(shí)使用,其實(shí)我在使用過(guò)程中無(wú)論修改還是查詢用的都是QueryWrapper。它們還是有些許不同的,并不是很重要本文就先不介紹了。反正直接用QueryWrapper就完事。
注意:如果您JDK1.8中的Lambda玩的比較溜,也可以使用 LambdaQueryWrapper 和 LambdaUpdateWrapper
二、代碼實(shí)現(xiàn)
在操作sql時(shí)條件包含 等于,不等于,大于,小于,區(qū)間,模糊查詢,limit等等,接下來(lái)我會(huì)演示一些常用的,基本上包含了工作中的99.99%場(chǎng)景。
2.1、創(chuàng)建構(gòu)造器語(yǔ)法
// 其中泛型填充要操作的Entity
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
2.2、ge、gt、le、lt、isNull、isNotNull
@Test
public void testDelete() {
// 創(chuàng)建QueryWrapper對(duì)象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 直接.即可其中isNull = where name IS NULL,查詢名字部位空的
queryWrapper
.isNull("name")
// 如果繼續(xù).說(shuō)明條件使用 AND 連接,ge為大于等于的意思sql為:and age >= 12
.ge("age", 12)
// isNotNull就和isNull相反啦
.isNotNull("email");
// 調(diào)用delete方法說(shuō)明要根據(jù)條件進(jìn)行數(shù)據(jù)刪除
int result = userMapper.delete(queryWrapper);
System.out.println("delete return count = " + result);
}
以上語(yǔ)法sql 如下
DELETE FROM tb_user WHERE name IS NULL AND age >= 12 AND email IS NOT NULL;
你品,你細(xì)品,很簡(jiǎn)單吧,其他的操作都一樣,無(wú)非就是不同的方法有不同的功能,這里您可以自己寫(xiě)一寫(xiě)思考一下,我繼續(xù)往下碼字。
2.3、eq、ne
- eq:相等
- ne:不相等
- selectOne:調(diào)用selecteOne是查詢一條數(shù)據(jù),如果根據(jù)該條件獲取到多條則會(huì)報(bào)錯(cuò)。
@Test
public void testSelectOne() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "Tom");
User user = userMapper.selectOne(queryWrapper);
System.out.println(user);
}
2.4、between、notBetween
根據(jù)邊界查詢,包含邊界大小
@Test
public void testSelectCount() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.between("age", 20, 30);
Long count = userMapper.selectCount(queryWrapper);
System.out.println(count);
}
2.5、allEq
傳入map,多個(gè)條件都必須成立,與無(wú)限eq效果相同
@Test
public void testSelectList() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String, Object> map = new HashMap<>();
map.put("id", 2);
map.put("name", "Jack");
map.put("age", 20);
queryWrapper.allEq(map);
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
// 等同于
@Test
public void testSelectList() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", 2).eq("name", "Jack").eq("age", 20);
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
2.6、like、notLike、likeLeft、likeRight
selectMaps返回Map集合列表,此處當(dāng)然也可以使用selectList()來(lái)返回List集合
@Test
public void testSelectMaps() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
.notLike("name", "e")
.likeRight("email", "t");
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
// 返回值是Map列表
maps.forEach(System.out::println);
}
2.7、in、notIn、inSql、notinSql、exists、notExists
這里可以通過(guò) inSql 來(lái)實(shí)現(xiàn)子查詢
@Test
public void testSelectObjs() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//queryWrapper.in("id", 1, 2, 3);
queryWrapper.inSql("id", "select id from user where id < 3");
List<Object> objects = userMapper.selectObjs(queryWrapper);
//返回值 是 Object 列表
objects.forEach(System.out::println);
}
2.8、or、and
注意:這里使用的是UpdateWrapper不調(diào)用or則默認(rèn)為使用and連,QueryWrapper也是同理
@Test
public void testUpdate1() {
//修改值
User user = new User();
user.setAge(99);
user.setName("Andy");
//修改條件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.or()
.between("age", 20, 30);
int result = userMapper.update(user, userUpdateWrapper);
System.out.println(result);
}
2.9、嵌套o(hù)r、嵌套and
這里使用了lambda表達(dá)式,or中的表達(dá)式最后翻譯成sql時(shí)會(huì)被加上圓括號(hào)
@Test
public void testUpdate2() {
//修改值
User user = new User();
user.setAge(99);
user.setName("Andy");
//修改條件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.or(i -> i.eq("name", " 李白 ").ne("age", 20));
int result = userMapper.update(user, userUpdateWrapper);
System.out.println(result);
}
2.10、orderBy、orderByDesc、orderByAsc
排序嘛
@Test
public void testSelectListOrderBy() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
2.11、last
直接拼接到sql的最后,MySQL中實(shí)現(xiàn)查詢指定條數(shù)數(shù)據(jù)時(shí)頻繁使用
注意:只能調(diào)用一次,多次調(diào)用以最后一次為準(zhǔn),有sql注入的風(fēng)險(xiǎn),請(qǐng)謹(jǐn)慎使用
@Test
public void testSelectListLast() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.last("limit 1");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
2.12、指定要查詢的列
@Test
public void testSelectListColumn() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "name", "age");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
2.13、set、setSql
這兩個(gè)是UpdateWrapper特有的,最終的sql會(huì)合并user.setAge(),以及userUpdateWrapper.set()和setSql()中的字段
@Test
public void testUpdateSet() {
//修改值
User user = new User();
user.setAge(99);
//修改條件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.set("name", " 老李頭 ")
// 除了可以查詢還可以使用set設(shè)置修改的字段
.setSql(" email = '[email protected]'");
// 可以有子查詢
int result = userMapper.update(user, userUpdateWrapper);
}
總結(jié)
以上就是本文介紹的MyBatis-Plus所有內(nèi)容,主要是條件構(gòu)造器的體系和使用,其中案例部分幾乎涵蓋了所有的應(yīng)用場(chǎng)景,大家可以根據(jù)具體的需求靈活組合,單表脫離xml文件豈不是爽。接下來(lái)還會(huì)繼續(xù)帶來(lái)MyBatis-Plus系列文章,敬請(qǐng)期待!






