美文网首页
MybatisPlus学习笔记(八)------通用servic

MybatisPlus学习笔记(八)------通用servic

作者: 夜一先生 | 来源:发表于2020-01-20 16:52 被阅读0次

    本章目录

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

    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自动发布

    相关文章

      网友评论

          本文标题:MybatisPlus学习笔记(八)------通用servic

          本文链接:https://www.haomeiwen.com/subject/gjgjzctx.html