前言
本章主要介紹MyBatis-Plus的條件構造器,條件構造器是MyBatis-Plus的核心,可以使用面向對象的方式來實現查詢,本文內容涵蓋開發的90%以上查詢場景,我們慢慢往下看
一、條件構造器
1.1、官網的弊端
MyBatis-plus官網 一上來對條件構造器的介紹比較模糊,看不懂,不信您看一下
并且下方的案例中也沒有創建WrApper對象的步驟,初學者在剛接觸時比較抽象,看完這篇文章之后再去看官網就會比較清晰了。
1.2、條件構造器到底是什么
條件構造器就是可以幫助我們使用面向對象的方式實現數據庫操作的where條件,在MyBatis-Plus中將它封裝成了一個Wrapper對象,在使用時我們創建條件構造器對象。Wrapper對象的體系的結構大致如下:
其中 Wrapper 和 AbstractWrapper是兩個抽象類不能直接實例化,我們在使用時常用的具體實現是QueryWrapper 和 UpdateWrapper,看名字好像是QueryWapper是查詢時使用而UpdateWrapper是修改時使用,其實我在使用過程中無論修改還是查詢用的都是QueryWrapper。它們還是有些許不同的,并不是很重要本文就先不介紹了。反正直接用QueryWrapper就完事。
注意:如果您JDK1.8中的Lambda玩的比較溜,也可以使用 LambdaQueryWrapper 和 LambdaUpdateWrapper
二、代碼實現
在操作sql時條件包含 等于,不等于,大于,小于,區間,模糊查詢,limit等等,接下來我會演示一些常用的,基本上包含了工作中的99.99%場景。
2.1、創建構造器語法
// 其中泛型填充要操作的Entity
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
2.2、ge、gt、le、lt、isNull、isNotNull
@Test
public void testDelete() {
// 創建QueryWrapper對象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 直接.即可其中isNull = where name IS NULL,查詢名字部位空的
queryWrapper
.isNull("name")
// 如果繼續.說明條件使用 AND 連接,ge為大于等于的意思sql為:and age >= 12
.ge("age", 12)
// isNotNull就和isNull相反啦
.isNotNull("email");
// 調用delete方法說明要根據條件進行數據刪除
int result = userMapper.delete(queryWrapper);
System.out.println("delete return count = " + result);
}
以上語法sql 如下
DELETE FROM tb_user WHERE name IS NULL AND age >= 12 AND email IS NOT NULL;
你品,你細品,很簡單吧,其他的操作都一樣,無非就是不同的方法有不同的功能,這里您可以自己寫一寫思考一下,我繼續往下碼字。
2.3、eq、ne
- eq:相等
- ne:不相等
- selectOne:調用selecteOne是查詢一條數據,如果根據該條件獲取到多條則會報錯。
@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
根據邊界查詢,包含邊界大小
@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,多個條件都必須成立,與無限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集合列表,此處當然也可以使用selectList()來返回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
這里可以通過 inSql 來實現子查詢
@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不調用or則默認為使用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、嵌套or、嵌套and
這里使用了lambda表達式,or中的表達式最后翻譯成sql時會被加上圓括號
@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中實現查詢指定條數數據時頻繁使用
注意:只能調用一次,多次調用以最后一次為準,有sql注入的風險,請謹慎使用
@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
這兩個是UpdateWrapper特有的,最終的sql會合并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設置修改的字段
.setSql(" email = '123@qq.com'");
// 可以有子查詢
int result = userMapper.update(user, userUpdateWrapper);
}
總結
以上就是本文介紹的MyBatis-Plus所有內容,主要是條件構造器的體系和使用,其中案例部分幾乎涵蓋了所有的應用場景,大家可以根據具體的需求靈活組合,單表脫離xml文件豈不是爽。接下來還會繼續帶來MyBatis-Plus系列文章,敬請期待!