当前位置: 首页 > news >正文

网罗设计网站网页qq小游戏

网罗设计网站,网页qq小游戏,怎么做营销型网站设计,怎么开免费网站Mybatis源码分析 Mybatis源码分析入口1. 读取配置文件总结 2. 解析配置文件核心代码#xff08;一#xff09;核心代码#xff08;二#xff09;分析parse()方法分析build()方法 总结 3. 获取SqlSession总结 4. 获取mapper代理对象总结 5. 使用mapper代理对象执行Sql语句二… Mybatis源码分析 Mybatis源码分析入口1. 读取配置文件总结 2. 解析配置文件核心代码一核心代码二分析parse()方法分析build()方法 总结 3. 获取SqlSession总结 4. 获取mapper代理对象总结 5. 使用mapper代理对象执行Sql语句二级缓存一级缓存总结 Mybatis源码分析入口 本文将根据下面这段代码进行源码分析 InputStream inputStream Resources.getResourceAsStream(mybatis-config.xml); SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession sqlSessionFactory.openSession(); UserMapper mapper sqlSession.getMapper(UserMapper.class); ListUserEntity list mapper.listUser(); System.out.println(list); sqlSession.close();1. 读取配置文件 InputStream inputStream Resources.getResourceAsStream(mybatis-config.xml);ClassLoaderWrapper.java 总结 从入口一路点击进去可以发现底层是通过调用java.lang.ClassLoader#getResourceAsStream方法来读取resources目录下的mybatis-config.xml文件并得到InputStream对象 2. 解析配置文件 SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);SqlSessionFactoryBuilder.java 核心代码一 XMLConfigBuilder parser new XMLConfigBuilder(inputStream, environment, properties);XMLConfigBuilder.java XPathParser.java 可以发现底层是将InputStream对象转换成Document对象并将Document对象保存至当前类XPathParser的document属性中 继续回到上一层点击进入this()方法 XMLConfigBuilder.java 可以发现this()方法主要是在进行部分属性的初始化并将XPathParser对象保存至当前类XMLConfigBuilder的parser属性中。 关键点初始化了父类的configuration属性。 核心代码二 return build(parser.parse());分析parse()方法 XMLConfigBuilder.java 根据Document对象获取节点为configuration的配置信息并转换成XNode对象 XPathParser.java 将XNode对象解析成Configuration对象 XMLConfigBuilder.java XMLConfigBuilder.java 点击进入addMappers(mapperPackage)方法 Configuration.java MapperRegistry.java 从这里可以发现parser.parse()主要是在解析配置文件mybatis-config.xml具体过程是根据Document对象获取节点为configuration的配置信息并转换成XNode对象再解析各个节点重点部分是mappers节点的解析。 在解析mappers节点的代码中可以发现如果是使用package或class注册mapper可以直接注册mapper接口对象如果是使用url或者resource注册mapper则需要先解析mapper.xml映射文件后并通过namespace找到所绑定的接口对象再进行注册。 mapper的注册是通过MapperRegistry对象完成的而MapperRegistry则是Configuration对象里面的一个属性也就是说所有的配置解析完成后都存放在Configuration对象中。 parser.parse()最终返回Configuration对象。 分析build()方法 SqlSessionFactoryBuilder.java DefaultSqlSessionFactory.java 从这里可以发现SqlSessionFactoryBuilder将得到的Configuration对象建造成DefaultSqlSessionFactory对象也就是SqlSessionFactory对象。 总结 SqlSessionFactoryBuilder先是通过XMLConfigBuilder解析配置文件并将解析得到的配置装载到Configuration对象中再将Configuration建造成DefaultSqlSessionFactory对象。 这里采用了建造者设计模式 BaseBuilder所有解析器的父类包含配置文件实例为解析文件提供一些通用的方法 XMLConfigBuilder主要负责解析mybatis-config.xml文件 XMLMapperBuilder主要负责解析mapper.xml文件 XMLStatementBuilder主要负责解析映射文件中的SQL节点 Configuration对象核心属性释义 MapperRegistrymapper接口动态代理工厂类的注册中心ResultMap用于解析mapper.xml文件中的resultMap节点使用ResultMapping来封装id、result等子元素MappedStatement用于存储mapper.xml文件中的select、insert、update和delete节点同时还包含了这些节点的很多重要属性SqlSource用于创建BoundSqlmapper.xml文件中的sql语句会被解析成BoundSql对象经过解析BoundSql包含的语句最终仅仅包含占位符可以直接提交给数据库执行 3. 获取SqlSession SqlSession sqlSession sqlSessionFactory.openSession();DefaultSqlSessionFactory.java Configuration.java 从这里可以看到如果没有设置执行器类型则会默认使用简单执行器类型 ExecutorType.java 上面枚举类中的三种执行器类型均可通过openSession()传参设置 点击进入openSessionFromDataSource()方法 DefaultSqlSessionFactory.java openSessionFromDataSource()方法有三个入参ExecutorType execType执行器类型、TransactionIsolationLevel level事务隔离级别、boolean autoCommit是否自动提交 获取TransactionFactory DefaultSqlSessionFactory.java TransactionFactory有两种JdbcTransactionFactoryManagedTransactionFactory 通过mybatis-config.xml文件进行配置 transactionManager typeJDBC/这里配置的是JdbcTransactionFactory 获取Transaction JdbcTransactionFactory.java JdbcTransaction.java 根据Transaction和执行器类型获取执行器核心代码 Configuration.java CachingExecutor.java Mybatis默认使用的执行器是SimpleExecutorSimpleExecutor的父类是BaseExecutorBaseExecutor下一共有三个子类也就是三种执行器BatchExecutor、SimpleExecutor、ReuseExecutor这三种执行器均可通过传值设置。 cacheEnabled默认值为true说明Mybatis默认会使用CachingExecutor。进入CachingExecutor类可以发现CachingExecutor是在上面三种执行器BaseExecutor的基础上做了一层包装装饰器设计模式先调用CachingExecutor再调用BaseExecutor是对BaseExecutor类的增强。 cacheEnabled可以通过mybatis-config.xml文件进行配置 settings!-- 是否开启二级缓存 --setting namecacheEnabled valuefalse/ /settingsBaseExecutor是一级缓存默认开启默认使用SimpleExecutorCachingExecutor是二级缓存默认开启但还需要做一些额外的配置才能生效 生成DefaultSqlSession 将Configuration、Executor、autoCommit等信息包装成DefaultSqlSession对象并且返回该对象 总结 openSession()是SqlSessionFactory接口中的一个重载方法可以配置执行器类型、事务隔离级别、是否自动提交等参数Configuration负责判断当前使用的执行器ExecutorDefaultSqlSessionFactory最后将Configuration、Executor、autoCommit等信息包装成DefaultSqlSession对象并返回。 这里采用了装饰器设计模式 BaseExecutor是一级缓存默认开启BaseExecutor是BatchExecutor、SimpleExecutor、ReuseExecutor三种执行器的父类。 SimpleExecutor默认的Executor每个SQL执行的时候都会创建新的StatementReuseExecutor相同的SQL会重复使用StatementBatchExecutor用于批处理的Executor CachingExecutor是二级缓存默认开启但还需要做一些额外的配置才能生效 CachingExecutor可缓存数据的Executor用装饰器模式包装了其它的执行器如BaseExecutor下的三种执行器 4. 获取mapper代理对象 UserMapper mapper sqlSession.getMapper(UserMapper.class);DefaultSqlSession.java Configuration.java MapperRegistry.java 之前已经对mapper接口进行了注册这里通过mapper接口类型获取对应的动态代理工厂类MapperProxyFactory动态代理工厂类使用JDK动态代理技术生成mapper代理对象并返回该对象。 MapperProxyFactory.java MapperProxy.java JDK动态代理技术主要用于拦截和修改方法的调用在使用mapper代理对象调用mapper接口中的方法时MapperProxy中的invoke方法也会被执行。 总结 根据mapper接口类型从MapperRegistry中获取对应的动态代理工厂类MapperProxyFactory动态代理工厂类使用JDK动态代理技术生成mapper代理对象并返回该对象。在使用mapper代理对象调用方法时底层会走MapperProxy中的invoke方法。 这里采用了JDK动态代理设计模式 MapperRegistrymapper接口动态代理工厂类的注册中心 MapperProxyFactory用于生成动态代理的实例对象 MapperProxy动态代理回调类 5. 使用mapper代理对象执行Sql语句 ListUserEntity list mapper.listUser();MapperProxy.java 核心代码 mapperMethod.execute(sqlSession, args);MapperMethod.java 因为执行的SQL为select返回值类型为List集合所以会走executeForMany()方法 DefaultSqlSession.java 这个方法是不是很熟悉没错这就是在基于XML方式-原生方式开发用到的方法 ListUserEntity list sqlSession.selectList(com.mybatis.mapper.UserMapper.listUser, UserEntity.class);DefaultSqlSession.java 二级缓存 如果开启了二级缓存则会使用CachingExecutor CachingExecutor.java 获取SQL语句 创建缓存key 执行查询逻辑 SimpleExecutor中没有query方法默认走父类BaseExecutor 一级缓存 BaseExecutor.java SimpleExecutor.java 初始化RoutingStatementHandler对象 Configuration.java RoutingStatementHandler.java 生成Statement对象 SimpleExecutor.java 2.1. 获取Connection BaseExecutor.java JdbcTransaction.java 2.2. 根据不同的StatementHandler创建Statement对象 RoutingStatementHandler.java BaseStatementHandler.java Mybatis默认采用PreparedStatementHandler处理器 PreparedStatementHandler.java 2.3. 使用ParameterHandler处理占位符参数 RoutingStatementHandler.java PreparedStatementHandler.java DefaultParameterHandler.java 执行查询逻辑 RoutingStatementHandler.java PreparedStatementHandler.java DefaultResultSetHandler.java 总结 在使用代理对象调用方法时底层会走MapperProxy中的invoke方法在执行查询语句时默认会先从二级缓存CachingExecutor中读取数据如果存在则直接返回不存在则继续查询一级缓存如果一级缓存BaseExecutor中存在则直接返回不存在则继续查询数据库在查询数据库时总体上使用StatementHandler对象和JDBC进行交互整个查询流程先是使用ParameterHandler对SQL语句的入参进行处理待SQL语句被执行完后得到结果集再使用ResultSetHandler对结果集进行处理并返回。 四大核心接口对象 Executor执行器负责整个SQL执行过程的总体控制StatementHandler语句处理器负责和JDBC层的具体交互ParameterHandler参数处理器负责PreparedStatement入参的具体设置ResultSetHandler结果集处理器负责将JDBC查询的结果映射为Java对象 StatementHandler RoutingStatementHandler根据StatementType路由到不同的StatementHandler对象SimpleStatementHandler管理Statement对象并向数据库中推送不需要预编译的SQL语句PreparedStatementHandler管理Statement对象并向数据库中推送需要预编译的SQL语句CallableStatementHandler管理Statement对象并调用数据库中的存储过程
http://www.pierceye.com/news/67927/

相关文章:

  • 如何自己建公司网站福州住房建设厅网站
  • wordpress 图片缩略图网站关键词优化价格
  • vs2017html5网站开发汉阳网站推广
  • 网站备案更改南京价格网站建设
  • 杭州高端网站长沙网站搜索引擎优化
  • 网站建设的er图海南在线人才
  • 如何在word上做网站网址个人网站备案需要哪些
  • 网站开发怎么实现用户一对一发文字图片郑州做网站的企业
  • 有没有什么网站做兼职兰州app开发
  • 网站搜索关键词优化网站建设外包协议
  • 重点实验室网站建设的研究现状wordpress移动端不显示图片
  • 免费seo网站关键词看片
  • 福田做网站多少钱WordPress的jquery
  • 重庆南岸营销型网站建设公司哪家好游戏平台搭建
  • 校园网站如何管理学校网站怎么建设视频
  • 怎么把做的页面放到网站上如何建设企业的网站
  • 网站开发实训报告模板网站建设滨江
  • 高端网站建设联系方式晋城网站制作
  • 延边延吉网站建设想要网站导航正式推广
  • 用记事本做网站怎么添加表格手机上设计logo的app
  • 建筑公司网站需求免费网站制作平台
  • 网站建设与开发英文文献山东省建设协会网站首页
  • 用手机怎么做网站做网站时如何上传图片
  • 邢台365生活网seo发包软件
  • 网站建设论坛dede一键更新网站出错
  • 网站建设与网站优化销售网站群系统破解版
  • 潍坊百度网站优化企业安全文化的建设方案
  • 网站地图的好处成都网站制作定制
  • h5语言网站制作wordpress 图片边框
  • 院校建设网站群的原因网站维护建设需要什么花费