文章目录
- 简介
- IService如何继承
- 基础业务完成
- 复杂业务逻辑
- 更简便的Lambda方法
- 批处理
简介
IService类似于我们的BaseMapper吧
现在就是Service层的那些简单的CRUD也不用写了
下面是方法图
IService如何继承
不同于Mapper可以直接基础BaseMapper接口不用实现
我们的serviceImpl是要实现ISercice里面的方法,我们肯定不想实现啊,所以提供了一个ServiceImpl类里面实现了IService的方法
UserService 继承 IService<com.mp.pojo.User>
UserServiceImpl 继承ServiceImpl<UserMapper,User> 实现UserService即可
而且ServiceImpl注入了baseMapper(baseMapper实际上就是UserMapper-多态嘛),所以子类(UserServiceImpl)就不用注入可以直接用
基础业务完成
说实话,感觉没啥好写的,类似我们继承BaseMapper的操作
简单操作可以直接在Controller完成(用IService方法),就不用再在service层写方法
这里用了hutool的beanutils,对应的方法见名知意
复杂业务逻辑
负责的逻辑不能直接通过Service的还是需要写Service的
Service(这里where不复杂不用自定义sql)
Mapper
更简便的Lambda方法
感觉和直接调用Basemapper.方法(LambdaQueryWarpper)差不多
就是多一个new warpper的过程
然后之前的那个方法就可以改一下
加个乐观锁
比如原来剩下200,a和b都是扣100要,a与b先后查到,a还没扣,b查到的也是剩100,减完,所以相当于-200的操作只-100,所以加个乐观锁,当有别的线程在自己查完但没操作时修改数据,就会放弃本次操作
批处理
分清
我们的insert into table_name value ()
insert into table_name values (),(),…
效率不同,以及我们后端和mysql是依靠网络请求来操作的
一次新增操作就会提交,提交相当于一次网络请求,一次一次分别提交很多网络请求性能很低
10w条数据三分钟
saveBatch()
相当于我们1000条语句先编译,然后一次提交1000条语句让mysql执行
这个其实还是执行insert into table_name value ()
就是一条条数据增加,其实mysql运行耗时没减少,减少的是网络请求的时间
最后运行了26s
想要
我们的insert into table_name value ()变成
insert into table_name values (),(),…
需要在JDBC加一个参数,在这个后面加就可以
rewriteBatchedStatement=true即可(重写批处理statement)