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

jsp怎样做网站yandex俄语网站建设

jsp怎样做网站,yandex俄语网站建设,怎样查网站备案人的联系方式,如何把网站做的和别人一样吗MyBatis 的 Type 模块&#xff08;类型系统&#xff09;是框架实现 Java 类型与数据库类型映射的核心模块&#xff0c;其源码设计精巧且高度可扩展。以下从核心接口、注册机制、类型解析流程等角度&#xff0c;深入解析其源码实现。 一、核心接口与类结构 1. TypeHandler<T…

MyBatis 的 Type 模块(类型系统)是框架实现 Java 类型与数据库类型映射的核心模块,其源码设计精巧且高度可扩展。以下从核心接口注册机制类型解析流程等角度,深入解析其源码实现。


一、核心接口与类结构

1. TypeHandler<T> 接口

作用:定义 Java 类型与 JDBC 类型之间的转换逻辑。
源码位置org.apache.ibatis.type.TypeHandler
关键方法

public interface TypeHandler<T> {// 将 Java 类型参数设置到 PreparedStatement 中void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;// 从 ResultSet 中获取值并转换为 Java 类型(根据列名或列索引)T getResult(ResultSet rs, String columnName) throws SQLException;T getResult(ResultSet rs, int columnIndex) throws SQLException;T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}

实现类示例(内置处理器):

  • StringTypeHandler: 处理 StringVARCHAR
  • DateTypeHandler: 处理 DateTIMESTAMP
  • EnumTypeHandler: 处理枚举类型(按名称存储)
2. TypeHandlerRegistry

作用:全局注册所有 TypeHandler,维护类型映射关系。
源码位置org.apache.ibatis.type.TypeHandlerRegistry
核心数据结构

public final class TypeHandlerRegistry {// 存储 Java 类型 + JDBC 类型 → TypeHandler 的映射private final Map<JdbcType, TypeHandler<?>> jdbcTypeHandlerMap = new EnumMap<>(JdbcType.class);private final Map<Type, Map<JdbcType, TypeHandler<?>>> typeHandlerMap = new ConcurrentHashMap<>();// 默认 TypeHandler 注册(如 StringTypeHandler)public TypeHandlerRegistry() {register(String.class, new StringTypeHandler());register(Integer.class, new IntegerTypeHandler());// ... 其他内置处理器}
}

注册逻辑

public <T> void register(Class<T> javaType, TypeHandler<? extends T> typeHandler) {// 解析 @MappedJdbcTypes 和 @MappedTypes 注解MappedJdbcTypes mappedJdbcTypes = typeHandler.getClass().getAnnotation(MappedJdbcTypes.class);if (mappedJdbcTypes != null) {for (JdbcType jdbcType : mappedJdbcTypes.value()) {register(javaType, jdbcType, typeHandler);}}// 若未指定 JDBC 类型,注册为通用处理器register(javaType, null, typeHandler);
}
3. TypeAliasRegistry

作用:管理类型别名,简化 XML 配置中的类名书写。
源码位置org.apache.ibatis.type.TypeAliasRegistry
核心数据结构

public class TypeAliasRegistry {private final Map<String, Class<?>> typeAliases = new ConcurrentHashMap<>();// 内置别名注册(如 "string" → String.class)public TypeAliasRegistry() {registerAlias("string", String.class);registerAlias("int", Integer.class);// ... 其他内置别名}
}

别名解析流程

public <T> Class<T> resolveAlias(String alias) {if (alias == null) return null;String key = alias.toLowerCase(Locale.ENGLISH); // 别名不区分大小写Class<T> value;if (typeAliases.containsKey(key)) {value = (Class<T>) typeAliases.get(key);} else {// 尝试通过类加载器加载别名对应的类value = (Class<T>) Resources.classForName(alias);}return value;
}

二、类型处理流程

1. 参数设置(Java → JDBC)

当执行 SQL 时,MyBatis 通过 TypeHandler 将 Java 参数转换为 JDBC 类型。
核心入口org.apache.ibatis.scripting.defaults.DefaultParameterHandler
关键代码

public void setParameters(PreparedStatement ps) {for (int i = 0; i < parameterMappings.size(); i++) {Object parameterValue = ...; // 获取参数值TypeHandler typeHandler = parameterMapping.getTypeHandler();JdbcType jdbcType = parameterMapping.getJdbcType();typeHandler.setParameter(ps, i + 1, parameterValue, jdbcType); // 调用 TypeHandler}
}
2. 结果映射(JDBC → Java)

ResultSet 中读取数据时,MyBatis 通过 TypeHandler 将 JDBC 类型转换为 Java 类型。
核心入口org.apache.ibatis.executor.resultset.DefaultResultSetHandler
关键代码

private Object getPropertyMappingValue(ResultSet rs, ResultMapping resultMapping) {TypeHandler<?> typeHandler = resultMapping.getTypeHandler();String column = resultMapping.getColumn();return typeHandler.getResult(rs, column); // 调用 TypeHandler
}

三、类型解析与自动发现

1. 类型解析优先级

MyBatis 按以下顺序解析 TypeHandler

  1. 显式指定:在 XML 或注解中直接指定 typeHandler
  2. JDBC 类型匹配:根据 @MappedJdbcTypes 查找处理器。
  3. Java 类型匹配:根据参数/属性的 Java 类型查找默认处理器。

源码逻辑TypeHandlerRegistry.getTypeHandler):

public <T> TypeHandler<T> getTypeHandler(Type type, JdbcType jdbcType) {Map<JdbcType, TypeHandler<?>> jdbcHandlerMap = typeHandlerMap.get(type);if (jdbcHandlerMap != null) {TypeHandler<?> handler = jdbcHandlerMap.get(jdbcType);if (handler == null) {handler = jdbcHandlerMap.get(null); // 使用通用处理器}return (TypeHandler<T>) handler;}return null;
}
2. 自动注册机制

MyBatis 在启动时自动扫描并注册 TypeHandler

  • XML 配置:通过 <typeHandlers> 标签注册。
  • 包扫描:通过 <package name="..."/> 扫描包下的所有 TypeHandler
  • 注解驱动:通过 @MappedTypes@MappedJdbcTypes 注解声明作用范围。

源码入口org.apache.ibatis.builder.xml.XMLConfigBuilder.typeHandlerElement
关键代码

private void typeHandlerElement(XNode parent) {for (XNode child : parent.getChildren()) {if ("package".equals(child.getName())) {String packageName = child.getStringAttribute("name");typeHandlerRegistry.register(packageName); // 扫描包下的 TypeHandler} else {String javaTypeName = child.getStringAttribute("javaType");String jdbcTypeName = child.getStringAttribute("jdbcType");Class<?> handlerClass = resolveClass(child.getStringAttribute("handler"));register(javaTypeName, jdbcTypeName, handlerClass); // 注册单个 TypeHandler}}
}

四、自定义类型处理器的实现

1. 实现 TypeHandler 接口

示例:处理 List<String> 类型,存储为逗号分隔的字符串。

public class StringListTypeHandler implements TypeHandler<List<String>> {@Overridepublic void setParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {String value = String.join(",", parameter);ps.setString(i, value);}@Overridepublic List<String> getResult(ResultSet rs, String columnName) throws SQLException {String value = rs.getString(columnName);return Arrays.asList(value.split(","));}// 其他方法实现类似...
}
2. 注册自定义处理器

方式一:XML 配置

<typeHandlers><typeHandler handler="com.example.StringListTypeHandler" javaType="java.util.List" jdbcType="VARCHAR"/>
</typeHandlers>

方式二:注解驱动

@MappedTypes(List.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class StringListTypeHandler implements TypeHandler<List<String>> { ... }

五、源码设计亮点

1. 双重注册机制
  • 精确匹配:根据 Java类型 + JDBC类型 查找处理器。
  • 通用匹配:若未指定 JDBC 类型,使用 Java类型 → 默认处理器
2. 类型推导与泛型处理
  • 泛型支持:通过 TypeReference<T> 解析泛型参数类型。
  • 复杂类型处理:支持 MapList 等集合类型的嵌套映射。
3. 线程安全设计
  • 无状态处理器TypeHandler 实现类通常设计为无状态(如 StringTypeHandler),可安全复用。
  • 并发容器TypeHandlerRegistry 使用 ConcurrentHashMap 管理映射关系。

六、类图与交互流程

1. 核心类图

2. 类型处理时序图


七、总结

MyBatis 的 Type 模块通过 TypeHandler 接口TypeHandlerRegistry 注册中心TypeAliasRegistry 别名管理,实现了灵活的类型映射机制。其源码设计注重扩展性(支持自定义处理器)、性能(高效的类型查找)和线程安全(并发容器与无状态对象),是 MyBatis 框架中处理数据类型的核心基础设施。理解其源码实现,有助于开发者更好地定制类型转换逻辑,解决复杂场景下的 ORM 问题。


文章转载自:

http://u5jtr1X4.spghj.cn
http://dEFIKWm4.spghj.cn
http://q4zP7dvX.spghj.cn
http://MJotti4X.spghj.cn
http://HH3keiPA.spghj.cn
http://LNWtxSPI.spghj.cn
http://vpmEq53o.spghj.cn
http://7ZzCbTfy.spghj.cn
http://lJjrPnqP.spghj.cn
http://ahUS5DIc.spghj.cn
http://U0Zo8SLU.spghj.cn
http://bHmDmBoh.spghj.cn
http://o1zCyodH.spghj.cn
http://2idNNAUT.spghj.cn
http://oOEnf3zw.spghj.cn
http://Jri1SqQo.spghj.cn
http://GmqGUUT8.spghj.cn
http://pBrELCo8.spghj.cn
http://JGgymFRy.spghj.cn
http://n5RA5QZE.spghj.cn
http://5jiLKDRj.spghj.cn
http://EPWIkvF2.spghj.cn
http://qQqg9Kpk.spghj.cn
http://0u086uQK.spghj.cn
http://Sl4nXUZ4.spghj.cn
http://R6CLglI5.spghj.cn
http://E2t84ghg.spghj.cn
http://XnaQVb1r.spghj.cn
http://ZPymST6v.spghj.cn
http://0k5BfG4m.spghj.cn
http://www.dtcms.com/wzjs/745184.html

相关文章:

  • android wap网站南宁网站建设哪里有
  • 网站建设订单模板首饰设计网站大全
  • 网站开发补充协议监控摄像头做斗鱼直播网站
  • 登录贵州省住房和城乡建设厅网站重庆事业单位招聘
  • 网站建设项目明细表如何建设好一个公司网站
  • 域名备案与网站备案的区别高端网站建设企业官网建设
  • 网站建设指导方案wordpress 3.8.1 中文
  • 安阳网站建设_wordpress 子站点函数
  • 建设证件查询官方网站wordpress 上传主题 ftp
  • 网站建设分金手指专业二怎么利用源码做网站
  • 阳谷聊城网站优化seo排名优化怎样
  • 常州好一点的网站建设工业设计公司经营范围
  • 屏幕分辨率 网站开发网站源码下载了属于侵权吗
  • 适合做公司网站的cms领导交给你一个网站你该怎么做
  • 免费产品推广网站设计网站公司收费
  • 指定网站怎么设置路由器只访问抖音小程序赚钱
  • 建设方面的知识 网站美间软装官网
  • 毕业设计做购物网站网站设计高度
  • 网站提高内容的丰富度创意怎么下载网站页面
  • 网站系统容量评估机械公司网站模板
  • 东莞做网站设计制作网站制造
  • 陕西省咸阳市建设银行网站微平台图片
  • 如何破解网站后台密码网络营销课程实训报告
  • 上海网站制作平台注册logo去哪里注册
  • 上海网站建设百度推广公司佛山互联网公司
  • 江苏住房建设厅主办网站阿里云做网站教程
  • 建设网站五个步骤wordpress excel插件
  • 免费做电子相册的网站水泵行业网站哪个做的好
  • 企业网站开发 流程软件开发一般需要多少钱
  • 深圳专业软件网站建设网站建设硬件和软件技术环境配置