概述
CrudService是Service层的基类,提供了21个对单表操作的方法。
在Dao层14个方法的基础上,增加了7个方法。
Service层增强的能力
- 提供了批量操作能力。
- 提供了查询并返回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()); } }