概述

CrudService是Service层的基类,提供了21个对单表操作的方法。

在Dao层14个方法的基础上,增加了7个方法。

Service层增强的能力

  1. 提供了批量操作能力。
  2. 提供了查询并返回Cusror游标能力。

批量操作

选用于当有大批量数据需要插入或更新时的业务场景,优点:发送的是预编译后的SQL语句,执行效率高。是一个整体事务。

  • 批量执行insert、update的基础方法
  • 底层使用preparestatement,实现的真的批量插入和更新,高性能,适合各种数据库
  • 若使用oracle数据库,oracle jdbc驱动版本不能低于ojdbc6 - 12.1.0.2,否则批量插入无法运行。
  • xxxSelective方法,是只把非空的值更到对应的字段,会引起每一条preparestatement语句的参数数量是变化的,SQL语句是变化的.
  • Mybatis容错式的解决了这个问题,每当preparestatement语句的SQL变化时,就执行新的SQL语句,这保证了功能的正确性,稍影响性能。
  • 所以,请你按常规套路来使用batch,可收到最佳效果。
  • 常规套路是:如一批SQL有100条,每一条preparestatement语句的参数数量应是一致,SQL语句是不变化的,只有参数的值是可以变的。
方法名 说明
insertBatch 批量插入
insertSelectiveBatch 批量insert,只把非空的值更到对应的字段
updateBatch 批量update
updateSelectiveBatch 批量update,只把非空的值更到对应的字段
selectOne(T entity) 获取单条数据
insertOrUpdate(T entity) 插入或更新数据

Cusror游标

选用于要从数据库查出海量数据(如100万)逐条处理的场景。   从数据库查出海量数据(如100万),不可一次性查出来内存放不下,当使用了游标后是分成一小批一小批查出来的。

查询并返回Cusror游标

方法名 说明
public Cursor<T> selectCursor(String sqlId ,Wrapper wrapper )

查询并返回Cusror游标

在mybatis 3.4.0版本中新增了一个功能,查询可以返回Cusror <T> 类型的数据,

类似于JDBC里的ResultSet类,当查询百万级的数据的时候,使用游标可以节省内存的消耗,

不需要一次性取出所有数据,可使用Cusror游标按批取出,再处理业务。

查询并返回Cusror游标,使用示例:

	/**
	 * 测试一 (使用了泛型)
	 * 查询并返回Cusror游标
	 */
	@Test
	public void test_select(){
		String sqlId="selectByWhere";
		Wrapper wrapper=new Wrapper();
		wrapper.and("id >", 19019);
		Cursor<Log> cursor=sysLogService.selectCursor(sqlId, wrapper);
		Iterator<Log> iter = cursor.iterator();
		while (iter.hasNext()) {
			Log log=iter.next();
			System.out.println(log.toString());
		}
	}
	
	/**
	 * 测试二 (查询的非本表的数据)
	 * 查询并返回Cusror游标
	 */
	@Test
	public void test_select2(){
		String sqlId="com.sicheng.admin.product.dao.ProductSpuDao.selectByWhere";//查询的非本表的数据
		Wrapper wrapper=new Wrapper();
		Cursor<?> cursor=sysLogService.selectCursor(sqlId, wrapper);
		Iterator<?> iter = cursor.iterator();
		while (iter.hasNext()) {
			Object row=iter.next();
			System.out.println(row.toString());
		}
	}