Mybatis如果在select sql 中不写resultType或resultMap会发生什么

1.结论

如果select sql 中不写 resultType 或 resultMap在运行该 sql 时会抛出

org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement '****(具体的sql方法)' It's likely that neither a Result Type nor a Result Map was specified.
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.validateResultMapsCount(DefaultResultSetHandler.java:222)

2.寻找源头

在发现这个现象后我跟踪了代码运行,发现每个select sql 在  org.apache.ibatis.session.Configuration 中会进入  newResultSetHandler 方法创建一个 DefaultResultSetHandler 这个 handler 用来处理该 sql 的结果集,然后SQLIntercept会拦截sql进入PreparedStatementHandler.query 方法,然后会调用 DefaultResultSetHandler.handleResultSets 用来处理结果集,该方法中会获取 mappedStatement.resultMaps 并检查 size 是否小于1,如果小于1就会抛出上面的异常,而 resultMaps 就是我们设置的 resultType 或 resultMap,因为我们没有设置,所以resultMaps.size=0,自然就会抛出异常了。

at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.validateResultMapsCount(DefaultResultSetHandler.java:222)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:149)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:57)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)
	at sun.reflect.GeneratedMethodAccessor104.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:46)

3.总结

在遇到问题时,尽量去找到问题的源头,这样我们不仅可以解决问题,还能得到极大的成就感和满足感,增加学习和工作的动力,这样才会更快的提升自己,不能满足于解决表面的问题,一定要潜心学习!

你可能感兴趣的:(Spring+Mybatis,Java学习)