网站设计就业形势,郑州 科技有限公司 网站建设,网页设计实训报告不足,外语网站建设#x1f49d;#x1f49d;#x1f49d;欢迎来到我的博客#xff0c;很高兴能够在这里和您见面#xff01;希望您在这里可以感受到一份轻松愉快的氛围#xff0c;不仅可以获得有趣的内容和知识#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学… 欢迎来到我的博客很高兴能够在这里和您见面希望您在这里可以感受到一份轻松愉快的氛围不仅可以获得有趣的内容和知识也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂 非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。 ✨✨ 欢迎订阅本专栏 ✨✨ 博客目录 一.基本介绍1.什么是 TypeHandler?2.BaseTypeHandler 使用场景?3.BaseTypeHandler 常用方法? 二.基础代码1.启动类2.创建 handler3.mapper 三.注解方式1.注解方式2.resultMap 配置3.测试 四.全局配置方式1.全局配置方式2.SQL 语句3.测试用例 五.源码分析1.BaseTypeHandler2.setNonNullParameter3.getNullableResult(接受列名参数)4.getNullableResult(接受列索引参数)5.getNullableResult 方法接受 CallableStatement 参数6.类图关系 一.基本介绍
1.什么是 TypeHandler?
“TypeHandler” 通常指的是在软件开发中处理数据类型转换和操作的组件或模块。具体来说TypeHandler 主要用于将一个数据类型转换为另一个数据类型以便在不同的上下文中使用。
在不同的编程语言和框架中TypeHandler 的实现方式可能有所不同。以下是一些常见的情况 数据库中的 TypeHandler 在持久化层比如与数据库的交互中TypeHandler 可能用于将数据库中的数据类型与应用程序中的数据类型进行映射。例如将数据库中的字符串字段映射为应用程序中的整数类型。 Web 开发中的 TypeHandler 在处理用户输入或从网络传输数据时可能需要将字符串转换为数字、日期等。TypeHandler 在这种情况下可以用于验证和转换数据类型。 对象关系映射 (ORM) 中的 TypeHandler 在使用 ORM 框架时TypeHandler 通常用于将数据库中的数据类型映射到编程语言中的数据类型。这是因为数据库和编程语言之间可能存在类型差异需要进行适当的转换。 用户界面 (UI) 层中的 TypeHandler 当用户与应用程序的用户界面交互时输入数据通常以字符串形式提供。TypeHandler 在这里可以用于将用户输入的字符串转换为应用程序内部需要的数据类型。
TypeHandler 在软件开发中扮演着一个数据类型转换和操作的角色有助于确保不同部分之间的数据一致性和正确性。具体实现方式取决于应用程序的需求和使用的技术栈。
2.BaseTypeHandler 使用场景?
org.apache.ibatis.type.BaseTypeHandler 是 MyBatis 中的一个抽象基类用于简化自定义类型处理器TypeHandler的实现。MyBatis 是一个支持持久化的 Java 持久层框架而类型处理器用于处理 Java 对象与数据库中的数据类型之间的映射关系。
BaseTypeHandler 提供了一些默认的实现减少了自定义类型处理器的工作量。
3.BaseTypeHandler 常用方法?
如果你想自定义一个类型处理器可以继承 BaseTypeHandler 并实现其中的一些方法。以下是 BaseTypeHandler 中的一些关键方法和其作用 setNonNullParameter 方法 用于将 Java 类型的非空参数设置到 PreparedStatement 对象中。子类需要实现此方法以指定如何将 Java 类型的非空参数设置到 PreparedStatement 中。 getNullableResult 方法 从 ResultSet 中获取指定列的值以及从 CallableStatement 中获取指定参数的值。子类需要实现此方法以指定如何从数据库结果集中获取数据。 setNonNullParameter 方法 将非空的 Java 对象设置到 PreparedStatement 中。子类需要实现此方法以指定如何将 Java 对象设置到 PreparedStatement 中。 getNullableResult 方法 从 ResultSet 中获取指定列的值以及从 CallableStatement 中获取指定参数的值。子类需要实现此方法以指定如何从数据库结果集中获取数据。
通过继承 BaseTypeHandler你可以只关注需要自定义的转换逻辑而无需实现所有的方法。这样你可以更方便地创建自己的类型处理器用于处理特定类型的数据映射。
需要注意的是MyBatis 也提供了一些预定义的类型处理器用于处理常见的数据类型如字符串、整数、日期等。但在某些情况下你可能需要创建自己的类型处理器以处理特定的需求或自定义数据类型。
二.基础代码
1.启动类
SpringBootApplication
public class AppRun {public static void main(String[] args) {SpringApplication.run(AppRun.class, args);}
}2.创建 handler
public class Str2DateTypeHandler extends BaseTypeHandlerDate {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, date2Str(parameter));}Overridepublic Date getNullableResult(ResultSet rs, String columnName) throws SQLException {return str2Date(rs.getString(columnName));}Overridepublic Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return str2Date(rs.getString(columnIndex));}Overridepublic Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return str2Date(cs.getString(columnIndex));}private static Date str2Date(String str) {if (str null || str.trim().length() 0) return null;SimpleDateFormat format new SimpleDateFormat(yyyy-MM-dd);try {return format.parse(str);} catch (Exception e) {throw new RuntimeException(e);}}private static String date2Str(Date date) {if (date null) return null;SimpleDateFormat format new SimpleDateFormat(yyyy-MM-dd);try {return format.format(date);} catch (Exception e) {throw new RuntimeException(e);}}
}3.mapper
Mapper
public interface TestMapper extends BaseMapperTestPO {TestPO selectOne();
}三.注解方式
1.注解方式
autoResultMap:用于自动生成结果映射而无需手动定义映射关系。typeHandler: 指定类型处理器。TableName(autoResultMap true)TableField(typeHandler Str2DateTypeHandler.class)
Data
TableName(value test, autoResultMap true)
public class TestPO implements Serializable {private static final long serialVersionUID 1L;TableId(value id, type IdType.NONE)private String id;TableField(typeHandler Str2DateTypeHandler.class)private Date date;
}2.resultMap 配置
如果返回值是 resultMap 类型,可以通过配置 resultMap 中列的 typeHandler 属性进行类型转换。
!-- 通用查询映射结果 --
resultMap idBaseResultMap typeorg.example.pojo.TestPOid columnid propertyid/result columndate propertydate typeHandlerorg.example.typehandler.Str2DateTypeHandler/
/resultMap3.测试
使用 CommandLineRunner 进行测试方便快捷。
Component
public class TestRunner implements CommandLineRunner {Autowiredprivate TestMapper testMapper;Overridepublic void run(String... args) throws Exception {ListTestPO list this.testMapper.selectList(null);System.out.println(list.get(0).getId() - list.get(0).getDate());}
}四.全局配置方式
1.全局配置方式
设置类型处理的包路径: type-handlers-package
mybatis-plus:mapper-locations: classpath*:mapper/*Mapper.xmlconfiguration:cache-enabled: truetype-handlers-package: org.example.typehandler2.SQL 语句
数据库 date 是 String 类型,PO 定义的是 Date 类型,直接查询数据是会报错的。
select idselectOne resultTypeorg.example.pojo.TestPOSELECT id, dateFROM test limit 1;
/select3.测试用例
使用 CommandLineRunner 进行测试方便快捷。
Component
public class TestRunner2 implements CommandLineRunner {Autowiredprivate TestMapper testMapper;Overridepublic void run(String... args) throws Exception {TestPO testPO this.testMapper.selectOne();System.out.println(testPO.getId() - testPO.getDate());}
}五.源码分析
1.BaseTypeHandler
需要重写的四个方法如下:
public abstract void setNonNullParameter(PreparedStatement var1, int var2, T var3, JdbcType var4) throws SQLException;public abstract T getNullableResult(ResultSet var1, String var2) throws SQLException;public abstract T getNullableResult(ResultSet var1, int var2) throws SQLException;public abstract T getNullableResult(CallableStatement var1, int var2) throws SQLException;2.setNonNullParameter
作用 该方法用于将 Java 类型的非空参数设置到 PreparedStatement 对象中以便将数据插入到数据库中。
参数
var1表示要设置参数的 PreparedStatement 对象。var2表示要设置的参数的位置。var3表示要设置的非空参数值即从 Java 对象映射到数据库中的数据。var4表示 JDBC 类型用于指定参数的数据类型。
异常 抛出 SQLException以处理可能的数据库操作异常。
3.getNullableResult(接受列名参数)
作用 该方法从 ResultSet 中获取指定列的值并将其映射为 Java 对象处理可空的查询结果。
参数
var1表示要获取数据的 ResultSet 对象。var2表示要获取的列的名称。
返回值 返回映射到 Java 对象的可空结果。
异常 抛出 SQLException以处理可能的数据库操作异常。
4.getNullableResult(接受列索引参数)
作用 该方法从 ResultSet 中获取指定列的值并将其映射为 Java 对象处理可空的查询结果。
参数
var1表示要获取数据的 ResultSet 对象。var2表示要获取的列的索引。
返回值 返回映射到 Java 对象的可空结果。
异常 抛出 SQLException以处理可能的数据库操作异常。
5.getNullableResult 方法接受 CallableStatement 参数
作用 该方法从 CallableStatement 中获取指定位置的值并将其映射为 Java 对象处理可空的查询结果。
参数
var1表示要获取数据的 CallableStatement 对象。var2表示要获取的位置。
返回值 返回映射到 Java 对象的可空结果。
异常 抛出 SQLException以处理可能的数据库操作异常。
6.类图关系 觉得有用的话点个赞 呗。 ❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正 如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧