概述
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());
}
}