Fork me on Gitee

MyBatis Plus IService应用

一、楔子

Mybatis Plus除了通用的Mapper之外,还提供了通用的Service层。这也减少了相对应的代码量,将通用的操作提取到公共代码中。

二、IService使用

service层需要继承IService,当然实现层也需要继承对应的实现类。

/**
 * 用户 服务类
 */
public interface UserService extends IService<User> {
}


/**
 * 用户服务实现类
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

  • SaveOrUpdateBatch()

批量新增或者修改方法,判断id是否存在,如果Id不存在执行新增,如果Id存在先执行查询语句,查询结果为空新增,否则修改

    @Test
    public void testSaveOrUpdateUser(){
        User user1 = new User();
        user1.setName("兔子");
        user1.setAge(18);

        User user2 = new User();
        user2.setId(110);
        user2.setName("乌龟");
        user2.setAge(20);

        List<User> users = Arrays.asList(user1, user2);
        boolean result = userService.saveOrUpdateBatch(users);
        System.out.println(result);
    }

观察执行计划

JDBC Connection [HikariProxyConnection@889885902 wrapping com.mysql.cj.jdbc.ConnectionImpl@7e00ed0f] will be managed by Spring
==>  Preparing: INSERT INTO t_user ( name, age ) VALUES ( ?, ? )
==> Parameters: 兔子(String), 18(Integer)
==>  Preparing: SELECT id,name,age,create_time,update_time,is_deleted FROM t_user WHERE id=?
==> Parameters: 110(Integer)
<==      Total: 0
==>  Preparing: INSERT INTO t_user ( name, age ) VALUES ( ?, ? )
==> Parameters: 乌龟(String), 20(Integer)
true

可以看到,user1由于未添加主键id。执行新增操作。use2由于添加了主键Id.先判断id是否在数据库表中存在,未查询到Id为110的记录。执行新增操作。

  • getOne()

这个方法返回的结果如果不止一条则会抛出异常,如果想默认取第一条结果,可以给这个方法传递第二个参数值为false。

image-20220824145856225

    /**
     * 查询age为18的用户对象
     */
    @Test
    public void testGetOne(){
        User user = userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getAge, 18), true);
        System.out.println(user);
    }

如果第二个参数为默认(默认即为true),则报错显示TooManyResultsException

image-20220824150107699

如果将第二个参数改为false,则取出符合条件的第一个对象信息。

    /**
     * 查询age为18的用户对象
     */
    @Test
    public void testGetOne(){
        User user = userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getAge, 18), false);
        System.out.println(user);
    }
==>  Preparing: SELECT id,name,age,create_time,update_time,is_deleted FROM t_user WHERE (age = ?)
==> Parameters: 18(Integer)
<==    Columns: id, name, age, create_time, update_time, is_deleted
<==        Row: 1, 兔子, 18, null, null, null
<==        Row: 2, 乌龟, 18, null, null, null
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3ed03652]
2022-08-24 15:02:02.446  WARN 51276 --- [           main] c.h.quartz.service.impl.UserServiceImpl  : Warn: execute Method There are  2 results.
User(id=1, name=兔子, age=18, createTime=null, updateTime=null, is_deleted=null)

三、配合Lambda表达式

  • 查询
    @Test
    public void testLambdaQuery(){
        List<User> users = userService.lambdaQuery().eq(User::getAge, 18).list();
        users.forEach(System.out::println);
    }
==>  Preparing: SELECT id,name,age,create_time,update_time,is_deleted FROM t_user WHERE (age = ?)
==> Parameters: 18(Integer)
<==    Columns: id, name, age, create_time, update_time, is_deleted
<==        Row: 1, 兔子, 18, null, null, null
<==        Row: 2, 乌龟, 18, null, null, null
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7a34f66a]
User(id=1, name=兔子, age=18, createTime=null, updateTime=null, is_deleted=null)
User(id=2, name=乌龟, age=18, createTime=null, updateTime=null, is_deleted=null)
  • 修改
    /**
     * Lambda 更新
     */
    @Test
    public void testLambdaUpdate(){
        boolean result = userService.lambdaUpdate().eq(User::getAge, 18).set(User::getAge, 13).update();
        System.out.println(result);
    }
==>  Preparing: UPDATE t_user SET age=? WHERE (age = ?)
==> Parameters: 13(Integer), 18(Integer)
<==    Updates: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@21e20ad5]
true
  • 删除
   /**
     * Lambda 删除
     */
    @Test
    public void testDelete(){
        boolean result = userService.lambdaUpdate().eq(User::getAge, 13).remove();
        System.out.println(result);
    }
==>  Preparing: DELETE FROM t_user WHERE (age = ?)
==> Parameters: 13(Integer)
<==    Updates: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@69a2b3b6]
true
posted @ 2022-08-24 15:30  shine-rainbow  阅读(1217)  评论(0编辑  收藏  举报