一、概述
MyBatisPlus中的IService接口提供了一种更加简洁、灵活和可扩展的方式来定义数据库操作方法,如果不使用MyBatisPlus不使用IService接口,Mapper层只继承BaseMapper可能会导致代码量增加、可维护性降低、可扩展性和灵活性下降等问题。
二、基本使用
自定义Service接口,继承IService接口,并指定泛型:
import com.baomidou.mybatisplus.extension.service.IService;
import com.ming.entity.User;
public interface IUserService extends IService<User> {
}
自定义Service的实现类,实现自定义接口,并且继承ServiceImpl类,第一个参数是对应的Mapper接口,第二个参数是对应的泛型:
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ming.Service.IUserService;
import com.ming.entity.User;
import com.ming.mapper.UserMapper;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
单元测试:
import com.ming.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@Slf4j
@SpringBootTest
class IUserServiceTest {
@Autowired
private IUserService userService;
/**
* 插入数据
*/
@Test
public void testSaveUser() {
User user = User.builder().name("汤姆").age(1000).gender(1).phone("18000000000").build();
userService.save(user);
}
/**
* 枚举【in】查询
*/
@Test
public void testQuery() {
List<User> users = userService.listByIds(List.of(1L, 2L, 3L));
log.info("查询结果:{}", users);
}
}
注意:这里使用的时候不是在调用Mapper层去查询数据,而是调用继承了
IService
接口的自定义接口查询
三、进阶使用
在ServiceImpl实现类中完成对数据库表的CRUD操作,可以用于编写动态SQL
3.1 lambdaQuery
测试类
@Test
void testLambdaQuery() {
User user = new User();
user.setUsername("十");
user.setBalance(10000);
List<User> userList = userService.queryVegueByUser(user);
userList.forEach(u->{
System.out.println(u);
});
}
Service接口
public interface IUserService extends IService<User> {
/**
* 根据复杂条件查询用户信息
* @param user
* @return
*/
List<User> queryVegueByUser(User user);
}
ServiceImpl实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
/**
* 根据复杂条件查询用户信息
*
* @param user
* @return
*/
@Override
public List<User> queryVegueByUser(User user) {
List<User> userList = lambdaQuery().like(user.getUsername() != null, User::getUsername, user.getUsername())
.eq(user.getBalance() != null, User::getBalance, user.getBalance()).list();
return userList;
}
}
3.2 lambdaUpdate
测试类
@Test
void testLambdaUpdate() {
User user = User.builder().id(1).username("张三").balance(100).build();
userService.updateUserById(user);
}
Service接口
public interface IUserService extends IService<User> {
/**
* 根据复杂条件修改用户信息
*
* @param user
*/
void updateUserById(User user);
}
ServiceImpl实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
/**
* 根据复杂条件修改用户信息
*
* @param user
*/
@Override
public void updateUserById(User user) {
lambdaUpdate()
.set(user.getUsername() != null, User::getUsername, user.getUsername())
.set(user.getBalance() != null, User::getBalance, user.getBalance())
.eq(User::getId, user.getId())
.update();
}
}
注意:执行修改语句的时候,最后一定要增加
update()
修改的方法才会执行。
上面的语句相当于:UPDATE user SET username=?,balance=? WHERE (id = ?)