zoukankan      html  css  js  c++  java
  • MyBatis原理分析

    MyBatis原理分析

     

    参考博客: 深入理解mybatis原理: http://blog.csdn.net/luanlouis/article/details/40422941

    一 . JDBC的工作流程:

    加载数据库的驱动程序->创建数据连接对象->创建Statement对象->执行SQL语句->处理返回结果集->关闭数据库连接

    二 . mybatis和数据库交互的方式

    1 . 使用传统的mybatis提供的API:此方式创建一个SqlSession对象,根据传入的StatementId和参数操作数据库

    2 . 使用Mapper接口:将配置文件中的每一个<mapper>节点抽象为一个Mapper接口,这个接口中声明的方法对应<mapper>中节点的id值,parameterType 为方法的入参,resultMap为返回值。根据MyBatis 的配置规范配置好后,通过SqlSession.getMapper(XXXMapper.class)方法,MyBatis 会根据相应的接口声明的方法信息,通过动态代理机制生成一个Mapper 实例,我们使用Mapper 接口的某一个方法时,MyBatis 会根据这个方法的方法名和参数类型,确定StatementId,底层还是通过SqlSession.select("statementId",parameterObject)或者SqlSession.update("statementId",parameterObject)等来实现对数据库的操作。

    三 . SqlSession的工作过程分析

    1.开启一个数据库访问会话---创建SqlSession对象:MyBatis使用SQLSession对象来封装一次数据库的会话访问。通过该对象实现对事务的控制和数据查询。
    SqlSession sqlSession = factory.openSession();

    2.为SqlSession传递一个配置的Sql语句 的StatementId和参数params,然后返回结果:
    List<User> result = sqlSession.selectList("com.pepper.dao.UserMapper.selectByName",params);
    SqlSession的职能是:SqlSession根据Statement Id, 在mybatis配置对象Configuration中获取到对应的MappedStatement对象,然后调用mybatis执行器来执行具体的操作。

    3.MyBatis执行器Executor根据SqlSession传递的参数执行query()方法。Executor.query()方法会创建一个StatementHandler对象,然后将必要的参数传递给StatementHandler,使用StatementHandler来完成对数据库的查询,最终返回List结果集。
    Executor的功能和作用是:
    (1)、根据传递的参数,完成SQL语句的动态解析,生成BoundSql对象,供StatementHandler使用;
    (2)、为查询创建缓存,以提高性能;
    (3)、创建JDBC的Statement连接对象,传递给StatementHandler对象,返回List查询结果。

    4.StatementHandler对象负责设置Statement对象中的查询参数、处理JDBC返回的resultSet,将resultSet加工为List 集合返回:StatementHandler对象主要完成两个工作:
    (1). 对于JDBC的PreparedStatement类型的对象,创建的过程中,SQL语句字符串会包含 若干个`?` 占位符,之后再对占位符进行设值。StatementHandler通过parameterize(statement)方法对Statement进行设值;
    (2).StatementHandler通过List<E> query(Statement statement, ResultHandler resultHandler)方法来完成执行Statement,和将Statement对象返回的resultSet封装成List;

    5.StatementHandler 的parameterize(statement) 方法调用了 ParameterHandler的setParameters(statement)方法,
    6.ParameterHandler的setParameters(Statement)方法负责 根据我们输入的参数,对statement对象的` ? `占位符处进行赋值。

    StatementHandler 的List<E> query(Statement statement, ResultHandler resultHandler)方法调用了ResultSetHandler的handleResultSets(Statement) 方法。ResultSetHandler的handleResultSets(Statement) 方法会将Statement语句执行后生成的resultSet 结果集转换成List<E> 结果集.

  • 相关阅读:
    父子进程 signal 出现 Interrupted system call 问题
    一个测试文章
    《淘宝客户端 for Android》项目实战 html webkit android css3
    Django 中的 ForeignKey ContentType GenericForeignKey 对应的数据库结构
    coreseek 出现段错误和Unigram dictionary load Error 新情况(Gentoo)
    一个 PAM dbus 例子
    漫画统计学 T分数
    解决 paramiko 安装问题 Unable to find vcvarsall.bat
    20141202
    js
  • 原文地址:https://www.cnblogs.com/echo-ling/p/7416317.html
Copyright © 2011-2022 走看看