Mybatis工作原理?

  想知道mybatis是怎么在程序中顺利的找到sqlmapper的,这个的流程是怎么样??在程序中只是调用了dao,mybatis是自己再到配置文件中找对应的sqlmapper文件中的sql语句吗 ???新手求帮忙

  

  我们在使用 Mybatis 的时候、只需要定义一个 Mapper xml 文件和一个对应的 Mapper 接口、并需要实现该接口、即可在程序中使用该 Mapper 接口、调用里面的方法对其进行查询(当然 xml 中的 namespace 要关联接口)。

  那么这个功能是怎么实现的呢 ?

  MapperRegistry

  我们知道在使用 Mybatis 的时候都会去创建一个 类、而在这个类中、则会创建一个

  我们知道注册一个 Mapper 类会加入到 这个 Map 里面、 为对应的 Mapper 类型、 为

  在 方法中我们看到

  MapperProxyFactory

  我们看到这里创建了一个名为 的代理类、哦吼、这里也是代理模式

  MapperProxy

  正常来说我们创建的接口都不使用 修饰、如果使用了、那就代表其有方法的实现、那么就直接调用该方法、而不会再走 Mybatis 的逻辑。 如果走正常逻辑的话就会创建

  MapperMethod

  我们首先来看看

  非常简单的逻辑、根据被代理的接口的名称和调用方法名称、组装成一个 statementId(namespace + sqlId)、去 Configuration 对象中查找是否存在对应的 MappedStatement

  SqlCommandType 则是

  再来看看

  主要是对方法进行一系列的解释、返回值啊、对参数的解释

  再回到 MapperMethod 类中、我们知道它的 invoke 方法被 调用

  如果是 Insert、Update、Delete 的话、那么则先进行 convertArgsToSqlCommandParam 然后则调用 rowCountResult 处理参数

  这里主要是将参数放进到 Map 中、这里还额外增加了一些参数、比如我们经常在 mapper 文件中使用的 param1 、param2....

  就是在这里实现的

  wrapToMapIfCollection 则是对集合数组进行处理的

  再回到 rowCountResult、则是对返回值进行处理的、逻辑比较简单。比如说返回布尔值的、则判断其影响值是否大于 0

  至于如果 sql 类型是 Select 的话

  针对存在 ResultHandler 的、判断是否存在 RowBounds

  针对返回集合的

  针对返回 Map 的

  针对返回游标的

  针对 selectOne 的

  可以看到 MapperMethod 也是依赖 Mybatis 的 SqlSession 去帮我们执行而已、并没有太高端的技术。