一.IService开发复杂业务接口
不是所有的SQL语句都能够使用IService提供好的业务来实现操作的,有些业务需要我们自己去定义Service接口和Mapper接口进行功能实现。例如下面的需求:
这看起来是个简单修改功能,只要修改用户余额即可。但这个业务包含一些业务逻辑处理:
这些业务逻辑都要在service层来做,另外更新余额需要自定义SQL,要在mapper中来实现。因此,我们除了要编写controller以外,具体的业务还要在service和mapper中编写。
二.Controller层
首先在UserController中定义一个方法:
@PutMapping("{id}/deduction/{money}")
@ApiOperation("扣减用户余额")
public void deductBalance(@PathVariable("id") Long id, @PathVariable("money")Integer money){userService.deductBalance(id, money);
}
三.Service层
UserService接口:
package com.itheima.mp.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.mp.domain.po.User;public interface IUserService extends IService<User> {void deductBalance(Long id, Integer money);
}
UserServiceImpl实现类:
package com.itheima.mp.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Overridepublic void deductBalance(Long id, Integer money) {// 1.查询用户User user = getById(id);// 2.判断用户状态if (user == null || user.getStatus() == 2) {throw new RuntimeException("用户状态异常");}// 3.判断用户余额if (user.getBalance() < money) {throw new RuntimeException("用户余额不足");}// 4.扣减余额baseMapper.deductMoneyById(id, money);}
}
根据id查询用户可以使用IService定义好的方法。由于UserServiceImpl类本身就已经继承了ServiceImpl接口,而ServiceImpl接口则实现了IService接口,且IUserService接口继承了IService接口。因此可以直接使用IService中的getById进行用户查询。
查询好后判断用户状态和余额,这里我们使用的是反向判断。这样不用进行if语句的循环嵌套。
接着我们定义deductMoneyById方法进行余额扣减。将id和要扣减的余额传入。
四.Mapper层
@Update("UPDATE user SET balance = balance - #{money} WHERE id = #{id}")
void deductMoneyById(@Param("id") Long id, @Param("money") Integer money);
测试
新增

查询

总结:
我们在什么时候怎样使用mp提供IService接口和mapper方法,对于简单的增删改查方法,我们可以在controller里使用IService接口对象,调用mp提供的方法,无需写任何自定义的方法。只有在复杂需要的时候才自定义service。需要复杂sql语句时定义mapper来实现。