Mybatis

MyBatis执行流程:

在这里插入图片描述

MappedStatements:

  • 包装了mybatis配置信息及sql映射信息等
    • id:全限定类名+方法名组成的ID。
    • sqlSource:当前SQL标签对应的SqlSource对象,可以解析生成SQL。
  • 对sql执行输入参数进行定义,在执行sql前将输入的java对象映射至sql中。
    输入参数映射就是jdbc编程中对preparedStatement设置参数。
  • 对sql执行输出结果进行定义,在执行sql后将输出结果映射至java对象中。
    输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
  • 事务控制

SQL执行过程

  1. DefaultSqlSession根据id在configuration中找到MappedStatement对象(要执行的语句)
  2. Executor调用MappedStatement对象的getBoundSql得到可执行的sql和参数列表
  3. StatementHandler根据Sql生成一个Statement
  4. ParameterHandler为Statement设置相应的参数
  5. Executor中执行sql语句
  6. 如果是更新(update/insert/delete)语句,sql的执行工作得此结束
  7. 如果是查询语句,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的时候追溯源码发现的,细节部分并不详尽,但总体流程可以借鉴。


面试题

点这里1
点这里2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值