本文的内容
显示
1.
MyBatis流式查询接口
2.
但是构建Cursor的过程并不简单。
2.1.
方案1: SqlSessionFactory
2.2.
选项2:事务模板
2.3.
选项3:@事务性注释
2.4.
推荐阅读
流式查询的基本概念是指查询成功后返回一个迭代器而不是一个集合,应用程序一次从迭代器中取出一个查询结果。流式查询的优点是可以减少内存使用。如果没有流式查询,当我们要从数据库中取出1000万条记录,内存又不够的时候,就要进行分页查询,而分页查询的效率取决于表的设计。如果设计不好,就无法进行高效的分页查询。因此,流式查询是数据库访问框架的必要功能。在流式查询的过程中,数据库连接是保持打开的,所以需要注意的是,在执行完流式查询后,数据库访问框架并不负责关闭数据库连接,应用程序需要在取到数据后自行关闭。
MyBatis流式查询接口
MyBatis提供了一个名字?
org . Apache . ibatis . cursor . cursor的接口类用于流查询,该接口继承了java.io.Closeable和java.lang.Iterable的接口,由此可见:
1.光标可以关闭;2.游标是遍历的。此外,Cursor还提供了三种方法:
1.isOpen():用于在取数前判断光标对象是否打开。游标只能在打开时获取数据;
2.isConsumed():用于判断是否检索到了所有的查询结果。
3.getCurrentIndex():返回获得了多少条数据。
因为Cursor实现了迭代器接口,所以在实际使用中从Cursor获取数据非常简单:
cursor . foreach(row object-{…});
但是构建Cursor的过程并不简单。
我们举个实际的例子。下面是一个映射器类:
方法scan()是一个非常简单的查询。通过指定Mapper方法的返回值是游标类型,MyBatis知道这个查询方法是一个流查询。然后我们写一个SpringMVC控制器方法调用Mapper(无关代码已省略):
在上面的代码中,fooMapper是@Autowired。调用Note 1中的scan方法获取光标对象,确保最后可以关闭;2是从游标中获取数据。上面的代码看起来没问题,但是执行scanFoo0()的时候会报错:
Java . lang . illegalstateexception:游标已关闭。
这是因为我们说过在取数据的过程中需要保持数据库连接,而Mapper方法通常在执行后关闭连接,所以Cusor也被关闭。所以这个问题的解决方法并不复杂,保持数据库连接打开即可。我们至少有三个选择。
方案1: SqlSessionFactory
我们可以使用SqlSessionFactory手动打开数据库连接,并修改控制器方法如下:
在上面的代码中,在一个地方,我们打开了一个SqlSession(实际上代表一个数据库连接),并确保最后可以关闭;2我们使用SqlSession来获取Mapper对象。这将确保光标对象是打开的。
选项2:事务模板
在Spring中,我们可以使用TransactionTemplate来执行数据库事务,其中数据库连接也是打开的。代码如下:
在上面的代码中,我们在一个地方创建了一个TransactionTemplate对象(transactionManager来自哪里无需进一步解释,本文假设读者熟悉Spring数据库事务的使用)。2,数据库事务的内容是调用映射器对象的流查询。请注意,这里的映射器对象不需要通过SqlSession创建。
选项3:@事务性注释
这和方案2本质上是一样的,代码如下:
它只是在原始方法中添加了一个@Transactional注释。这个方案看起来是最简洁的,但是请注意Spring框架中注释使用的坑:只有在外部调用时才生效。在当前类中调用此方法仍会给出错误。
以上是实现MyBatis流查询的三种方式。
关于西部数码代理
成都西维数码科技有限公司成立于2002年,注册资金1000万元。其总部位于天府之国成都——,品牌为西部数码代理(www.chenqinet.cn)。深耕IDC行业十余年,在中国拥有北京、广东、郑州、成都、绵阳、香港等多家IDC云计算安全数据中心,在美国拥有海外数据中心。自主研发了虚拟主机、灵活度云服务器、西部数据企业云邮箱等产品,广受用户欢迎。我们始终坚持用户体验至上的价值导向,深度挖掘用户需求。目前,超过100万用户通过我们注册和管理了超过1000万个域名,共有超过50万个网站在我们自研的云主机平台上运行。我们服务的用户有:宝贝回家找子网、四川大学、链家网(北京)科技有限公司、四川省互联网协会、沱牌集团、谭木匠、中铁二局、四川省中国青年旅行社。
我们始终坚持“以人为本、以客为尊、持续创新”的核心价值观,抓住各种发展机遇,不断创新发展理念,不断转变发展方式,不断解决发展难题。随着企业的发展,我们的业务也不断发展为基于云计算的云托管业务、域名注册、域名交易等相关业务。公司从最初的几个员工发展到近200人的精英团队,并在IDC和中国建立了业务。成为拥有多项自主知识产权的国家高新技术企业、获得ICANN和CNNIC双重认证的国际顶级域名注册服务机构、首批获得工信部颁发的国家云服务牌照的企业之一。