Mybatis映射器

一般而言,映射器由3个部分组成:
·MappedStatement,它保存映射器的一个节点(select|insert|delete|update)。包括许多配置的SQL、SQL的id、缓存信息、resultMap、parameterType、resultType、languageDriver等重要配置内容。
·SqlSource,它是提供BoundSql对象的地方,它是MappedStatement的一个属性。
·BoundSql,它是建立SQL和参数的地方。它有3个常用的属性:SQL、parameterObject、parameterMappings。

MappedStatement对象涉及的东西较多,一般不去修改,因为容易产生不必要的错误。
SqlSource是一个接口,它的主要作用是根据参数和其他规则组装SQL,一般也不需要修改。
对于参数和SQL而言主要的规则都反映在BoundSql类对象上,在插件中往往需要拿到它进而可以拿到当前运行的SQL和参数以及参数规则,作出适当的修改来满足我们的特殊需求。

BoundSql会提供3个主要的属性:parameterMappings、parameterObject和sql。
parameterObject为参数本身,传递简单对象int等会转换为Integer对象传递。传递的是POJO或者Map,parameterObject就是传入的POJO、Map本身不变。传递多个参数如果没有@Param注解,Mybatis会把parameterObject变为一个Map对象以数字为键。如果使用类@Param注解,Mybatis也会把parameterObject变为一个Map对象,只是把键值换为@Param注解的键值。
parameterMappings它是一个list,每一个对象都是parameterMapping对象。这个对象会描述我们的参数。参数包括属性、名称、表达式、javaType、jdbcType、typeHandle等重要的信息,一般不会去修改它。通过它可以实现参数和SQL的结合,以便PreparedStatement能过通过它找到parameterObject对象的属性并设置参数。
sql属性就是我们书写在映射器上的一条SQL,在大多数时无需修改,只有在插件的情况下,我们可以更具需要进行改写。

SqlSession下的四大对象:Excutor执行器调度其他三个对象来执行对应的SQL、StatementHandler使用数据库的Statement(PreparedStatement)执行操作、ParameterHandler用于对SQL参数的处理、ResultHanler进行最后数据集的封装和返回。

Executor有三种执行器:SIMPLE(简易执行器,默认执行器)、REUSE是一种执行器重用预处理语句、BATCH执行器重用语句和批量更新,针对批量专用。
SIMPLE为例,Mybatis根据Configuration来构建StatementHandler。然后用preparedStatement方法对SQL编译并对参数进行初始化,初始化时调用StatementHandler对prepare进行预编译和基础设置,然后通过StatementHandler对parameterize来设置参数并执行,resultHandler再组装查询结果返回给调用者。

数据库会话器StatemnetHandler就是专门处理数据库会话的,Mybatis创建StatementHandler对象时创建的真实对象是RoutingStatementHandler对象,它实现来StatementHandler接口。通过适配器模式delegate找到对应的StatementHandler来执行。StatementHandler分为:SimpleStatementHandler、PreparedStatementHandler、CallableStatementHandler对应上述三种执行器。
以PreparedStatementHandler为例,prepare方法中的instantiateStatement对SQL进行预编译,做一些基础设置。然后Executor调用parameterize设置参数(通过调用ParameterHandler去完成)。一条SQL的执行过程:Executor先调用StatementHandler的prepare方法预编译SQL设置基本运行参数。然后parameterize方法启用ParameterHandler设置参数完成预编译,跟着执行查询,后ResultSetHandler封装结果给调用者。

参数处理器ParameterHandler从parameterObject对象中取参数,然后使用typeHandler进行参数处理。typeHandler也是在Mybatis初始化时注册在Configuration里面的,可以直接拿来使用。

结果处理器ResultSetHandler,默认通过DefaultResultSetHandler进行处理,涉及使用JAVASSIST或者CGLIB作为延迟加载,然后通过typeHandler和ObjecFactory进行组装结果再返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值