2012-01-13 145 views
7

我使用iBatis作为Java中的ORM框架。 我有一个select语句如何为iBatis select语句设置fetchSize

<select id="getList" resultMap="correctMap"> 
    SELECT * 
    FROM SOME_TABLE 
</select> 

而且我用的queryForList方法:

List<MappedObject> list = getSqlMapClientTemplate().queryForList("getList"); 

但它检索数据的一个很大的量和这个查询的性能是相当缓慢的。

我对这个问题的假设是iBatis具有默认的读取大小(例如在JDBS中是10),所以这就是为什么它太慢了。所以我想设置更大的抓取大小(例如1000)。我怎么能这样做?

还是我看错了方向?

注意:我需要所有数据以便设置最大结果queryForList方法对我来说不是一个合适的解决方案。

List queryForList(String id, 
        Object parameterObject, 
        int skip, 
        int max) 

回答

10
<select id="SELECT_TABLE" parameterType="String" fetchSize="500" resultType="hashmap"> 
    SELECT * FROM TABLE WHERE NAME = #{value} 
</select> 
+0

是否有可能将获取大小设置为全局配置而不是在每个查询配置? – nkukhar 2012-01-19 16:32:04

+1

没有办法,我知道。你可以实现Plugin拦截器(MyBatis 3用户手册第17页),它可以在所有通过它的select查询中设置这个属性。这可能不适用于您的版本。 – 2012-01-20 12:44:52

+2

我可以动态设置fetchSize值吗? – 2013-03-12 03:30:38

0

是的,你可以在更高的层级设定FETCHSIZE而不必担心做每一个选择。

步骤1

创建文件的MyBatis-config.xml中

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration 
     PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
     "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration> 
    <settings> 
     <setting name="lazyLoadingEnabled" value="false"/> 
     <setting name="defaultFetchSize" value="5000"/> 
    </settings> 
</configuration> 

可以在MyBatis的 http://www.mybatis.org/mybatis-3/configuration.html

步骤2

负载附加物支持这个作为一种资源的任何值在您的配置文件中。这是春天4例如

@Value("classpath:mybatis-config.xml") 
private Resource myBatisResource ; 

第3步:通过你SqlSessionFactoryBean的

sessionFactory.setConfigLocation(myBatisResource); 

注:我这样做了MyBatis 3.3.0。它不适用于myBatis 3.4.4(存在开放缺陷)

这将确保所有选择语句都具有分配给它们的fetchSize属性。