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