MyBatis-Plus【通用Service篇】

时间:2024-10-19 10:44:40

MP-通用Service

  • 一、何为通用Service
  • 二、如何使用
    • 1、编写一个接口Service,继承IService接口
    • 2、编写一个实现类去实现接口并继承ServiceImpl类
  • 三、核心方法介绍
    • 1、Save 新增方法
    • 2、SaveOrUpdate 新增或修改方法
    • 3、Remove删除方法
    • 4、Update修改方法
    • 5、查询操作


一、何为通用Service

官方给出的解释:

通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
1、泛型 T 为任意实体对象
2、建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
3、对象 Wrapper 为 条件构造器

二、如何使用

1、编写一个接口Service,继承IService接口

public interface IUserService extends IService<User>{}

说明:泛型为要操作的实体表所对应的Java实体类

2、编写一个实现类去实现接口并继承ServiceImpl类

@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper , User> implements IUserService{}

三、核心方法介绍

1、Save 新增方法

// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);

参数说明:

类型 参数名 描述
T entity 实体对象
Collection entityList 实体对象集合
int batchSize 插入批次数量

案例演示:
1、save

@Test
	public void testSave() {
		long startTime = System.currentTimeMillis();
		iUserService.save(new User(16L,"veivy",22,"veivy@"));
		long endTime = System.currentTimeMillis();
		System.out.println("共计时:"+(endTime-startTime)+"毫秒");
	}

2、saveBatch

/**
	 * 批量新增
	 */
	@Test
	public void testSaveBatch() {
		List<User> list = new ArrayList<>();
		for (Long i = 0L; i < 10; i++) {
			User user = new User();
			user.setAge((int) (18+i));
			user.setId(6+i);
			user.setName("test"+i);
			user.setEmail("test"+i+"@");
			list.add(user);
		}
		long stratTime = System.currentTimeMillis();
		
		iUserService.saveBatch(list);
		
		long endTime = System.currentTimeMillis();
		
		System.out.println("共计消耗:"+(endTime-stratTime)+"毫秒");
	}

2、SaveOrUpdate 新增或修改方法

// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

参数说明:

类型 参数名 描述
T entity 实体对象
Wrapper updateWrapper 实体对象封装操作类 UpdateWrapper
Collection entityList 实体对象集合
int batchSize 插入批次数量

案例演示:
1、saveOrUpdate
该方法执行的流程是:先按照实体查询,如果查询的到记录,则修改,否则会新增

@Test
	public void TestSaveOrUpdateBatch() {
		List<User> list=  new ArrayList<>();
		User user1 = new User(13L,"admin",22,"allprimary@");
		list.add(user1);
		User user2 = new User(2L,"nacos",19,"fairy@");
		list.add(user2);
		User user3 = new User(9L,"lurra",34,"lurra@");
		list.add(user3);
		long startTime = System.currentTimeMillis();
		iUserService.saveOrUpdateBatch(list);
		long endTime = System.currentTimeMillis();
		System.out.println("批量修改共计时长"+(endTime-startTime)+"毫秒");
	}

3、Remove删除方法

// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);

参数说明:

类型 参数名 描述
Wrapper queryWrapper 实体包装类 QueryWrapper
Serializable id 主键 ID
Map<String, Object> columnMap 表字段 map 对象
Collection<? extends Serializable> idList 主键 ID 列表

案例演示:

@Test
	public void testRemove() {
		UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
		// DELETE FROM user WHERE (name = ? AND age = ?)
		Map<String, Object> maps = new HashMap<>();
		maps.put("name", "张三");
		maps.put("age", 21);
		updateWrapper.allEq(maps);
		iUserService.remove(updateWrapper);
	}
	
/**
	 * 根据id删除
	 */
	@Test
	public void testRemoveById() {
		boolean removeById = iUserService.removeById(15L);
	}

/**
	 * 根据map条件删除
	 */
	@Test
	public void testRemoveByMap() {
		// DELETE FROM user WHERE name = ? AND age = ?
		Map<String, Object> map = new HashMap<>();
		map.put("name", "lurra");
		map.put("age", 23);
		
		boolean removeById = iUserService.removeByMap(map);
	}

4、Update修改方法

// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);

参数说明:

类型 参数名 描述
Serializable id 主键 ID
Wrapper queryWrapper 实体对象封装操作类 QueryWrapper
boolean throwEx 有多个 result 是否抛出异常
T entity 实体对象
Function<? super Object, V> mapper 转换函数

案例演示:

@Test
	public void testUpdate() {
		User user = new User();
		user.setAge(18);
		
		User user2 = new User(13L,"lilei",35,"lilei@");
		UpdateWrapper<User> wrapper = new UpdateWrapper<>(user);
		
		iUserService.update(user2,wrapper);
	}

5、查询操作

/**
	 * 查询数据库的数据条数 SELECT COUNT( * ) FROM user
	 */
	@Test
	public void testCount() {
		long count = iUserService.count();
		System.out.println(count);
	}
	
	/**
	 * 查询数据库的数据条数 SELECT COUNT( * ) FROM user
	 */
	@Test
	public void testQueryList() {
		List<User> list = iUserService.list();
		list.forEach(System.out::println);
	}
	
	/**
	 * 查询数据库的所有数据 SELECT id,name,age,email FROM user
	 */
	@Test
	public void testQueryList2() {
		List<User> count = iUserService.list();
		count.forEach(System.out::println);
	}
	
	/**
	 * 查询数据库的所有数据 SELECT id,name,age,email FROM user
	 */
	@Test
	public void testQueryList3() {
		QueryWrapper queryWrapper = new QueryWrapper<User>();
		Map<String, Object> map = new HashMap<>();
		map.put("name", "lurra");
		map.put("age", 34);
		queryWrapper.allEq(map);
		List<User> listObjs = iUserService.listObjs(queryWrapper);
		System.out.println(listObjs);
		System.out.println();
	}
	
	/**
	 * 查询分页数据
	 */
	@Test
	public void testSelectPage() {
	    //创建条件构造器
	    QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
	    queryWrapper.ge("age",15);// 大于等于15岁的
	    //创建分页对象
	    Page<User> page = new Page<User>(2,5);
	    //分页查询
	    IPage<User> iPage = iUserService.page(page,queryWrapper);
	    System.out.println("当前页码:" + iPage.getCurrent());
	    System.out.println("每页显示数量:" + iPage.getSize());
	    System.out.println("总记录数:" + iPage.getTotal());
	    System.out.println("总页数:" + iPage.getPages());
	    List<User> usersList = iPage.getRecords();//员工数据集合
	    for (User user : usersList) {
	        System.out.println(user);
	    }
	}