浅谈四个核心组件
- SqlSessionFactory
- SqlSessionFactoryBuilder
- SqlMapper
- SqlSession
-
SqlSessionFactory 工厂接口
-
生成SqlSession,但是这不是一个类而是一个接口,需要通过SqlSessionFactoryBuilder采用分步构建的Builder模式也就是建造者构建出来。
最重要的功能就是提供创建MyBatis的核心接口SqlSession ,同时需要提供配置文件和相关的参数。
MyBatis使用Builder模式去创建SqlSessionFactory,也就是说实际上是使用SqlSessionFactoryBuilder构建出来的,
步骤为: -
- 通过org.apache.ibatis.builder.xml.XMLConfigBuilder 解析配置XML文件将内容保存到org.apache.ibatis.session.Confiruration类对象中
-
- 使用Configuration对象(这个对象是单例模式创建的,保存着MyBatis中的很多内容)去创建SqlSessionFactory(一般是创建一个默认的实现类对象org.apache.ibatis.DefaultSqlSessionFactory)
-
- 代码构建 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactoryBuilder 构造器
-
根据配置或者代码都可以生成SqlSessionFactory,采用Builder模式编写。
SqlMapper 映射器
-
由一个Java接口或者XML文件(或注解)构成,需要规定对应的SQL语句和映射的规则,负责发送SQL语句去执行并返回结果。
-
Mapper映射是通过动态代理来实现的,对进入到MapperMethod的execute方法经过简单的判断就可以进入到SqlSession的delete,insert,update,select等方法中。
映射器内部组成就是MyRatis中的一条SQL语句和相关的配置包含以下三个部分 -
- MappedStatement 保存一个映射器接节点(也就是增<insert>删<delete>改<update>查<select>)的内容
-
- SqlSource接口 根据上下文和参数解析生成正确的需要的SQL并提供BoundSql对象
-
- BoundSql 是一个结果对象,建立SQL和参数的地方,产生的是最终的参数和SQL,也是插件需要拿到它从而拿到当前运行的sql和参数,包含三个属性:
- parameterObject属性 表示参数本身(传递简单对象,POJO,Map,@param注解的参数)
- parameterMappings属性 每个参数都是parameterMapper对象的一个List集合
- sql属性 映射器中被SqlSource解析后的SQL
SqlSession 会话
- BoundSql 是一个结果对象,建立SQL和参数的地方,产生的是最终的参数和SQL,也是插件需要拿到它从而拿到当前运行的sql和参数,包含三个属性:
-
可以获取Mapper的接口,也可以发送SQL语句执行返回结果。
有两个默认的实现类 -
- DefaultSqlSession 单线程使用
-
- SqlSessionManager 多线程使用
-
SqlSession完成数据库操作和返回操作结果需要的对象
-
- Executor 执行器对象,调度以下三个对象执行
-
- StatementHandler 数据库会话器对象,使用数据库的Statement/PreparedStatement执行操作,是最为核心的一个对象
-
- ParameterHandler 参数处理器对象,处理SQL参数
-
- ResultSetHandler 结果处理器对象,进行数据集(ResultSet)的封装并返回
这仅仅是一个浅谈,概述!
需要对于代理理解的很清楚便更加容易理解核心组件的运行和构建方式。