Mybatis
2020-07-24 17:35:47 0 举报
AI智能生成
mybatis思维导图
作者其他创作
大纲/内容
JDBC执行过程
加载JDBC驱动
建立并获取数据连接
创建JDBC Statements对象
设置SQL语句的传入参数
执行SQL语句并获取查询结果
对查询结果进行处理并将结果返回
释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)
mybatis核心组件
Configration:mybatis所有的配置信息都存放在这个对象中
映射器
MappedStatement:保存映射器的一个节点,保存我们配置的SQL,SQL的ID等信息
SqlSource:提供BoundSql对象的地方,是MappedStatement的一个属性
BoundSql:建立SQL和参数的地方
Executor:执行器,调度StatementHandler、ParameterHandler、ResultHandler
SimpleExecutor(简易执行器,默认的执行器)
ReuseExecutor(重用预处理的执行器)
BatchExecutor(执行器重用语句和批量更新,是针对批量专用的执行器)
StatementHandler(数据库会话器):使用数据库的Statement(PreparedStatement)执行操作
SimpleStatementHandler
PreparedStatementHandler
CallableStatementHandler
ParameterHandler:负责将用户的参数转换为JDBC Statement所需要的参数
ResultHandler:将JDBC返回的结果集转换为JAVA对象
SqlSessionFactory创建过程
根据mybatis配置文件信息,创建Configration对象,并初始化
1.解析configuration xml节点
2.设置自定义的properties属性
3.设置自定义的Vfs实现(虚拟文件系统)
4.设置日志实现类
5.注册自定义的对象别名(支持扫描包,类需要用Alias注解修饰)
6.注册自定义的拦截器
7.设置自定义的对象工厂,在获取查询结果时会调用
8.设置一些处理动作,如数据库字段与java对象默认匹配规则驼峰,默认的Excutor等
9.设置环境变量,主要是数据源的配置,以及采用的事务类型
10.设置databaseId,用于区分数据库厂商,以便执行特定的sql语言
11.注册类型处理器,用于javaType与jdbcType的转换
12.处理mapper.xml和接口
1.接口中方法与对应的sql语句是通过 方法全路径 = xml文件中命名空间+sql id
2.在这个处理过程中将会为mapper接口生成代理对象工厂MapperProxyFactory
3.会创建各自的映射器
3.注意点
文件位置
1.xml文件与mapper文件在同一目录,直接在mappers节点配置扫描package信息,在处理接口时会同时处理xml文件(类的全路径变成xml的全路径)
2.xml与mapper存放的路径不在一起,则需要先配置接口的信息,再配置xml文件配置信息,否则会报错(接口注册的时候会判断是否已存在,存在就会报错,而通过xml注册接口时不会校验)
注解与xml同一个方法上只能使用一个
在初始化完Configration对象后,会创建DefaultSqlSessionFactory对象实例并返回
SqlSession执行过程
插件(plugins)
mybatis允许你在已映射语句执行过程中的某一点进行拦截调用
拦截点
Executor
update、query....
ParameterHandler
getParamterObject 、setParameters
ResultSetHandler
handleResultSets,HandleOutputParameters
StatementHandler
prepare、parameterize、batch、update、query
实现方式
实现Interceptor接口中 intercept方法,并指定想要拦截类型和方法签名
例子
实现原理
对原有的对象进行了代理,调用proceed方法调用之前的之前的对象的方法(githup分页插件直接自己执行,不给其他代理执行的机会)
githup的分页插件原理
1.通过ThreadLocal放置分页参数
2.配置拦截器拦截Executor的query方法
3.根据数据库类型修改查询的sql(统计sql和分页sql)
4.查询完成后清空ThreadLocal的分页参数
mybatis与spring
单独使用
与spring整合原理
mybatis提供了与spring整合的jar包:mybatis-spring
利用Spring的FactoryBean接口特性(自定义bean对象的创建过程)
核心类
SqlSessionFactoryBean
实现FactoryBean 和 InitializingBean,使用afterPropertiesSet完成SqlSessionFactory的初始化,通过getObject方法将创建的对象提供出去
MapperFactoryBean
实现FactoryBean接口,继承SqlSessionDaoSupport
通过MapperScannerRegistrar扫描@MapperScan注解mapper接口,修改mapper类型为MapperFactoryBean,spring容器获取实现类时,通过SqlSession获取Configration对象,再获取mapper代理实现
SqlSessionDaoSupport
继承DaoSupport,DaoSupport实现了InitializingBean,通过afterPropertiesSet确保Spring容器中持有的mapper代理对象与mybaits.configration中持有的mapper对象匹配
sqlSessionTemplate
该对象由SqlSessionDaoSupport持有,在spring为SqlSessionDaoSupport设置SqlSessionFactory进行初始化
SqlSessionTemplate对sqlSession对象进行了代理(DefualtSqlSession非线程安全),代理实现类为SqlSessionInterceptor,可以从spring上下文事务中获取sqlSession(TransactionSynchronizationManager 、SqlSessionHolder)
多数据源切换方案
AbstractRoutingDataSource + AOP(事务??)
利用mybatis的plugin,在执行前进行切换
每个数据源对应一个SqlSessionFactoryBean,在扫描的时候指定MapperScan使用的SqlSessionFactory
0 条评论
下一页