
建议以这样的思路解决问题:
1、如果这3个查询的逻辑不复杂,可以在mybatis的mapper文件中将sql合并。
2、1无法解决问题,而三个list结果集的map结构相同,在后台可以用listaddAll()进行合并。
3、如果2仍然无法解决,那就只能根据业务特殊处理
你是说要将多个字段同时放到同一个数据块?
如果这样的话那你应该会定义一个结构体数组来存储这些数据,每条记录中的多个字段存到结构体数组的一个元素。
你可以看一下otl的用法,你这只是简单的从数据块select数据而已,就是读取一条记录存放到结构体,然后循环,因为你select出来的多个字段是一个数据流,你在解析这个数据流就能得到每个字段的值。最后就得到了一个存放你所需数据的结构体。
ps:简单点儿的话你也可以每次只select一个字段,多写几个就ok。比如:
for(要读取的条数)
{
select 字段1from table where
select字段2 from table where
}
1、定义
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
2、使用原因
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
3、总体流程
(1)加载配置并初始化
触发条件:加载配置文件
处理过程:将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)接收调用请求
触发条件:调用Mybatis提供的API
传入参数:为SQL的ID和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。
(3)处理 *** 作请求
触发条件:API接口层传递请求过来
传入参数:为SQL的ID和传入参数对象
处理过程:
(A)根据SQL的ID查找对应的MappedStatement对象。
(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
(E)释放连接资源。
(4)返回处理结果将最终的处理结果返回。
Mybatis的四大对象
Executor
ParameterHandler
ResultSetHandler
StatementHandler
一个MappedStatement代表一个增删改查的详细信息
Configuration包含全局配置,所有映射文件信息,接口信息
MappedStatement:一个sql对应一个MappedStatement
MapperProxyFactory:生成MapperProxy实例
Executor:执行增删改查,其中调用StatementHandler处理
原理分析
1、获取SqlSessionFactory对象
把配置文件的信息解析并保存在Configuration对象中(包含所有的映射文件信息、接口信息等),返回包含了Configuration的DefaultSqlSession对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()build(inputStream);
2、获取SqlSession
返回SqlSession的实现类Default对象,包含了Executor和Configuration;会有拦截器链(interceptChainpluginAll(executor))对Executor进行插入修饰。
3、getMapper
getMapper使用MapperProxyFactory创建一个MapperProxy的代理对象,包含了DefaultSqlSession(Executor)
4、执行方法
创建MapperMethodInvoker(接口,有invoke方法),PlainMethodInvoker写入本次方法查询相关信息(MapperMethod),MapperMethod包括SqlCommand和MethodSignature。调用MapperMethodInvokerinvoke方法执行 *** 作=>PlainMethodInvoker中调用MapperMethodexcute方法。MapperMethodexcute是真正执行方法。调用MapperStatment
通过调用代理类执行方法,创建StatementHandler(ParameterHandler,ResultSetHandler)处理器对象,使用处理器调用底层JDBC执行SQL返回结果。
总结:
责任链模式+动态代理+反射机制
插件编写
>
配置文件
<resultMap type="Integer" id="count">
<result column="RecordCount" jdbcType="INTEGER" javaType="Integer" />
</resultMap>
<resultMap type="OrderForm" id="orders">
<result column="OrderId" property="id" jdbcType="VARCHAR" javaType="String"/> </resultMap>
<select id="getOrders" statementType="CALLABLE" parameterType="Map" resultMap="count,orders" >
{call Page_Up_Get_OrderState(#{id,mode=IN,jdbcType=VARCHAR})}
</select>
以上就是关于如何读取MyBatis查询到的多条记录全部的内容,包括:如何读取MyBatis查询到的多条记录、什么是mybatis 为什么要使用my batis、【mybatis-高级篇】等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)