网站建设规划书网页视频下载器破解版

bicheng/2026/1/22 15:51:05/文章来源:
网站建设规划书,网页视频下载器破解版,wordpress判断浏览器,网站建好后Mybatis中的设计模式 Mybatis中使用了大量的设计模式。 以下列举一些看源码时#xff0c;觉得还不错的用法#xff1a; 创建型模式 工厂方法模式 DataSourceFactory 通过不同的子类工厂#xff0c;实例化不同的DataSource TransactionFactory 通过不同的工厂#xff…Mybatis中的设计模式 Mybatis中使用了大量的设计模式。 以下列举一些看源码时觉得还不错的用法 创建型模式 工厂方法模式 DataSourceFactory 通过不同的子类工厂实例化不同的DataSource TransactionFactory 通过不同的工厂生产不同的Transaction 单例模式 ErrorContext是单例模式但只是线程级别的 private static final ThreadLocalErrorContext LOCAL new ThreadLocal();private ErrorContext() {}public static ErrorContext instance() {ErrorContext context LOCAL.get();if (context null) {context new ErrorContext();LOCAL.set(context);}return context;}Configuration 类虽然正常情况下只有一个实例但是它的设计并不符合单例模式 public Configuration(Environment environment) {this();this.environment environment;}可以看到它的构造器并没有私有化我们可以new多个实例 LogFactory也不是单例模式每次都会通过构造器实例化对象 private LogFactory() {// disable construction}public static Log getLog(Class? aClass) {return getLog(aClass.getName());}public static Log getLog(String logger) {try {return logConstructor.newInstance(logger);} catch (Throwable t) {throw new LogException(Error creating logger for logger logger . Cause: t, t);}}结构型模式 代理模式 在初始化配置时会调用MapperRegistry的addMapper方法将Mapper接口存储在knownMappers中key为Mapper接口value为MapperProxyFactory实例 public T void addMapper(ClassT type) {if (type.isInterface()) {if (hasMapper(type)) {throw new BindingException(Type type is already known to the MapperRegistry.);}boolean loadCompleted false;try {knownMappers.put(type, new MapperProxyFactory(type));// Its important that the type is added before the parser is run// otherwise the binding may automatically be attempted by the// mapper parser. If the type is already known, it wont try.MapperAnnotationBuilder parser new MapperAnnotationBuilder(config, type);parser.parse();loadCompleted true;} finally {if (!loadCompleted) {knownMappers.remove(type);}}}}当我们通过UserMapper mapper sqlSession.getMapper(UserMapper.class);获取Mapper接口时则会调用MapperRegistry#getMapper返回Mapper接口的代理类 public T T getMapper(ClassT type, SqlSession sqlSession) {final MapperProxyFactoryT mapperProxyFactory (MapperProxyFactoryT) knownMappers.get(type);if (mapperProxyFactory null) {throw new BindingException(Type type is not known to the MapperRegistry.);}try {return mapperProxyFactory.newInstance(sqlSession);} catch (Exception e) {throw new BindingException(Error getting mapper instance. Cause: e, e);}}代理类的生成 public T newInstance(SqlSession sqlSession) {final MapperProxyT mapperProxy new MapperProxy(sqlSession, mapperInterface, methodCache);return newInstance(mapperProxy);}protected T newInstance(MapperProxyT mapperProxy) {return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);}可以看到使用的是JDK动态代理MapperProxy实现了InvocationHandler接口我们关注MapperProxy#invoke即可 Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try {if (Object.class.equals(method.getDeclaringClass())) {return method.invoke(this, args);} else if (method.isDefault()) {return invokeDefaultMethod(proxy, method, args);}} catch (Throwable t) {throw ExceptionUtil.unwrapThrowable(t);}final MapperMethod mapperMethod cachedMapperMethod(method);return mapperMethod.execute(sqlSession, args);}调用mapper接口最终执行的就是我们编写的SQL 行为型模式 模板方法模式 BaseExecutor BaseExecutor实现了Executor接口定义了模板方法并将钩子方法留给子类实现 模板方法钩子方法querydoQueryupdatedoUpdateflushStatementsdoFlushStatementsqueryCursordoQueryCursor BaseTypeHandler BaseTypeHandler实现了TypeHandler接口定义模板方法将钩子方法留给子类实现 setNonNullParameter getNullableResult 模板方法钩子方法setParametersetNonNullParametergetResult(ResultSet rs, String columnName)getNullableResult(ResultSet rs, String columnName)getResult(ResultSet rs, int columnIndex)getNullableResult(ResultSet rs, int columnIndex)getResult(CallableStatement cs, int columnIndex)getNullableResult(CallableStatement cs, int columnIndex) 策略模式 在DefaultParameterHandler#setParameters中 Overridepublic void setParameters(PreparedStatement ps) {ErrorContext.instance().activity(setting parameters).object(mappedStatement.getParameterMap().getId());ListParameterMapping parameterMappings boundSql.getParameterMappings();if (parameterMappings ! null) {for (int i 0; i parameterMappings.size(); i) {ParameterMapping parameterMapping parameterMappings.get(i);if (parameterMapping.getMode() ! ParameterMode.OUT) {Object value;String propertyName parameterMapping.getProperty();if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional paramsvalue boundSql.getAdditionalParameter(propertyName);} else if (parameterObject null) {value null;} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {value parameterObject;} else {MetaObject metaObject configuration.newMetaObject(parameterObject);value metaObject.getValue(propertyName);}TypeHandler typeHandler parameterMapping.getTypeHandler();JdbcType jdbcType parameterMapping.getJdbcType();if (value null jdbcType null) {jdbcType configuration.getJdbcTypeForNull();}try {typeHandler.setParameter(ps, i 1, value, jdbcType);} catch (TypeException | SQLException e) {throw new TypeException(Could not set parameters for mapping: parameterMapping . Cause: e, e);}}}}}重点关注 TypeHandler typeHandler parameterMapping.getTypeHandler();JdbcType jdbcType parameterMapping.getJdbcType();if (value null jdbcType null) {jdbcType configuration.getJdbcTypeForNull();}try {typeHandler.setParameter(ps, i 1, value, jdbcType);} catch (TypeException | SQLException e) {throw new TypeException(Could not set parameters for mapping: parameterMapping . Cause: e, e);}根据参数映射拿到类型处理器就是策略模式的应用不同的类型处理器setParameter方法实现并不一样这就是不同的参数类型使用不同的类型处理器处理。 在解析结果集时也是一样的不同的类型需要使用不同的类型处理器获取结果 DefaultResultSetHandler#getPropertyMappingValue通过ResultMap的属性映射 private Object getPropertyMappingValue(ResultSet rs, MetaObject metaResultObject, ResultMapping propertyMapping, ResultLoaderMap lazyLoader, String columnPrefix)throws SQLException {if (propertyMapping.getNestedQueryId() ! null) {return getNestedQueryMappingValue(rs, metaResultObject, propertyMapping, lazyLoader, columnPrefix);} else if (propertyMapping.getResultSet() ! null) {addPendingChildRelation(rs, metaResultObject, propertyMapping); // TODO is that OK?return DEFERRED;} else {final TypeHandler? typeHandler propertyMapping.getTypeHandler();final String column prependPrefix(propertyMapping.getColumn(), columnPrefix);return typeHandler.getResult(rs, column);}}DefaultResultSetHandler#applyAutomaticMappings自动映射也是一样的 private boolean applyAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, String columnPrefix) throws SQLException {ListUnMappedColumnAutoMapping autoMapping createAutomaticMappings(rsw, resultMap, metaObject, columnPrefix);boolean foundValues false;if (!autoMapping.isEmpty()) {for (UnMappedColumnAutoMapping mapping : autoMapping) {final Object value mapping.typeHandler.getResult(rsw.getResultSet(), mapping.column);if (value ! null) {foundValues true;}if (value ! null || (configuration.isCallSettersOnNulls() !mapping.primitive)) {// gcode issue #377, call setter on nulls (value is not found)metaObject.setValue(mapping.property, value);}}}return foundValues;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

室内设计网站哪些号网站开发业务需求分析

目录 《Python数据分析初探》项目报告 基于Python数据可视化的网易云音乐歌单分析系统一、项目简介(一)项目背景(二)项目过程 二、项目设计流程图(一)基于Python数据可视化的网易云音乐歌单分析系统的整体…

济南建设高端网站郑州网站建设老牌公司

Flink 运行架构和核心概念 几个角色的作用: 客户端:提交作业JobManager进程 任务管理调度 JobMaster线程 一个job对应一个JobMaster 负责处理单个作业ResourceManager 资源的分配和管理,资源就是任务槽分发器 提交应用,为每一个…

太原网站建设方案策划win2012 网站建设

面试题1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但只能在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义…

沈阳模板建站哪家好wordpress simplicity

“Ah ha,发现你了!”你的经理突然从桌子后面的假花旁冒出来,发出胜利的叫声。你沮丧地转过头看着经理。 “我已经创建了一个基本报表,并抓取了一些数据,我正打算-”你在他打断你之前快速的解释着。 “赶紧做完就好,大B…

织梦多语言网站网站架构教程

正题 题目链接:https://www.luogu.com.cn/problem/P3327 题目大意 TTT组询问给出n,mn,mn,m,d(x)d(x)d(x)表示xxx的约数个数,求∑i1n∑j1md(i∗j)\sum_{i1}^n\sum_{j1}^md(i*j)i1∑n​j1∑m​d(i∗j) 解题思路 对于iii和jjj的两个约数a,ba,ba,b如果他们…

成品网站 售卖建筑设计师要学什么专业

软件实例,物流货运配货单打印模板软件单据打印查询管理系统软件教程,可以同时打印标签或补打 一、前言 以下软件教程以 佳易王物流单打印查询系统V17.1为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 这个版本在原来基…

摄影网站app怎么做网络运营

国际荐酒师(香港)协会亮相第六届知交会暨地博会,助力中欧地理标志产品交流合作 12月9日,第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会(以下简称“第六届知交会暨地博会”)在中新广州…

购物网站seo相亲网站用什么做的

患者在就诊之前一直使用的二甲双胍和达格列净这两种降糖药物,这两种药对于控制血糖是有一定效果的。北京崇文门医院朱学敏主任的建议是继续服用,然后患者空腹血糖在7-8mmol/L左右,餐后血糖稍高,达到9-10mmol/L,但总体上…

获取网站访客qq代码亿网

C后端开发之Sylar学习三:VSCode连接Ubuntu配置Gitee 为了记录学习的过程,学习Sylar时写的代码统一提交到Gitee仓库中。 Ubuntu配置Gitee 安装git sudo apt-get install -y git配置用户名和邮箱 git config --global user.name 用户名 …

js网站繁体如何自己设计装修效果图

文章目录 什么是 NVMe?什么是固态硬盘?为什么 NVMe 很重要?NVMe、SAS 和 SATA 之间的区别只有SSD运行在NVMe上PCIe和NVMe有关系,但它们不是同一个东西NVMe-oF连接SSD到网络NVMe 的工作原理是什么?NVMe SSD 外形尺寸M.2…

资质做网站需要用到什么郑州企业网站建设团队

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:JavaScript进阶指南 👐学习格言:成功不是终点,失败也并非末日,最重要的是继…

php做的购物网站代码专门做网站制作的公司

动态规划:有很多重叠子问题,每一个状态一定是由上一个状态推导出来的 贪心:没有状态推导,而是从局部直接选最优的 动规五步曲: 确定dp数组(dp table)以及下标的含义 确定递推公式(容…

做平台网站一般有php还是js南阳市网站建设

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、SpringBoot…

无锡高端网站设计公司网站进入沙盒后

上次小伍带大家看了部分机房的照片,并且简单介绍了一下电梯能量回馈装置,小伙伴们表示很新奇,没看够,今天小伍又来了,带大家看一下电梯能量回馈装置到底安装在电梯什么位置。跟着小伍去看看吧。Lets go! 电…

夫妻找做伙食饭工作哪个网站好四川网站建设费用

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型。纺织工业作为传统制造业的重要组成部分,面临着转型升级的紧迫需求。随着5G技术的快速发展,智能制造成为纺织工业转型升级的重要方向。数字孪生可视化平台作为智能制造的核心技…

宝安网站建设方案外包制作相册app

基础数据结构 ngx_int_t 32位操作系统4字节,64位操作系统8字节 解决跨平台以及,普通int类型在x86和x64操作系统上面是4字节,在类型转换时造成内存浪费(如在x64下面转换long类型) typedef intptr_t ngx_int_t;#ifdef _WIN64 typedef __int64 intptr_t; #else typedef _…

国际外贸网站推广二维码制作生成器

MyBatis 支持一对一,一对多,多对多查询。XML 文件和注解都能实现关系的操作。多对多实质就是一对多 1. 表关系的维护 1.1 One一对一 一对一查询和多表(两表)查询很相似, 都能查询两表的全部属性 区别是一对一可以在对象中嵌套对象, 呈现包含关系; 多表…

企业网站系统官网网站 添加备案号

[html] 前端需要注意哪些SEO? 合理的title,description,keyswords 搜索引擎对这三项的权重逐个减小,title 值强调重点即可,重要的关键词出现不要超过两次,而且要靠前。2 、不同页面的tilte要有所不同;desc…

有个人做网站的吗云南旅游网站建设公司

《[含文档PPT源码等]精品Nodejs实现的校园疫情防控管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 操作系统:Windows 10、Windows 7、Win…

贸易网站源码中国最好的网络营销公司

Chrony 是一款开源的网络时间协议(NTP)客户端和服务端软件,旨在提供高精度的时间同步功能。相较于传统的 NTP 实现如 ntpd,Chrony 提供了一些改进和优势,包括更快的同步速度、低延迟、低CPU占用和低内存消耗。以下是 Chrony 的几个关键特性和…