Mybatis工作原理

Mybatis的框架分层:

这里写图片描述

一 . 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> 结果集.

 

Mybatis原理相关问题:


1.mybatis是什么?
mybatis是一个优秀的持久层框架,他对jdbc操作数据库的过程进行了封装,使开发着只用关注sql本身,不用去关注例如注册驱动,加载链接,得到statement,处理结果集等复杂的过程。
mybatis通过xml或者注解的方式,将要执行的各种sql语句配置起来,并通过Java对象和statement中的sql语句映射生成最终的sql语句,最后由mybatis框架执行sql语句,并将结果映射成Java对象返回。
2.工作原理
mybatis通过配置文件创建sqlsessionFactory,sqlsessionFactory根据配置文件,配置文件来源于两个方面:一个是xml,一个是Java中的注解,获取sqlSession。SQLSession包含了执行sql语句的所有方法,可以通过SQLSession直接运行映射的sql语句,完成对数据的增删改查和事物的提交工作,用完之后关闭SQLSession。
3.工作的流程
mapper接口:

接口的全类名是xml文件中namespace的值。

  • 接口中的方法名是xml文件中mapperstatement的id值。
  • 接口中方法的参数就是传递给sql的参数
  • mapper接口是没有实现类的,当调用一个方法时,接口的全类名定位一个配置文件,接口的方法名定位这个配置文件中的一个mapperStatment,所以说mapper的方法名是不能重载的,因为mapperStatment的保存和寻找策略。
  • mapper接口的工作原理是,mybatis会使用jdk动态代理方式为mapper接口创建proxy对象,代理对象会拦截接口中的方法,转而执行mapperStatment所代表的sql语句,然后将执行的结果封装返回。

4.mybatis解决的问题

  • 1.使用数据库连接池管理链接,避免了频繁创建了、关闭链接,浪费资源,影响性能的问题。
  • 2.用xml管理sql语句,让Java代码和sql语句分离,使得代码更易维护。
  • 3.解决了sql语句参数不定的问题。xml中可以通过where条件决定sql语句的条件参数。mybatis将Java对象映射到sql语句,通过statement的parameterType定义输入参数的类型。
  • 4.mybatis自动将结果集封装成Java对象, 通过statement的resultType定义输出的类型。避免了因sql变化,对结果集处理麻烦的问题。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值