柚子快報(bào)邀請(qǐng)碼778899分享:MybatisPlus學(xué)習(xí)
柚子快報(bào)邀請(qǐng)碼778899分享:MybatisPlus學(xué)習(xí)
mybatis-plus官網(wǎng)
簡(jiǎn)介 | MyBatis-Plus (baomidou.com)
一? 快速入門
1? 創(chuàng)建項(xiàng)目
導(dǎo)入mysql驅(qū)動(dòng),這里先不做web
2? 導(dǎo)入依賴
我這里用的是springboot 3.3.0版本
注意: SpringBoot 3.0 需要 mybatis-spring 3.0.X 版本,否則會(huì)報(bào)如下錯(cuò)誤:
nvalid value type for attribute 'factoryBeanObjectType'‘': java.lang.String
這里有一個(gè)小坑
?3? 引入例子
package com.demo.learnmybatisplus.Pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
@Data
@Component
@AllArgsConstructor
@NoArgsConstructor
public class Users {
public int id;
private String username;
private String password;
}
數(shù)據(jù)庫(kù)的相應(yīng)信息
4? 編輯持久層
package com.demo.learnmybatisplus.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.learnmybatisplus.Pojo.Users;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper
}
5? 啟動(dòng)?。?! 添加測(cè)試
package com.demo.learnmybatisplus;
import com.demo.learnmybatisplus.Mapper.UserMapper;
import com.demo.learnmybatisplus.Pojo.Users;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class LearnMybatisPLusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void selectAll(){
List
System.out.println(users);
}
}
結(jié)果顯示
6? 坑?。?!
SpringBoot 3.0 需要 mybatis-spring 3.0.X 版本,如果沒(méi)導(dǎo)入,就會(huì)報(bào)錯(cuò)。當(dāng)時(shí)我找了好久,哪里沒(méi)加注解呢?!想不到是版本問(wèn)題
二? ?方便快捷的CRUD功能
全部的條件構(gòu)造器可以看這里
條件構(gòu)造器 | MyBatis-Plus (baomidou.com)
1? 簡(jiǎn)單介紹有哪些
2? 前五個(gè)操作,增刪改查以及查全部
package com.demo.learnmybatisplus;
import com.demo.learnmybatisplus.Mapper.UserMapper;
import com.demo.learnmybatisplus.Pojo.Users;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
@Slf4j
class LearnMybatisPLusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void selectAll(){
List
System.out.println(users);
}
@Test
public void TextInsert(){
Users users = new Users(2, "123456", "789789");
log.info("新增用戶:{}", users);
//傳入的是實(shí)體類books
userMapper.insert(users);
}
@Test
public void TextDelete(){
int id = 6;
userMapper.deleteById(id);
}
@Test
public void TextUpdate(){
Users users = new Users();
users.setId(4);
users.setPassword("12356789");
//根據(jù)id鎖定修改對(duì)象,其他值為修改值
userMapper.updateById(users);
}
@Test
public void TextSelectAll(){
List
}
}
3? 分頁(yè)查詢操作
分頁(yè)查詢需要一個(gè)專門的攔截器,來(lái)攔截sql語(yǔ)句,實(shí)現(xiàn)limit的添加
package com.demo.learnmybatisplus.Config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MpConfiguation {
@Bean
public MybatisPlusInterceptor pageInterceptor() {
//1 創(chuàng)建一個(gè)攔截器對(duì)象
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//2 在攔截器內(nèi)部加入小的分頁(yè)的攔截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
配置好攔截器之后,在測(cè)試類測(cè)試分頁(yè)查詢的代碼
@Test
public void TextPageSelect() {
//第一個(gè)參數(shù)代表查詢第幾頁(yè), 第二個(gè)代表每頁(yè)多少個(gè)參數(shù)
IPage page = new Page(2, 3);
userMapper.selectPage(page, null);
System.out.println("當(dāng)前頁(yè)碼:" + page.getCurrent());
System.out.println("每頁(yè)數(shù)據(jù)總量:" + page.getSize());
System.out.println("總頁(yè)數(shù):" + page.getPages());
System.out.println("數(shù)據(jù)總量:" + page.getTotal());
System.out.println("當(dāng)前頁(yè)數(shù)據(jù):" + page.getRecords());
}
開(kāi)啟sql詳細(xì)日志的輸出,來(lái)看看limit是怎么被加上去的。平時(shí)可以注釋掉,避免控制臺(tái)太多東西,在出錯(cuò)時(shí)可以打開(kāi)此配置來(lái)找錯(cuò)
#mybatis日志的輸出
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4? DQL條件查詢
一共四種方法,主要用第三種方法? 構(gòu)建條件查詢器
//條件查詢
@Test
public void TextSelect(){
//方式一 常規(guī)格式
QueryWrapper qw = new QueryWrapper();
qw.lt("id", 6);//id小于于6
qw.ge("id", 4);//id大于2
List
System.out.println(usersList);
// 方式二 lambda鏈?zhǔn)骄幊?/p>
QueryWrapper
qwU.lambda().lt(Users::getId, 6).ge(Users::getId,4);
List
System.out.println(usersListU);
//方式三 lambda的簡(jiǎn)化
LambdaQueryWrapper
lqw.lt(Users::getId, 6).ge(Users::getId,4);
List
System.out.println(usersListlqu);
//組合條件,上面的是and的條件,這個(gè)是or的條件
lqw.lt(Users::getId, 6).or().ge(Users::getId,4);
}
}
補(bǔ)充,對(duì)null的判斷
//條件查詢,對(duì)空的判斷
@Test
public void TextNull(){
LambdaQueryWrapper
Users user1 = new Users();
user1.setId(3);
//如果不為空,及前面的表達(dá)式為true,則條件生效
lqw.lt(user1 != null, Users::getId, 4);
}
5? 查詢投影
他主要有兩個(gè)功能,一個(gè)是查詢部分的信息。
另一個(gè)是可以使用函數(shù)等Users類里面沒(méi)有的信息。因?yàn)橹皩W(xué)到的查詢都是封裝到了實(shí)體類的中,本例是Users,所以他不能顯示Users里面mei
//條件查詢,查詢部分信息,以及使用函數(shù)等Users類里面沒(méi)有的信息
@Test
public void TextSelectPath(){
//查詢部分屬性
LambdaQueryWrapper
lqw.select(Users::getId);
lqw.lt(Users::getId, 6);
List
System.out.println(users);
//查詢函數(shù)以及其他User類沒(méi)有的值
/*
注意selectMaps和上面LambdaQueryWrapper查詢的selectList是不一樣的,
和之前的也是不一樣的
LambdaQueryWrapper不具有這個(gè)方法
這個(gè)方法有局限,并不是所有的函數(shù)都支持,
則需要時(shí)我們可以像mybatis一樣自己寫(xiě)@Select語(yǔ)句
*/
QueryWrapper
qw.select("count(*) as count, id");
qw.groupBy("id");
List
System.out.println(list);
//這就是自己定義的方法
List
System.out.println(listByMe);
}
UserMapper中自己定義的方法,這里有個(gè)sql規(guī)范,用了聚合函數(shù)與非聚合函數(shù)就要用分組,只用聚合函數(shù)就不用一定要分組
package com.demo.learnmybatisplus.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.learnmybatisplus.Pojo.Users;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
@Mapper
public interface UserMapper extends BaseMapper
@Select("select count(*), id from users group by id")
List
}
6? 映射配置兼容性
問(wèn)題一? : 實(shí)體類里面字段名字與數(shù)據(jù)庫(kù)不匹配
問(wèn)題二 :? 編碼中實(shí)體類添加了數(shù)據(jù)庫(kù)沒(méi)有的字段
問(wèn)題三 :? 查詢的權(quán)限擴(kuò)大,有些字段不希望被查詢到
問(wèn)題四:? 實(shí)體類名字與數(shù)據(jù)庫(kù)的表名字不一致
7? 邏輯刪除
情景:在實(shí)際業(yè)務(wù)中,我們刪除數(shù)據(jù)會(huì)對(duì)業(yè)務(wù)造成不可挽回的傷害,所以我們要采取另一種方式來(lái)實(shí)現(xiàn)刪除功能
這里的邏輯:mybatisplus會(huì)提供方法,在表格中添加一欄數(shù)據(jù)來(lái)標(biāo)記此數(shù)據(jù)是否被刪除,從而在其他過(guò)程中不在涉及該數(shù)據(jù)
步驟一 :在數(shù)據(jù)庫(kù)添加字段,這里添加了deleted字段
步驟二 : 在實(shí)體類添加字段,也是deleted
步驟三: 在yml文件內(nèi)讓spring能識(shí)別mybatisplus這個(gè)功能:在表格中添加一欄數(shù)據(jù)來(lái)標(biāo)記此數(shù)據(jù)是否被刪除,若識(shí)別為已經(jīng)刪除,則在其他過(guò)程中不再涉及該數(shù)據(jù)
測(cè)試一把,看看他是怎么實(shí)現(xiàn)的
當(dāng)我執(zhí)行delete方法時(shí)
他的輸出
他底層做的是一個(gè)更新操作,并不是真正的刪除
三? BaseMapper源碼
我們的mapper繼承了這個(gè),從中我們可以看到這個(gè)mybatisplus中到底有什么方法
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.exceptions.TooManyResultsException;
import org.apache.ibatis.session.ResultHandler;
public interface BaseMapper
int insert(T entity);
int deleteById(Serializable id);
int deleteById(T entity);
default int deleteByMap(Map
return this.delete((Wrapper)Wrappers.query().allEq(columnMap));
}
int delete(@Param("ew") Wrapper
int deleteBatchIds(@Param("coll") Collection> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper
default int update(@Param("ew") Wrapper
return this.update((Object)null, updateWrapper);
}
T selectById(Serializable id);
List
void selectBatchIds(@Param("coll") Collection extends Serializable> idList, ResultHandler
default List
return this.selectList((Wrapper)Wrappers.query().allEq(columnMap));
}
default void selectByMap(Map
this.selectList((Wrapper)Wrappers.query().allEq(columnMap), resultHandler);
}
default T selectOne(@Param("ew") Wrapper
return this.selectOne(queryWrapper, true);
}
default T selectOne(@Param("ew") Wrapper
List
int size = list.size();
if (size == 1) {
return list.get(0);
} else if (size > 1) {
if (throwEx) {
throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + size);
} else {
return list.get(0);
}
} else {
return null;
}
}
default boolean exists(Wrapper
Long count = this.selectCount(queryWrapper);
return null != count && count > 0L;
}
Long selectCount(@Param("ew") Wrapper
List
void selectList(@Param("ew") Wrapper
List
void selectList(IPage
List
void selectMaps(@Param("ew") Wrapper
List
void selectMaps(IPage extends Map
default
> P selectPage(P page, @Param("ew") Wrapper
page.setRecords(this.selectList(page, queryWrapper));
return page;
}
default
>> P selectMapsPage(P page, @Param("ew") Wrapper
page.setRecords(this.selectMaps(page, queryWrapper));
return page;
}
}
柚子快報(bào)邀請(qǐng)碼778899分享:MybatisPlus學(xué)習(xí)
精彩鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。