MyBatis执行流程:
MappedStatements:
- 包装了mybatis配置信息及sql映射信息等
- id:全限定类名+方法名组成的ID。
- sqlSource:当前SQL标签对应的SqlSource对象,可以解析生成SQL。
- 对sql执行输入参数进行定义,在执行sql前将输入的java对象映射至sql中。
输入参数映射就是jdbc编程中对preparedStatement设置参数。 - 对sql执行输出结果进行定义,在执行sql后将输出结果映射至java对象中。
输出结果映射过程相当于jdbc编程中对结果的解析处理过程。 - 事务控制
SQL执行过程
- DefaultSqlSession根据id在configuration中找到MappedStatement对象(要执行的语句)
- Executor调用MappedStatement对象的getBoundSql得到可执行的sql和参数列表
- StatementHandler根据Sql生成一个Statement
- ParameterHandler为Statement设置相应的参数
- Executor中执行sql语句
- 如果是更新(update/insert/delete)语句,sql的执行工作得此结束
- 如果是查询语句,ResultSetHandler再根据执行结果生成ResultMap相应的对象返回。
MyBatis优缺点
优点:
- 基于SQL语句编程,相当灵活。SQL写在XML里,解除sql与程序代码的耦合,便于统一管理。提供XML标签,支持编写动态SQL语句,并可重用。复杂SQL的效率控制
- 消除了JDBC大量冗余的代码
- 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)
- 能够与Spring很好的集成
- 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护(resultMap标签;collection标签)
缺点:
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
字段映射
Mybatis会维护一个名叫columnNameIndexMap的HashMap,存储的内容是(fieldName, index)。
Mybatis会逆序遍历fields,插入columnNameIndexMap,如果有出现重复的,则会覆盖。也就是说,多个相同名称的列,Mybatis只会保留第一条。
解析ResultSet的时候,Mybatis会根据columnName,在columnNameIndexMap中获取index,随后用index在ResultSet中获取值,最后通过反射注入。
以上内容是在开发过程中,修改bug的时候追溯源码发现的,细节部分并不详尽,但总体流程可以借鉴。