Mybaties原理解析

Mybaties

投鞭断流:就是不需要被加强的对象,直接创建一个新的对象。

Mybaties的原理

分为两部分

生成映射器MapperStatement

一个映射器是由3个部分组成的:

  • MapperStatement,它保存映射器的一个节点(select|insert|update|delete)。包括许多我们配置的SQL,SQL的id,缓存信息,resultMap,parameterType,resultType,languageDriver等重要配置内容。
  • SqlSource,他是提供BoundSql对象的地方,它是MapperStatement的一个属性。
  • BoundSql,它是建立SQL和参数的地方,他有3个常用的属性SQL,parameterObject,parameterMappings。
流程

1、构建SqlSessionFactory过程
1)读取的配置文件
2)通过Configuration生成SqlSessiongFactory
2、将每一个结点生成一个MapperStatement,并且向Configuration注册。

动态代理

流程

1、通过动态代理实现对应的代理
2、Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法(通过接口全限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement),转而执行MapperStatement所代表的sql,然后将sql执行结果返回。

面试题

1、#{},${}
#{}:在预处理(动态解析阶段),会用占位符“?”代替;会加上"",防止sql注入
${}:在预处理阶段,作为字符串拼接,不能防止sql注入。

#{}:一般用作传递参数
${}:用在拼接表名。

2、如果两个xml都和同一个dao建立联系会怎么样?
如果两个xml中的方法名重复了,则会报错(通过接口全限名+方法名拼接字符串作为key);否则没关系。

相关基础知识:

mybatis主要成员

  1. Configuration:
    a、 MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中
    b、可以理解为所有mybatis文件的集合
  2. SqlSession:
    a、作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能
    b、从中获取会话的连接
  3. Executor:
    a、MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
    b、sql的执行器
  4. StatementHandler:
    a、封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等
  5. ParameterHandler:
    a、负责对用户传递的参数转换成JDBC Statement 所对应的数据类型
    b、主要负责类型的转换
    c、这个用户可以自己定制
  6. ResultSetHandler:
    a、负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
  7. TypeHandler
    a、负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
  8. MappedStatement
    a、MappedStatement维护一条<select|update|delete|insert>节点的封装
    b、mapper文件中的一个id对应一个该对象
  9. SqlSource
    a、负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
    10、BoundSql
    a、表示动态生成的SQL语句以及相应的参数信息

MyBatis加载流程

主要步骤:
MybatisAutoConfiguration->SqlSessionFactoryBean->SqlSessionFactoryBuilder(加载Configuration)->DefaultSqlSessionFactory->DefaultSqlSession

加载Configuration

通过动态代理将Mapper.xml中的每一个标签解析成一个MappedStatement,并且按照Map<String, MappedStatement>保存到DefaultSqlSessionFactory中,Key为包名+Mapper接口名+方法名(所以Mapper中方法不允许重载)。

SqlSessionFactoryBuilder->DefaultSqlSessionFactory:

1.创建Configuration类,加载工厂的配置属性;通过动态代理生成Mapper类,并保存到Configuration中;按照Configuration来build默认的DefaultSqlSessionFactory(Configuration作为成员变量)。

openSesion获取SqlSession对象

在这里插入图片描述
a、openSession中创建了事务,会话和执行类    
b、SqlSession的实现类DefaultSqlSession便是具体的数据库操作类(可以增删改查),它的内部依赖configuration    
c、数据源构造了事务,事务成全了数据库操作执行器executor
d、事务隔离级别装载
e、executor构造时的type的来源

调用Mapper方法流程

在这里插入图片描述

转载:https://www.cnblogs.com/ws563573095/p/10301301.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值