MP-通用Service
一、何为通用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@qq.com"));
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+"@qq.com");
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@vip.com");
list.add(user1);
User user2 = new User(2L,"nacos",19,"fairy@nacos.com");
list.add(user2);
User user3 = new User(9L,"lurra",34,"lurra@cc.com");
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@geogle.com");
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);
}
}