Mybatis映射器

来源:互联网 发布:09总决赛科比每场数据 编辑:程序博客网 时间:2024/06/08 04:16

一般而言,映射器由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进行组装结果再返回。

原创粉丝点击