MybatisPlus学习笔记(八)------通用servic
本章目录
- 基本方法
- 批量操作方法
- 链式调用方法
1. 基本方法
(1).新建MemberService接口文件继承MP提供的IService<T>接口。
public interface MemberService extends IService<Member> {
}
(2).新建MemberServiceImpl文件继承MP提供的ServiceImpl类并实现第一步创建的MemberService接口。
@Service
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
}
(3).新建controller类进行测试。
@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方法来演示,该方法就是获取查询数据中的第一条数据,第二个参数默认为true,为true时如果查询出的结果大于1一条程序会报错,这里的getOne方法与mapper中的getOne方法有些不同,当第二个参数为false时与mapper中的一样,当获取的数据大于等于一条时,只取第一条数据,控制台会有警告。
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);
}
image
注:上图中可以看到批量添加两条数据成功,批量操作方法返回的是布尔类型。
(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);
}
image
注:该方法是进行批量添加,如果查询到已存在的id则对该条数据进行更新操作。member为新对象会进行添加操作,member1设置的id是上个方法中添加成功的一条数据id,并设置了name与之前数据不同,这条数据则会进行更新操作,批量操作方法返回的是布尔类型。该方法默认是一次插入1000条,还有个两个参数的方法,可设置每次插入的条数。
3. 链式调用方法
MP提供的service链式调用方法很简单,代码如下:
@RequestMapping("/lambdaChain")
public Result lambdaChain() {
List<Member> memberList = memberService.lambdaQuery()
.eq(Member::getState, 1)
.like(Member::getSuperId, 1)
.list();
return ResultUtil.success(memberList);
}
注:查询方法使用lambdaQuery,通过链式调用设置注入的sql进行查询,通过调用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,通过链式调用设置注入的sql,再使用update()方法进行更新操作,返回的是布尔类型,当更新操作的影响行大于0时为true更新成功。
@RequestMapping("/lambdaChain2")
public Result lambdaChain2() {
boolean remove = memberService.lambdaUpdate()
.eq(Member::getName, "李莉2")
.remove();
return ResultUtil.success(remove);
}
注:lambdaUpdate方法中还有个remove删除方法,通过lambdaUpdate链式调用设置注入的sql后,再调用remove方法可实现删除操作,返回布尔类型true为删除成功。
==这里衍生一个问题:==
mybatisPlus为什么将批量操作写在service层?
官方回答是:因为sql长度有限制,海量数据量单条sql无法执行,就算可执行也容易引起内存泄漏、jdbc连接超时等,不同数据库对单条sql批量语法不一样,出于通用,现在的解决方案就是循环预处理,批量提交。虽然性能比单条sql慢,但可以解决以上问题。
本篇文章由一文多发平台ArtiPub自动发布