手机网站建设视频教程、北京软件开发公司

张小明 2026/1/11 12:11:36
手机网站建设视频教程、,北京软件开发公司,备案域名购买阿里云,精品网站制作目录前言基本概念一、TypeHandlerTypeHandler作用内置 TypeHandler 的自动映射二、jdbcType 的必要性#xff1a;处理 NULL 值的核心三、自定义 TypeHandler前言 这篇博客主要讲一下mybatis/mybatisplus框架的类型转换器的相关知识和用法#xff0c;最近项目有一个技术场景处理 NULL 值的核心三、自定义 TypeHandler前言这篇博客主要讲一下mybatis/mybatisplus框架的类型转换器的相关知识和用法最近项目有一个技术场景需要将 java String 字符串类型和数据库bigint字段类型互相自动转换借此机会总结一下相关知识点。基本概念MyBatis-Plus 底层依托 MyBatis 实现而 MyBatis 最终是通过 JDBC 的 PreparedStatement 操作数据库。为防范 SQL 注入风险PreparedStatement 会先将包含参数占位符的 SQL 语句发送至数据库完成编译和优化随后它会调用内部的类型转换器把传入的 Java 参数转换成数据库对应的类型并传递给数据库生成最终可执行的完整 SQL。数据库执行 SQL 后将结果返回给 Java 客户端框架内部再通过反射机制借助类型转换器把返回的字段数据映射为 Java 对象的属性。关于类型转换器在上述过程的作用可以借助这个流程图理解。一、TypeHandlerTypeHandler作用TypeHandler类型处理器​ 是 MyBatis 实现 Java 类型与 JDBC 类型之间转换的核心组件。它充当翻译官的角色负责参数设置将 Java 对象转换为 JDBC 类型并设置到 PreparedStatement中结果获取从 ResultSet或 CallableStatement中取出数据并转换为 Java 对象内置 TypeHandler 的自动映射MyBatis 为常见数据类型提供了丰富的内置处理器实现了约定优于配置Java 类型JDBC 类型对应 TypeHandlerStringVARCHARStringTypeHandlerLongBIGINTLongTypeHandlerIntegerINTEGERIntegerTypeHandlerDateTIMESTAMPDateTypeHandlerLocalDateTimeTIMESTAMPLocalDateTimeTypeHandlerBooleanBOOLEANBooleanTypeHandler为什么大多数情况下我们在使用mybatis、mybatisplus框架时不需要显式配置TypeHandler​ 因为 MyBatis 3.4.2 后增强了类型推断能力在参数非空时能自动选择正确的处理器。比如传入的参数是一个java字符串时mybatis能通过反射判断这是一个String类型数据然后会启用StringTypeHandler 这个类型转换器 工作进行数据转换二、jdbcType 的必要性处理 NULL 值的核心当参数为 null时MyBatis 无法推断其类型必须通过 jdbcType明确告知数据库如何处理该 NULL值。这是 JDBC 规范的要求而非 MyBatis 的多此一举。因此如果传参可能为null值时我们可以显性配置jdbcType!-- 为可能为 NULL 的参数指定 jdbcType --insertidinsertUserINSERT INTO user (name, age, email) VALUES ( #{name, jdbcTypeVARCHAR}, #{age, jdbcTypeINTEGER}, #{email, jdbcTypeVARCHAR} )/insertjdbcType 和 javaType 会直接影响mybatis框架选择哪个TypeHandler如果这两个都不配置mybatis会通过反射判断java 参数类型进而直接选择TypeHandler比如说如果参数类型是字符串Sting框架会自动选择StringTypeHandler 处理器。如果显性配置了jdbcType那么框架会选择适配 javaType 和显性配置的jdbcType 的类型处理器TypeHandler比如java参数类型是StringjdbcType显性配置了bigint类型那么框架会选择 适配这两个类型的TypeHandler这种处理器需要自己定义内置处理器并没有这种类型的三、自定义 TypeHandler当内置的类型处理器TypeHandler不满足需求时比如 javatype 为 String 类型而jdbcType为bigint类型时就需要我们自己定义一个适配的TypeHandler。定义一个TypeHandler只需要继承 BaseTypeHandler因为 JavaType 是 String实现 4 个核心方法并通过注解绑定 MappedTypesJavaType和 MappedJdbcTypesJDBCTypeimportorg.apache.ibatis.type.BaseTypeHandler;importorg.apache.ibatis.type.JdbcType;importorg.apache.ibatis.type.MappedJdbcTypes;importorg.apache.ibatis.type.MappedTypes;importjava.sql.*;/** * 自定义 TypeHandler处理 JavaTypeString ↔ JDBCTypeBIGINT 的转换 */// 绑定 Java 类型为 StringMappedTypes(String.class)// 绑定 JDBC 类型为 BIGINT可指定多个比如 {JdbcType.BIGINT, JdbcType.INTEGER}MappedJdbcTypes(JdbcType.BIGINT)publicclassStringToBigIntTypeHandlerextendsBaseTypeHandlerString{// 【设置参数】Java(String) → 数据库(BIGINT) // 用于 PreparedStatement 设置参数INSERT/UPDATE/SELECT 传参时OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,Stringparameter,JdbcTypejdbcType)throwsSQLException{// 把 String 类型的参数转为 Long再设置到 PreparedStatement 中适配 BIGINT 类型// 注意需处理参数为非数字的情况避免转换异常if(parameternull||!parameter.matches(\\d)){thrownewIllegalArgumentException(String 参数必须是数字格式才能转为 BIGINT当前值parameter);}LongbigIntValueLong.parseLong(parameter);ps.setLong(i,bigIntValue);}// 【获取结果】数据库(BIGINT) → Java(String) // 1. 根据列名获取结果ResultSet.getString(columnName) 本质也是转字符串这里统一转 Long 再 toString 更严谨OverridepublicStringgetNullableResult(ResultSetrs,StringcolumnName)throwsSQLException{Longresultrs.getLong(columnName);returnrs.wasNull()?null:result.toString();}// 2. 根据列索引获取结果OverridepublicStringgetNullableResult(ResultSetrs,intcolumnIndex)throwsSQLException{Longresultrs.getLong(columnIndex);returnrs.wasNull()?null:result.toString();}// 3. 从 CallableStatement存储过程获取结果OverridepublicStringgetNullableResult(CallableStatementcs,intcolumnIndex)throwsSQLException{Longresultcs.getLong(columnIndex);returncs.wasNull()?null:result.toString();}}定义完成之后我们可以通过yaml全局配置自定义的TypeHandler如果不想全局配置的话也可以直接在mybatis中的sql 映射文件中单独配置局部生效。全局配置自定义的TypeHandlermybatis:type-handlers-package:com.example.handler# 扫描 TypeHandler 所在包自动注册这样框架在启动时会加载这个自定义类型处理器然后会通过 会通过javaType和Jdbctype自动选择我们定义的类型转换器。!-- Mapper XML 写法 --insertidinsertUserINSERT INTO user (id, name) VALUES (#{id, jdbcTypeBIGINT}, #{name})/insert对应的mapper接口// Mapper 接口publicinterfaceUserMapper{intinsertUser(Param(id)Stringid,Param(name)Stringname);}mybatisplus 我们可以更方便地直接将jdbcType写入到Tablefield注解中DataTableName(user)// 对应数据库表名publicclassUser{TableField(valueid,jdbcTypeJdbcType.BIGINT// 指定 JDBC 类型在这里可以忽略不写)privateStringid;// Java 类型为 String对应数据库 BIGINT// 普通字段无需自定义转换TableField(name)privateStringname;}我们也可以显性指定类型转换器使其局部生效resultMapiduserResultMaptypecom.example.entity.User!-- 局部指定 TypeHandler --resultpropertyidStrcolumnidjdbcTypeBIGINTtypeHandlercom.example.handler.StringToBigIntTypeHandler//resultMap同样的在 mybatisPlus 框架中的Tablefield注解中也可以直接指定类型转换器DataTableName(user)// 对应数据库表名publicclassUser{TableField(valueid,typeHandlerStringToBigIntTypeHandler.class,// 自定义 TypeHandler)privateStringid;// Java 类型为 String对应数据库 BIGINT// 普通字段无需自定义转换TableField(name)privateStringname;}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

建网站多少钱?wordpress投稿送积分

1.2B参数撬动边缘智能革命:LG EXAONE 4.0改写终端AI格局 【免费下载链接】EXAONE-4.0-1.2B 项目地址: https://ai.gitcode.com/hf_mirrors/LGAI-EXAONE/EXAONE-4.0-1.2B 导语 LG AI Research推出的EXAONE 4.0 1.2B模型,以12亿参数实现推理与效率…

张小明 2026/1/1 15:38:22 网站建设

大连网站制作咨询深圳建站公司外围

第一章:Azure量子任务提交失败?这7种日志模式揭示根本原因(附修复方案)在调试 Azure Quantum 任务提交失败时,日志分析是定位问题的核心手段。通过解析作业运行时输出的典型日志模式,可快速识别认证错误、资…

张小明 2026/1/2 0:07:23 网站建设

设计网站大全友联建设集团官方网站

Excalidraw:构建可视化协作文化,赋能人才梯队发展 在技术团队日益强调“快速对齐、高效沟通”的今天,一个看似简单的工具选择,往往能撬动整个组织的知识传递效率。设想这样一个场景:一位刚入职的后端工程师面对复杂的微…

张小明 2026/1/2 8:08:42 网站建设

易思网站管理系统收费微网站制作超链接

HuggingFace Spaces快速部署Qwen3-VL-30B在线演示应用 在多模态AI迅速演进的今天,一个现实问题始终困扰着开发者:如何让拥有300亿参数的大模型走出实验室,真正被用户“看见、试用、反馈”?尤其是在视觉语言任务中,研究…

张小明 2026/1/1 22:38:11 网站建设

北京网站优化哪家好北京seo优化排名

Go 1.22 通关讲解 介绍 Go 1.22 是继 Go 1.21 后的最新版本,主要集中在工具链、运行时和库的实现上进行了改进。这一版本保持了 Go 1 的兼容性承诺,因此几乎所有的 Go 程序都能够像以前一样进行编译和运行。 语言变更 1、在 Go 1.22 之前&#xff0c…

张小明 2026/1/1 17:41:08 网站建设

网站建设过程规划和准备阶段如何能快速搜到新做网站链接

在当今数字化招聘时代,远程视频面试已成为软件测试岗位的常态。尤其对于软件测试从业者而言,这不仅是一次展示技术能力的机会,更是考验细节管理能力的试金石。一个看似微小的疏忽—如网络卡顿或测试案例描述不清—都可能让您的专业形象大打折…

张小明 2026/1/3 1:36:14 网站建设