jdbc与mybatis
jacobbbbbbbb
一个java学习者的学习笔记
展开
-
Spring整合Mybatis源码分析
SqlSessionFactoryBean//实现 FactoryBean、InitializingBean、ApplicationListener 接口public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> { private static final Lo原创 2020-07-04 13:40:29 · 98 阅读 · 0 评论 -
MyBatis源码解析--加载流程(11)
接下来分析接口层,首先从SqlSession接口开始:public interface SqlSession extends Closeable { //泛型方法,经过查询返回一个指定的对象 <T> T selectOne(String statement); //根据传入的条件查询结果 <T> T selectOne(String statement, Object parameter); //经过查询,返回泛型集合 <E> List<原创 2020-07-03 13:59:17 · 127 阅读 · 0 评论 -
MyBatis源码解析--加载流程(10)
//继续DefaultResultSetHandler//创建数据库映射的结果对象private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, String columnPrefix) throws SQLException {//标识是否使用构造函数创建该结果对象 this.useConstructorMappings = false;原创 2020-07-03 10:18:33 · 184 阅读 · 0 评论 -
MyBatis源码解析--加载流程(9)
ResultSetHandler 会将查询结果的ResultSet转换成映射的对应结果ResultSetWrapperpublic class ResultSetWrapper {//ResultSet对象 private final ResultSet resultSet; private final TypeHandlerRegistry typeHandlerRegistry; //字段名称的数组 private final List<String> columnN原创 2020-07-03 10:18:15 · 114 阅读 · 0 评论 -
MyBatis源码解析--加载流程(8)
上篇讲完了Executor接口及其实现类,接下来分析StatementHandler,这是Executor用来处理Statement的。首先是StatementHandler的接口public interface StatementHandler { //从连接中获取一个Statement Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException; //占位符原创 2020-06-27 14:32:10 · 108 阅读 · 0 评论 -
MyBatis源码解析--加载流程(7)
SimpleExecutor前面已经介绍了BaseExecutor,是Executor接口的直接继承,作用是提供模版,为它的继承类可以直接继承方法,其中SimpleExecutor会不需要关心一级缓存的问题,只要实现四个基本方法就可以。public class SimpleExecutor extends BaseExecutor { public SimpleExecutor(Configuration configuration, Transaction transaction) {原创 2020-06-26 23:12:09 · 99 阅读 · 0 评论 -
MyBatis源码解析--加载流程(6)
BoundSql 一次可执行的SQL封装public class BoundSql {//SQL语句 private final String sql; //ParameterMapping 数组 private final List<ParameterMapping> parameterMappings; //参数对象 private final Object parameterObject; //附加的参数集合 private final Map<原创 2020-06-26 12:57:37 · 122 阅读 · 0 评论 -
MyBatis源码解析--加载流程(5)
StaticTextSqlNode 静态文本的SqlNode实现类public class StaticTextSqlNode implements SqlNode {//静态文本 private final String text; public StaticTextSqlNode(String text) { this.text = text; } @Override //直接拼接到context中 public boolean apply(DynamicCon原创 2020-06-19 17:24:37 · 113 阅读 · 0 评论 -
MyBatis源码解析--加载流程(4)
接下来是解析sql语句,对应的是scripting包,实现了动态SQL语句的功能。LanguageDriver 语言驱动接口public interface LanguageDriver {//创建ParameterHandler对象 ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);//创建sqlSource,从原创 2020-06-19 13:15:37 · 90 阅读 · 0 评论 -
MyBatis源码解析--加载流程(4)
接下来是注解配置的解析,入口是MapperRegistry.addMapperpublic <T> void addMapper(Class<T> type) {//首先判断必须是接口 if (type.isInterface()) { if (hasMapper(type)) { throw new BindingException("Type " + type + " is already known to the MapperRe原创 2020-06-15 16:52:53 · 139 阅读 · 0 评论 -
MyBatis源码解析--加载流程(3)
MapperBuilderAssistant 继承BaseBuilder抽象类,提供了一些公用的方法public class MapperBuilderAssistant extends BaseBuilder {//当前Mapper命名空间 private String currentNamespace; //资源引用的地址 private final String resource; //当前的Cache对象 private Cache currentCache; //是否原创 2020-06-15 11:29:34 · 122 阅读 · 0 评论 -
MyBatis源码解析--加载流程(2)
上文分析到解析完mybatis-config.xml,将其中的信息装载进入configuration,并且生成了包含成员变量configuration的实例DefaultSqlSessionFactory。但其中有个还没有解析就是如果mapper使用url或者resource配置的时候,需要先解析对应的mapper.xml以便向mapperRegistry注册mapper。XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, c原创 2020-06-14 21:05:10 · 153 阅读 · 0 评论 -
MyBatis源码解析--加载流程(1)
分析完11个提供支持的模块,接下来就完整地debug一遍加载的流程。首先看下简单的流程:1.初始化会加载mybatis-config.xml配置文件、mapper映射配置文件以及Mapper接口中的注解信息,这些信息都会形成相应的对象并保存到Configuration中。2.利用Configuration创建SqlSessionFactory对象。3.通过SqlSessionFactory创建SqlSession对象进行相关的数据库操作。那么首先就从加载mybatis-config.xml文件开始原创 2020-06-14 12:54:16 · 204 阅读 · 0 评论 -
MyBatis源码解析--基础支持层(8)
10.注解模块对应的annotation包,使得我们可以再Mapper接口上编写简单的数据库SQL。CRUD相关的注解:@Insert、@Update、@Delete、@Select 四个最主要的,其次还有@UpdateProvider、@DeleteProvider、@SelectProvider、@InsertProvider、@MapKey、@Options、@SelelctKey、@Param。缓存相关的注解:@CacheNamespace、@Property、@CacheNamespaceR原创 2020-06-13 21:57:22 · 122 阅读 · 0 评论 -
MyBatis源码解析--基础支持层(7)
TypeAliasRegistry 类型和别名的注册表public class TypeAliasRegistry { private final Map<String, Class<?>> TYPE_ALIASES = new HashMap<>(); public TypeAliasRegistry() { registerAlias("string", String.class); registerAlias("byte", Byt原创 2020-06-13 14:27:46 · 82 阅读 · 0 评论 -
MyBatis源码解析--基础支持层(6)
7.类型模块对应的是type包 主要功能:1.为了简化配置提供了别名机制 2.实现JDBC类型和Java类型之间的转换首先是TypeHandler接口 类型转换处理器public interface TypeHandler<T> { void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; T getResult(ResultSe原创 2020-06-13 11:04:26 · 98 阅读 · 0 评论 -
MyBatis源码解析--基础支持层(5)
5.事务模块对应的是transaction包 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。很多时候是由spring框架管理事务。Transaction事务接口public interface Transaction {//获得连接 Connection getConnection() throws SQLException; //事务提交 void commit() throws SQLException; //事务回滚 void rollback() th原创 2020-06-12 12:51:03 · 77 阅读 · 0 评论 -
MyBatis源码解析--基础支持层(4)
三.异常模块对应的是exceptions包,定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常。除了exceptions包以外,其他包也有定义相应的异常类。IbatisException 一个遗弃的类,IBatis的异常基类@Deprecatedpublic class IbatisException extends RuntimeException { private static final long seri原创 2020-06-11 17:13:54 · 199 阅读 · 0 评论 -
MyBatis源码解析--基础支持层(3)
MetaObject 提供了对象的属性值的获取与设置等方法,是对BaseWrapper操作的进一步增强public class MetaObject { //原始的java对象 private final Object originalObject; //对对象的包装,抽象了对象的属性信息,他定义了一系列查询对象属性信息的方法,以及更新属性的方法; private final ObjectWrapper objectWrapper; private final ObjectFa原创 2020-06-11 12:19:41 · 124 阅读 · 0 评论 -
MyBatis源码解析--基础支持层(2)
继续上文中反射模块的解析,下一个类是ReflectorFactorypublic interface ReflectorFactory {//是否缓存Reflector对象 boolean isClassCacheEnabled(); void setClassCacheEnabled(boolean classCacheEnabled);//获取Reflector对象 Reflector findForClass(Class<?> type);}实现类DefaultRe原创 2020-06-11 09:16:40 · 129 阅读 · 0 评论 -
MyBatis源码解析--基础支持层(1)
一.基础支持层MyBatis的架构可以分为三层,分别是接口层,核心处理层以及基础支持层,按照从下至上的方式先从基础支持层开始,基础支持层具体有:1.解析器模块 2.反射模块 3.异常模块 4.数据源模块 5.事务模块 6.缓存模块 7.类型模块 8.IO模块 9.日志模块 10.注解模块 11.Binding模块1.解析器模块对应的是parsing包,主要有两个功能:1.是对于XPath的封装,为MyBatis初始化时解析mybatis-config.xml提供支持。2.处理动态SQL语句中的占原创 2020-06-10 16:42:31 · 157 阅读 · 0 评论 -
JDBCTemplate源码阅读
一.save/update功能的实现首先进入jdbcTemplate的update 方法 public int update(String sql, Object[] args, int[] argTypes) throws DataAccessException { return update(sql, newArgTypePreparedStatementSetter(args, argTypes)); } public int update(String sql, @Nullable P原创 2020-06-09 22:52:33 · 192 阅读 · 0 评论