MyBatisPlus-IService接口

目录

  • 一、概述
  • 二、基本使用
  • 三、进阶使用
    • 3.1 lambdaQuery
    • 3.2 lambdaUpdate

一、概述

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 = ?)