MybatisPlus基础篇学习笔记(八)------通用service

原创:兜里的猫

本章目录

  • 基本方法
  • 批量操作方法
  • 链式调用方法

1. 基本方法

(1).新建MemberService接口文件继承MP提供的IService接口。

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慢,但可以解决以上问题。

评论

兜里的猫 : 是md
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×