本章目錄
- 基本方法
- 批量操作方法
- 鏈?zhǔn)秸{(diào)用方法
1. 基本方法
(1).新建MemberService接口文件繼承MP提供的IService<T>接口。
public interface MemberService extends IService<Member> {
}
(2).新建MemberServiceImpl文件繼承MP提供的ServiceImpl類并實(shí)現(xiàn)第一步創(chuàng)建的MemberService接口榄审。
@Service
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
}
(3).新建controller類進(jìn)行測(cè)試糠排。
@RestController
public class ServiceTestController {
@Autowired
private MemberService memberService;
@RequestMapping("/getOne")
public Result getOne() {
Member member = memberService.getOne(new QueryWrapper<Member>().like("state", 1), false);
return ResultUtil.success(member);
}
}
注:controller中使用@Autowired注入定義的MemberService接口,MP的通用service接口IService中也提供了許多方法疹鳄,這里以getOne方法來(lái)演示,該方法就是獲取查詢數(shù)據(jù)中的第一條數(shù)據(jù),第二個(gè)參數(shù)默認(rèn)為true叶沛,為true時(shí)如果查詢出的結(jié)果大于1一條程序會(huì)報(bào)錯(cuò),這里的getOne方法與mapper中的getOne方法有些不同忘朝,當(dāng)?shù)诙€(gè)參數(shù)為false時(shí)與mapper中的一樣灰署,當(dāng)獲取的數(shù)據(jù)大于等于一條時(shí),只取第一條數(shù)據(jù)局嘁,控制臺(tái)會(huì)有警告溉箕。
2. 批量操作方法
(1).saveBatch批量添加方法
@RequestMapping("/batch")
public Result batch() {
Member member = new Member();
member.setName("李莉");
member.setPassword("123131");
Member member1 = new Member();
member1.setName("李力");
member1.setPassword("123131");
List<Member> members = Arrays.asList(member, member1);
boolean saveBatch = memberService.saveBatch(members);
return ResultUtil.success(saveBatch);
}
注:上圖中可以看到批量添加兩條數(shù)據(jù)成功,批量操作方法返回的是布爾類型悦昵。
(2).saveOrUpdateBatch批量添加更新操作
@RequestMapping("/saveOrUpdateBatch")
public Result saveOrUpdateBatch() {
Member member = new Member();
member.setName("李莉1");
member.setPassword("123131");
Member member1 = new Member();
member1.setId(1216942918258937860L);
member1.setName("李莉2");
member1.setPassword("123167");
List<Member> members = Arrays.asList(member, member1);
boolean saveBatch = memberService.saveOrUpdateBatch(members);
return ResultUtil.success(saveBatch);
}
注:該方法是進(jìn)行批量添加肴茄,如果查詢到已存在的id則對(duì)該條數(shù)據(jù)進(jìn)行更新操作。member為新對(duì)象會(huì)進(jìn)行添加操作旱捧,member1設(shè)置的id是上個(gè)方法中添加成功的一條數(shù)據(jù)id独郎,并設(shè)置了name與之前數(shù)據(jù)不同踩麦,這條數(shù)據(jù)則會(huì)進(jìn)行更新操作,批量操作方法返回的是布爾類型氓癌。該方法默認(rèn)是一次插入1000條谓谦,還有個(gè)兩個(gè)參數(shù)的方法,可設(shè)置每次插入的條數(shù)贪婉。
3. 鏈?zhǔn)秸{(diào)用方法
MP提供的service鏈?zhǔn)秸{(diào)用方法很簡(jiǎn)單反粥,代碼如下:
@RequestMapping("/lambdaChain")
public Result lambdaChain() {
List<Member> memberList = memberService.lambdaQuery()
.eq(Member::getState, 1)
.like(Member::getSuperId, 1)
.list();
return ResultUtil.success(memberList);
}
注:查詢方法使用lambdaQuery,通過(guò)鏈?zhǔn)秸{(diào)用設(shè)置注入的sql進(jìn)行查詢疲迂,通過(guò)調(diào)用list()方法返回查詢集合才顿。
@RequestMapping("/lambdaChain1")
public Result lambdaChain1() {
boolean update = memberService.lambdaUpdate()
.eq(Member::getName, "李莉1")
.set(Member::getState, 1).set(Member::getSuperId, 1)
.set(Member::getCreateTime, LocalDateTime.now())
.update();
return ResultUtil.success(update);
}
注:更新方法使用lambdaUpdate,通過(guò)鏈?zhǔn)秸{(diào)用設(shè)置注入的sql尤蒿,再使用update()方法進(jìn)行更新操作郑气,返回的是布爾類型,當(dāng)更新操作的影響行大于0時(shí)為true更新成功腰池。
@RequestMapping("/lambdaChain2")
public Result lambdaChain2() {
boolean remove = memberService.lambdaUpdate()
.eq(Member::getName, "李莉2")
.remove();
return ResultUtil.success(remove);
}
注:lambdaUpdate方法中還有個(gè)remove刪除方法尾组,通過(guò)lambdaUpdate鏈?zhǔn)秸{(diào)用設(shè)置注入的sql后,再調(diào)用remove方法可實(shí)現(xiàn)刪除操作示弓,返回布爾類型true為刪除成功讳侨。
==這里衍生一個(gè)問(wèn)題:==
mybatisPlus為什么將批量操作寫(xiě)在service層?
官方回答是:因?yàn)閟ql長(zhǎng)度有限制奏属,海量數(shù)據(jù)量單條sql無(wú)法執(zhí)行跨跨,就算可執(zhí)行也容易引起內(nèi)存泄漏、jdbc連接超時(shí)等囱皿,不同數(shù)據(jù)庫(kù)對(duì)單條sql批量語(yǔ)法不一樣勇婴,出于通用,現(xiàn)在的解決方案就是循環(huán)預(yù)處理铆帽,批量提交咆耿。雖然性能比單條sql慢,但可以解決以上問(wèn)題爹橱。
本篇文章由一文多發(fā)平臺(tái)ArtiPub自動(dòng)發(fā)布