位置:武汉粤嵌教育IT技术培训机构 > 学校动态 > Java中MyBatis流式查询好用么
流式查询 指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用。
流式查询的过程当中,数据库连接是保持打开状态的,因此要注意的是:执行一个流式查询后,数据库访问框架就不负责关闭数据库连接了,需要应用在取完数据后自己关闭。
1、
isOpen()
:用于在取数据之前判断Cursor对象是否是打开状态。只有当打开时 Cursor 才能取数据;2、
isConsumed()
:用于判断查询结果是否全部取完。3、
getCurrentIndex()
:返回已经获取了多少条数据因为Cursor实现了迭代器接口,因此在实际使用当中,从Cursor取数据非常简单:
cursor.forEach(rowObject -> {...});
我们举个实际例子。下面是一个Mapper类:
@Mapper public interface FooMapper { @Select("select * from foo limit #{limit}") Cursor<Foo> scan(@Param("limit") int limit); }
然后我们再写一个SpringMVC Controller方法来调用Mapper(无关的代码已经省略):
@GetMapping("foo/scan/0/{limit}") public void scanFoo0(@PathVariable("limit") int limit) throws Exception { try (Cursor<Foo> cursor = fooMapper.scan(limit)) { // 1 cursor.forEach(foo -> {}); // 2 } }
上面的代码看上去没什么问题,但是执行scanFoo0() 时会报错:
java.lang.IllegalStateException: A Cursor is already closed.
我们可以用SqlSessionFactory来手工打开数据库连接,将Controller方法修改如下:
@GetMapping("foo/scan/1/{limit}") public void scanFoo1(@PathVariable("limit") int limit) throws Exception { try ( SqlSession sqlSession = sqlSessionFactory.openSession(); // 1 Cursor<Foo> cursor = sqlSession.getMapper(FooMapper.class).scan(limit) // 2 ) { cursor.forEach(foo -> { }); } }
在Spring中,我们可以用TransactionTemplate来执行一个数据库事务,这个过程中数据库连接同样是打开的。代码如下:
@GetMapping("foo/scan/2/{limit}") public void scanFoo2(@PathVariable("limit") int limit) throws Exception { TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); // 1 transactionTemplate.execute(status -> { // 2 try (Cursor<Foo> cursor = fooMapper.scan(limit)) { cursor.forEach(foo -> { }); } catch (IOException e) { e.printStackTrace(); } return null; }); }
上面的代码中,
1、处我们创建了一个TransactionTemplate 对象(此处transactionManager 是怎么来的不用多解释,本文假设读者对Spring数据库事务的使用比较熟悉了),
这个本质上和方案二一样,代码如下:
@GetMapping("foo/scan/3/{limit}") @Transactional public void scanFoo3(@PathVariable("limit") int limit) throws Exception { try (Cursor<Foo> cursor = fooMapper.scan(limit)) { cursor.forEach(foo -> { }); } }
@Transactional
注解。这个方案看上去较简洁,但请注意 Spring 框架当中注解使用的坑:只在外部调用时生效。在当前类中调用这个方法,依旧会报错。
尊重原创文章,转载请注明出处与链接:http://www.peixun360.com/5732/news/518363/违者必究! 以上就是武汉粤嵌教育IT技术培训机构 小编为您整理 Java中MyBatis流式查询好用么的全部内容。