MyBatis-Plus【通用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);

参数说明:

类型参数名描述
Tentity实体对象
CollectionentityList实体对象集合
intbatchSize插入批次数量

案例演示:
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);

参数说明:

类型参数名描述
Tentity实体对象
WrapperupdateWrapper实体对象封装操作类 UpdateWrapper
CollectionentityList实体对象集合
intbatchSize插入批次数量

案例演示:
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);

参数说明:

类型参数名描述
WrapperqueryWrapper实体包装类 QueryWrapper
Serializableid主键 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);

参数说明:

类型参数名描述
Serializableid主键 ID
WrapperqueryWrapper实体对象封装操作类 QueryWrapper
booleanthrowEx有多个 result 是否抛出异常
Tentity实体对象
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);
	    }
	}
### 回答1: Mybatis-Plus是一个基于Mybatis的增强工具,提供了许多实用的功能,如自动生成代码、分页查询、条件构造器、性能分析等。Mybatis-Plus ServiceMybatis-Plus的一个模块,提供了一些常用的Service层接口和实现类,如IServiceServiceImpl等,方便开发者快速构建Service层。 ### 回答2: Mybatis-Plus是一个开源的、能够和Mybatis无缝衔接并扩展出更多实用功能的框架。在实际项目开发中,通常会使用到基于Mybatis-PlusService层,以下是关于Mybatis-Plus Service的一些介绍。 Mybatis-PlusService层是基于Mybatis-Plus框架进行封装的,旨在简化开发者编写Service层代码的流程。使用Mybatis-Plus Service可以有效地减少重复代码的编写,提高开发效率。 在Mybatis-Plus Service中,通常包含了一些常见的CRUD方法,如查询列表、根据ID查询、插入、更新和删除等。我们可以通过继承BaseService或者IService来使用这些方法。同时,Mybatis-Plus Service还提供了一些强大的查询构建器,如LambdaQueryWrapper和QueryWrapper等,可以快速构建复杂的查询条件。 另外,Mybatis-Plus Service还支持事务管理。它提供了一种@Transactional注解来实现声明式事务,我们只需在Service层的方法上添加该注解,即可完成事务的配置。 除了基本的CRUD操作和事务管理外,Mybatis-Plus Service还具有其他扩展的功能,例如分页查询、批量操作、逻辑删除等。这些功能都能够极大地简化开发者的编码工作。 总而言之,Mybatis-Plus Service是一种基于Mybatis-Plus框架的封装,用于简化Service层代码的编写。它提供了一系列的CRUD方法、事务管理以及其他实用功能,可以提高开发效率并减少冗余代码的编写。使用Mybatis-Plus Service开发者能够更加专注于业务逻辑的实现,提高开发效率和代码质量。 ### 回答3: MyBatis-Plus是一个在MyBatis基础上的增强工具,提供了更加便捷的CRUD操作方式。其中的ServiceMyBatis-Plus提供的一层封装,主要用于处理业务逻辑和数据库操作之间的关系。 MyBatis-PlusService主要有以下几个功能: 1. 提供通用的CRUD方法:Service提供了常见的增删改查方法,如save、remove、update等,可以直接调用这些方法来操作数据库,无需手写SQL语句。 2. 封装条件构造器:Service的方法中可以使用MyBatis-Plus提供的条件构造器来进行查询条件的组装,例如可以使用eq、like、in等方法来构建查询条件。 3. 支持分页查询:Service提供了分页查询的方法,可以方便地进行数据分页查询操作。可以设置每页的数量、当前页码等参数来实现分页效果。 4. 支持事务控制:Service可以通过注解的方式来对方法添加事务控制,保证在业务逻辑中的多个操作要么全部成功,要么全部失败。可以使用@Transactional注解来标记需要进行事务控制的方法。 总的来说,MyBatis-PlusService提供了一种更加便捷的数据库操作方式,简化了开发过程中的数据库操作代码,提高了开发效率。同时,它还具备一些高级功能,如条件构造器、分页查询和事务控制,使得开发者可以更加灵活和方便地进行业务逻辑的处理和数据库操作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@WAT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值