我有一个包含大量数据的表,我正在尝试使用MyBatis的FetchSize来读取它。
我尝试从数据库中读取
@Test
public void testFetchSizeLeggi(){
ScommessaMapper mapper;
try {
SqlSession sessione = ConnectionMySQL.getSession().openSession();
mapper = sessione.getMapper(ScommessaMapper.class);
final List<Scommessa> lista = new ArrayList<Scommessa>();
mapper.leggiScommesse(new ResultHandler() {
@Override
public void handleResult(ResultContext context) {
lista.add((Scommessa) context.getResultObject());
}
});
sessione.close();
assertTrue(lista == null);
} catch (Throwable e) {
e.printStackTrace();
fail();
}
}
我收到以下错误:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.RuntimeException: java.lang.InstantiationException: java.util.List
### The error may exist in com/surebetfinder/dao/config/ScommessaMapper.xml
### The error may involve com.surebetfinder.dao.mapper.ScommessaMapper.leggiScommesse
### The error occurred while handling results
### SQL: select S.ID_SCOMMESA, S.dt_inserimento, B.nome, T.codice_tipologia, T.tipologia, Q.id_quota, Q.nome_quota, Q.quota, E.id_evento, E.dt_evento, E.nazione, E.puntata, E.competizione, Sp.sport from scommessa S , giocata G, evento E, bookmaker B, tipologia_scommessa T, quota Q, sport Sp where S.giocata = G.id_giocata and S.evento = E.id_evento and G.bookmaker = B.id_bookmaker and G.tipologia = T.codice_tipologia and G.id_quota = Q.id_quota and E.sport = Sp.codice_sport ORDER BY S.ID_SCOMMESA
### Cause: java.lang.RuntimeException: java.lang.InstantiationException: java.util.List
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
at com.sun.proxy.$Proxy4.leggiScommesse(Unknown Source)
at com.surebetfinder.batch.CreaSurebet.start(CreaSurebet.java:40)
at com.surebetfinder.batch.TestCreaSurebet.testStartBatch(TestCreaSurebet.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.RuntimeException: java.lang.InstantiationException: java.util.List
at com.surebetfinder.dao.access.SimpleObjectFactory.create(SimpleObjectFactory.java:44)
at org.apache.ibatis.executor.result.DefaultResultHandler.<init>(DefaultResultHandler.java:38)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:245)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:160)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:78)
at org.apache.ibatis.executor.ReuseExecutor.doQuery(ReuseExecutor.java:59)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:134)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)
... 30 more
Caused by: java.lang.InstantiationException: java.util.List
at java.lang.Class.newInstance(Class.java:427)
at com.surebetfinder.dao.access.SimpleObjectFactory.create(SimpleObjectFactory.java:42)
... 40 more
Caused by: java.lang.NoSuchMethodException: java.util.List.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 41 more
mybatis-config.xml和mapper
<?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>
<properties resource="etc/db.properties" />
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="autoMappingBehavior" value="NONE" />
<setting name="defaultExecutorType" value="REUSE" />
<setting name="defaultStatementTimeout" value="25000" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
</settings>
<objectFactory type="com.surebetfinder.dao.access.SimpleObjectFactory" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${password}" />
<property name="defaultAutoCommit" value="${jdbc.default.auto.commit}" />
<property name="poolMaximumActiveConnections" value="${pool.maximum.active.connections}" />
<property name="poolMaximumIdleConnections" value="${pool.maximum.idle.connections}" />
<property name="poolMaximumCheckoutTime" value="${pool.maximum.checkout.time}" />
<property name="poolTimeToWait" value="${pool.time.to.wait}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/surebetfinder/dao/config/ScommessaMapper.xml" />
</mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.surebetfinder.dao.mapper.ScommessaMapper">
<resultMap id="resultMapClass" type="com.surebetfinder.dao.dto.Scommessa"
autoMapping="true">
<id property="idScommessa" column="id_scommessa" javaType="long" />
<result property="dtInserimento" column="dt_inserimento" javaType="Date" />
<result property="giocataBean.bookmakerBean.nome" column="nome" />
<result property="giocataBean.tipologiaScommessa.codiceTipologia" column="codice_tipologia" />
<result property="giocataBean.quota.idQuota" column="id_quota" />
<result property="giocataBean.quota.nomeQuota" column="nome_quota" />
<result property="giocataBean.quota.quota" column="quota"/>
<result property="eventoBean.idEvento" column="id_evento"/>
<result property="eventoBean.dtEvento" column="dt_evento"/>
<result property="eventoBean.nazione" column="nazione"/>
<result property="eventoBean.puntata" column="puntata"/>
<result property="eventoBean.competizione" column="competizione"/>
<result property="eventoBean.sportBean.sport" column="sport"/>
<result property="giocataBean.quota.quota" column="quota"/>
</resultMap>
<select id="leggiScommesse" resultMap="resultMapClass" fetchSize="1000" resultSetType="FORWARD_ONLY"> <!-- fetchSize="1000" resultSetType="FORWARD_ONLY" -->
select S.ID_SCOMMESA, S.dt_inserimento, B.nome, T.codice_tipologia,
T.tipologia, Q.id_quota, Q.nome_quota, Q.quota, E.id_evento, E.dt_evento, E.nazione, E.puntata, E.competizione, Sp.sport
from scommessa S , giocata G, evento E, bookmaker B, tipologia_scommessa T, quota Q, sport Sp
where
S.giocata = G.id_giocata and S.evento = E.id_evento and
G.bookmaker = B.id_bookmaker and G.tipologia = T.codice_tipologia and G.id_quota = Q.id_quota
and E.sport = Sp.codice_sport
ORDER BY S.ID_SCOMMESA
</select>
</mapper>
我的SimpleObjectFactory:
public class SimpleObjectFactory implements ObjectFactory {
public <T> T create(Class<T> type) {
try {
return type.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public void setProperties(Properties properties) {
}
@Override
public <T> boolean isCollection(Class<T> type) {
return Collection.class.isAssignableFrom(type);
}
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
throw new UnsupportedOperationException();
}
}
我哪里错了?我的设置MyBatis 3.3.0 MySql和Java 1.8
由于
P.S:
public interface ScommessaMapper {
void inserisciScommessa(Scommessa scommessa);
long deleteScommesse();
List<Scommessa> leggiScommesse(ResultHandler handler);
List<Scommessa> leggiScommesse();
}