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。
/**
* 查询age为18的用户对象
*/
@Test
public void testGetOne(){
User user = userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getAge, 18), true);
System.out.println(user);
}
如果第二个参数为默认(默认即为true),则报错显示TooManyResultsException
如果将第二个参数改为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