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

南京网站制作公司南京微尚管理咨询公司一般是做什么的

南京网站制作公司南京微尚,管理咨询公司一般是做什么的,现货黄金看盘软件,荆门网站建设514885目录 一、前言 二、TypeHandler简介 2.1 什么是TypeHandler 2.1.1 TypeHandler特点 2.2 TypeHandler原理 2.3 mybatis自带的TypeHandler 三、环境准备 3.1 准备一张数据表 3.2 搭建一个springboot工程 3.2.1 基础依赖如下 3.2.2 核心配置文件 3.2.3 测试接口 四、T…目录 一、前言 二、TypeHandler简介 2.1 什么是TypeHandler 2.1.1 TypeHandler特点 2.2 TypeHandler原理 2.3 mybatis自带的TypeHandler 三、环境准备 3.1 准备一张数据表 3.2 搭建一个springboot工程 3.2.1 基础依赖如下 3.2.2 核心配置文件 3.2.3 测试接口 四、TypeHandler在项目中的使用 4.1 时间类型转换问题 4.1.1 添加自定义TypeHandler 4.1.2 添加扫描 4.1.3 xml配置字段引用自定义TypeHandler 4.1.4 接口效果测试 4.1.5 新增数据 4.2 常用的TypeHandler 4.2.1 List类型的处理 4.2.2 枚举类型的处理 4.2.3 json类型的处理 4.3 注意事项 4.3.1 自定义TypeHandler步骤 4.3.2 自定义TypeHandler使用注意事项 五、写在文末 一、前言 在springboot为基础框架的微服务开发中经常要涉及到数据库的操作此时mybatis或mybatis-plus便成为技术选型中必不可少的组件。基本上来说springbootmybatis成为很多公司微服务项目的基础选型。使用mybatis的好处很多这里不再赘述了接下来要探讨的是在业务代码中如何使用mybtais完成一些字段的类型转换。 二、TypeHandler简介 2.1 什么是TypeHandler TypeHandler即类型转换器在mybatis中用于实现 java类型 和 JDBC类型 的相互转换在 Java 与mybatis的整合开发中TypeHandler 是 MyBatis 框架的一个核心组件用于实现数据库表字段类型与和Java 数据类型之间的相互转换。这个组件的存在它允许开发人员自定义类型处理器以满足特定场景下的业务需求。 TypeHandler 作用是在 MyBatis 执行 数据查询或更新操作时将数据库中的列值转换为 Java 对象并在将 Java 对象写入数据库时执行相反的转换。它提供了一种灵活且可扩展的方式用于处理数据库类型与 Java 类型之间的映射关系。 2.1.1 TypeHandler特点 TypeHandler在实际项目中该如何使用呢需要搞清它的特点才能更好的掌握其使用场景以下列举了TypeHandler 一些特点和使用方式 类型转换TypeHandler 负责将数据库表中的字段值转换为 Java 对象并将 Java 对象转换为数据库表中可被接受的类型映射规则TypeHandler 是基于映射规则的在下文的表中详细给出了常用的映射规则即在 MyBatis 映射文件中需要指定表字段和对象属性之间的映射关系这样TypeHandler才能正确进行类型转换支持自定义类型转换器MyBatis 提供了一些默认的类型处理器例如整数、字符串、日期等常见的数据类型同时开发人员可根据业务需要自定义类型处理器实现特定类型的转换逻辑比如你可以在自定义处理器中处理字段加密的逻辑注册类型处理器自定义类型处理器需要在 MyBatis 配置文件中进行注册这样MyBatis 在执行数据库操作时才能找到并使用它们支持复杂的类型TypeHandler 不仅可以处理基本数据类型还可以处理复杂类型例如枚举、自定义对象等 2.2 TypeHandler原理 还记得在使用jdbc操作数据库的时候我们是如何设置一个查询的sql语句中的字段参数值的吗没错就是使用PrepareStatement对象中的set方法。 对mybatis原理有所了解的同学应该不陌生其实mybatis框架就是对jdbc的完美封装。所以mybatis使用 prepareStatement 进行参数设置的时候需要通过 TypeHandler 将传入的java参数设置成合适的jdbc类型参数这个过程实际上是通过调用 PrepareStatement 不同的set方法实现的。 String sql SELECT * tb_user where usernmae? and pwd?; PreparedStatement pstmt connection.prepareStatement(sql); pstmt.setString(1, jerry); pstmt.setString(1, root321); ResultSet rs pstmt.executeQuery(); 在获取到返回结果之后也需要将返回的结果转换成需要的java数据类型这时候是通过调用 ResultSet 对象不同类型的get方法实现的。比如我们在得到jdbc的结果集之后会通过下面的方式获得某个字段的结果 String idrs.getString(id); int numberrs.getInt(number); 所以不同类型的 TypeHandler 其实就是调用 PrepareStatement 和 ResultSet 的不同方法来进行类型的转换有些时候会在调用 PrepareStatement 和 ResultSet 的相关方法之前可以对传入的参数进行一定的处理.。 而当我们没有指定 TypeHandler 时 mybatis 会根据入参类型和返回值类型调用默认的 TypeHandler 进行处理。 对于一个 TypeHandler来说 需要配置 java类型(javaType) 和 JDBC类型(jdbcType)TypeHandler 作用就是实现这两种类型的转换在传入参数为指定的Java类型时通过TypeHandler 将其转换为指定的JDBC类型当返回值为指定JDBC类型时TypeHandler 再将其转换为配置的Java类型。 2.3 mybatis自带的TypeHandler MyBatis 默认已经内置了一些常用的TypeHandler大部分场景下无须显式声明 jdbcType 和 javaType或者用 TypeHandler 去指定对应的字段来实现数据类型转换因为 mybatis会自动探测待映射的数据类型从而自动选择合适的 TypeHandler。下面列举了mybatis常用的TypeHandler 类型处理器Java类型JDBC类型BooleanTypeHandlerjava.lang.Boolean,boolean数据库兼容的 BOOLEANByteTypeHandlerjava.lang.Byte, byte数据库兼容的 NUMERIC 或 BYTEShortTypeHandlerjava.lang.Short, short数据库兼容的 NUMERIC 或 SHORT INTEGERIntegerTypeHandlerjava.lang.Integer, int数据库兼容的 NUMERIC 或 INTEGERLongTypeHandlerjava.lang.Long, long数据库兼容的 NUMERIC 或 LONG INTEGERFloatTypeHandlerjava.lang.Float, float数据库兼容的 NUMERIC 或 FLOATDoubleTypeHandlerjava.lang.Double,double数据库兼容的 NUMERIC 或 DOUBLEBigDecimalTypeHandlerjava.math.BigDecimal数据库兼容的 NUMERIC 或 DECIMALStringTypeHandlerjava.lang.StringCHAR, VARCHARClobReaderTypeHandlerjava.io.Reader-ClobTypeHandlerjava.lang.StringCLOB, LONGVARCHARNStringTypeHandlerjava.lang.StringNVARCHAR, NCHARNClobTypeHandlerjava.lang.StringNCLOBBlobInputStreamTypeHandlerjava.io.InputStream-ByteArrayTypeHandlerbyte[]数据库兼容的字节流类型BlobTypeHandlerbyte[]BLOB, LONGVARBINARYDateTypeHandlerjava.util.DateTIMESTAMPDateOnlyTypeHandlerjava.util.DateDATETimeOnlyTypeHandlerjava.util.DateTIMESqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMPSqlDateTypeHandlerjava.sql.DateDATESqlTimeTypeHandlerjava.sql.TimeTIMEObjectTypeHandlerAnyOTHER 或未指定类型EnumTypeHandlerEnumeration TypeVARCHAR-任何兼容的字符串类型存储枚举的名称(而不是索引)EnumOrdinalTypeHandlerEnumeration Type任何兼容的 NUMERIC 或 DOUBLE 类型存储枚举的索引(而不是名称) 三、环境准备 3.1 准备一张数据表 为了方便后面实验演示这里准备一张数据表建表sql如下 CREATE TABLE tb_user (id int(12) NOT NULL,user_name varchar(32) DEFAULT NULL,pwd varchar(64) DEFAULT NULL,user_image blob,create_time datetime DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; 3.2 搭建一个springboot工程 技术栈springbootmybatismysql 3.2.1 基础依赖如下 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.5/versionrelativePath/ !-- lookup parent from repository --/parentdependenciesdependencygroupIdcom.alibaba.fastjson2/groupIdartifactIdfastjson2/artifactIdversion2.0.23/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.2.2/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.17/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency/dependenciesbuildfinalNamehook-service/finalNamepluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build 3.2.2 核心配置文件 主要是配置连接mysql与mybatis的配置 server:port: 8088spring:application:name: user-servicedatasource:url: jdbc:mysql://IP:3306/db-basedriverClassName: com.mysql.jdbc.Driverusername: rootpassword: rootmybatis:mapper-locations: classpath:mapper/*.xml#目的是为了省略resultType里的代码量type-aliases-package: com.congge.entityconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 3.2.3 测试接口 RestController RequestMapping(/user) public class TbUserController {Autowiredprivate TbUserService tbUserService;//http:localhost:8088/user/get?id1GetMapping(/get)public TbUser getById(RequestParam int id){return tbUserService.getById(id);}} 业务实现逻辑比较简单就忽略了最后在mybatis的查询文件中一般建议配置一resultMap在这个resultMap中编写Java实体类属性与数据表的映射关系对应规则而后面将要说到的自定义TypeHandler也将在这里进行配置参考如下 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.congge.dao.TbUserDaoresultMap idbaseMap typecom.congge.entity.TbUserid columnid jdbcTypeINTEGER propertyid /result columnuser_name jdbcTypeVARCHAR propertyuserName /result columnpwd jdbcTypeVARCHAR propertypwd /result columnuser_image jdbcTypeBLOB propertyuserImage /result columncreate_time jdbcTypeTIMESTAMP propertycreateTime //resultMapselect idgetById resultMapbaseMapselect * from tb_user where id #{id}/select /mapper 启动工程后测试一下接口可以看到直接报错了 为什么会出现这个问题呢这该如何处理呢 四、TypeHandler在项目中的使用 4.1 时间类型转换问题 在上面的接口测试中发现接口返回的时间类型并不是我们想要的遇到这个问题就是数据库的字段类型与java中的时间字段类型不匹配或者说无法通过默认的TypeHandler进行转换了该如何解决呢 4.1.1 添加自定义TypeHandler 自定义一个TypeHandler类只需要继承BaseTypeHandler类然后重写里面的setNonNullParameter和getNullableResult方法在重写的方法里面编写相关的业务逻辑即可。 import org.apache.ibatis.type.*;import java.sql.*;/*** 自定义类型转换将数据库中的日期类型转换成long类型的时间戳** 三种注册方式* 1.直接在 result标签中指定typeHandler如Result(property createTime, column create_time, jdbcType JdbcType.TIMESTAMP, typeHandler Timestamp2LongHandler.class)* 2.在SqlSessionFactory实例中注册 在SqlSessionFactory实例中.setTypeHandlers(new Timestamp2LongHandler());* 3.mapper 的xml配置typeHandler handlercom.congge.handler.Timestamp2LongHandler/*/ MappedTypes(value Long.class) MappedJdbcTypes(value {JdbcType.DATE, JdbcType.TIME, JdbcType.TIMESTAMP}) public class Timestamp2LongHandler extends BaseTypeHandlerLong {/*** 将java类型转换为jdbc类型** param preparedStatement* param i* param aLong 毫秒时间戳* param jdbcType db字段类型* throws SQLException*/Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, Long aLong, JdbcType jdbcType) throws SQLException {if (jdbcType JdbcType.DATE) {preparedStatement.setDate(i, new Date(aLong));} else if (jdbcType JdbcType.TIME) {preparedStatement.setTime(i, new Time(aLong));} else if (jdbcType JdbcType.TIMESTAMP) {preparedStatement.setTimestamp(i, new Timestamp(aLong));}}Overridepublic Long getNullableResult(ResultSet resultSet, String s) throws SQLException {return parse2time(resultSet.getObject(s));}Overridepublic Long getNullableResult(ResultSet resultSet, int i) throws SQLException {return parse2time(resultSet.getObject(i));}Overridepublic Long getNullableResult(CallableStatement callableStatement, int i) throws SQLException {return parse2time(callableStatement.getObject(i));}private Long parse2time(Object value) {if (value instanceof Date) {return ((Date) value).getTime();} else if (value instanceof Time) {return ((Time) value).getTime();} else if (value instanceof Timestamp) {return ((Timestamp) value).getTime();}return null;} } 对自定义的TypeHandler类对类上的两个注解做如下补充说明 MappedJdbcTypes代表对应的数据库中字段的类型 MappedTypes代表要转换后的的JavaBean中的属性对象类型 4.1.2 添加扫描 当一个自定义的TypeHandler编写完成后如何生效并被使用呢在上述代码的注释中其实给出了好几种方式一般比较常用的像注册到bean中或者配置到mybatis的全局配置文件中这里提供另一种方式就是直接在application.yaml中配置一下扫描路径也可以。最后一行 mybatis:mapper-locations: classpath:mapper/*.xml#目的是为了省略resultType里的代码量type-aliases-package: com.congge.entityconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpltype-handlers-package: com.congge.handler 4.1.3 xml配置字段引用自定义TypeHandler 然后再在上述的UserMapper.xml文件中在resultMap中的createTime字段映射上引用上述的TypeHandler resultMap idbaseMap typecom.congge.entity.TbUserid columnid jdbcTypeINTEGER propertyid /result columnuser_name jdbcTypeVARCHAR propertyuserName /result columnpwd jdbcTypeVARCHAR propertypwd /result columnuser_image jdbcTypeBLOB propertyuserImage /result columncreate_time jdbcTypeTIMESTAMP propertycreateTime /result propertycreateTime columncreate_time typeHandlercom.congge.handler.Timestamp2LongHandler//resultMap 4.1.4 接口效果测试 以上配置完成后再次启动工程调用接口此时可以看到返回的时间可以正确的被转换为Long类型 4.1.5 新增数据 如果是新增数据时由于在自定义TypeHandler已经对传入数据库的时间字段进行了转换处理所以按照下面的操作即可。 public int save(TbUser tbUser) {Integer count tbUserDao.selectCount();Integer id count1;tbUser.setId(count1);tbUser.setCreateTime(System.currentTimeMillis());tbUserDao.save(tbUser);return id; } 再在xml文件的sql里面针对createTime字段添加自定义的TypeHandler insert idsaveinsert into tb_user(id,user_name,pwd,user_image,create_time) values(#{id},#{userName},#{pwd},#{userImage},#{createTime,javaTypeLong,jdbcTypeTIMESTAMP,typeHandlercom.congge.handler.Timestamp2LongHandler})/insert 然后调用数据插入接口时就能正常的被解析为数据库的TIMESTAMP类型 4.2 常用的TypeHandler 在真实的业务场景中涉及到需要进行转换的字段类型可能非常多下面总结了一些常用的开发中使用到的数据类型转换的自定义TypeHandler。 4.2.1 ListString类型的处理 当处理 List 类型时可使用自定义的TypeHandler 将 List 对象转换为字符串存储或者从数据库中读取字符串并还原为 List 对象。 比如在一个用户表中关联了多个角色这个角色字段relate_roles存储多个数据时以,分割而在用户BizUser对象中包含了一个ListString类型的属性与relate_roles对应我们就可以自定义一个handler来实现入库时和查询映射到对象属性时的转换。 mysql建表语句 CREATE TABLE biz_user (id int(12) NOT NULL,user_name varchar(32) DEFAULT NULL,relate_roles varchar(132) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; 自定义以TypeHandler类代码如下 import org.apache.ibatis.type.BaseTypeHandler;import java.sql.PreparedStatement; import java.util.Arrays; import java.util.Collections; import java.util.List;import org.apache.ibatis.type.*;import java.sql.*;//MappedTypes(value Long.class) //MappedJdbcTypes(value {JdbcType.DATE, JdbcType.TIME, JdbcType.TIMESTAMP})public class StringListTypeHandler extends BaseTypeHandlerListString {private static final String DELIMITER ,;Overridepublic void setNonNullParameter(PreparedStatement ps, int i, ListString parameter, JdbcType jdbcType) throws SQLException {// 将 ListString 转换为以逗号分隔的字符串String rolesString String.join(DELIMITER, parameter);ps.setString(i, rolesString);}Overridepublic ListString getNullableResult(ResultSet rs, String columnName) throws SQLException {// 从 ResultSet 中获取字符串值String rolesString rs.getString(columnName);// 转换为 ListStringreturn parseRolesString(rolesString);}Overridepublic ListString getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String rolesString rs.getString(columnIndex);return parseRolesString(rolesString);}Overridepublic ListString getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String rolesString cs.getString(columnIndex);return parseRolesString(rolesString);}private ListString parseRolesString(String rolesString) {if (rolesString null || rolesString.isEmpty()) {return Collections.emptyList();}return Arrays.asList(rolesString.split(DELIMITER));} } 最后在mybatis的配置文件中做一下配置即可 resultMap idbaseMap typecom.congge.entity.BizUserid columnid jdbcTypeINTEGER propertyid /result columnuser_name jdbcTypeVARCHAR propertyuserName /result columnrelate_roles jdbcTypeVARCHAR propertyrelateRoles typeHandlercom.congge.handler.StringListTypeHandler //resultMap 接口测试提前在数据库中准备一条数据然后通过接口调用可以看到下面的效果说明成功转换 4.2.2 枚举类型的处理 假设我们有一个用户的实体类对象 BizUser其中包含一个 SexEnum枚举类型的状态字段在数据库中我们将状态字段存储为一个字符串类型的列例如 gender Getter public enum SexEnum {MALE(1, 男),FEMALE(0, 女);private int id;private String name;SexEnum(int id, String name) {this.id id;this.name name;}public static SexEnum getSexById(int id) {for (SexEnum sex : SexEnum.values()) {if (sex.getId() id) {return sex;}}return null;}} 实体类 Getter Setter public class BizUser {private int id;private String userName;private ListString relateRoles;private SexEnum sex;} 可以使用自定义 TypeHandler 来处理 UserStatus枚举类型与数据库列值之间的转换参考如下示例的 TypeHandler 实现 public class SexEnumTypeHandler extends BaseTypeHandlerSexEnum {Overridepublic SexEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {// 从 ResultSet 中获取列值int data rs.getInt(columnName);// 将列值转换为枚举对象return SexEnum.getSexById(data);}Overridepublic SexEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {int data rs.getInt(columnIndex);return SexEnum.getSexById(data);}Overridepublic SexEnum getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {int data callableStatement.getInt(columnIndex);return SexEnum.getSexById(data);}Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, SexEnum status, JdbcType jdbcType) throws SQLException {// 将枚举值的code存储到数据库中preparedStatement.setInt(i, status.getId());} } 4.2.3 json类型的处理 假如在biz_user表中有一个描述的信息json是BizUser对象关联的一个对象存储进来的如下BizUser对象中持有一个Content的对象引用 Getter Setter public class BizUser {private int id;private String userName;private ListString relateRoles;private SexEnum sex;private Content content; } Content对象 Getter Setter public class Content {private String desc;private String level;private String hit; } 对应的数据表如下 CREATE TABLE biz_user (id int(12) NOT NULL,user_name varchar(32) DEFAULT NULL,relate_roles varchar(132) DEFAULT NULL,gender int(1) DEFAULT NULL,content json DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; 要完成这样一个场景下字段到实体对象的映射可以参考下面的做法自定义一个ObjectJSONTypeHandler import com.congge.entity.Content; import com.google.gson.Gson; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType;import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class ObjectJSONTypeHandler extends BaseTypeHandlerContent {private Gson gson new Gson();Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Content parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, gson.toJson(parameter));}Overridepublic Content getNullableResult(ResultSet rs, String columnName) throws SQLException {return gson.fromJson(rs.getString(columnName), Content.class);}Overridepublic Content getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return gson.fromJson(rs.getString(columnIndex), Content.class);}Overridepublic Content getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return gson.fromJson(cs.getString(columnIndex), Content.class);} } 最后再在mybatis的映射文件中将自定义TypeHandler加进去即可 resultMap idbaseMap typecom.congge.entity.BizUserid columnid jdbcTypeINTEGER propertyid /result columnuser_name jdbcTypeVARCHAR propertyuserName /result columnrelate_roles jdbcTypeVARCHAR propertyrelateRoles typeHandlercom.congge.handler.StringListTypeHandler /result columngender jdbcTypeINTEGER propertysex typeHandlercom.congge.handler.SexEnumTypeHandler /result columncontent propertycontent typeHandlercom.congge.handler.ObjectJSONTypeHandler //resultMap 测试一下接口可以看到下面的效果 4.3 注意事项 4.3.1 自定义TypeHandler步骤 通过上面的案例介绍了几种常用的TypeHandler类型处理方式如果还有其他的特殊场景也可以参考进行处理总结一下自定义的TypeHandler使用流程主要分为下面几个步骤 确定数据库字段的类型以及要转换为JavaBean中的属性类型 自定义一个TypeHandler类继承这个BaseTypeHandler抽象类 注册TypeHandlerssm项目中如果有mybatis的全局配置文件的话需要注册一下 再在mybatis的业务xml文件中属性与字段映射的位置将需要转换的字段和属性使用这个自定义TypeHandler即可 通常来说通过上面的几步就可以完成插入数据时数据库字段是预期类型的值而查询数据时接口返回的是java中预期类型的值但是在某些情况下比如像上面的enum这种枚举类型的还需要再返回值中进一步处理 4.3.2 自定义TypeHandler使用注意事项 在 MyBatis 中如果你使用了自定义 TypeHandler 进行类型转换下面有一些注意事项和建议 数据库字段与 Java 对象属性类型的匹配 如果数据库字段的类型与自定义 TypeHandler 处理的 Java 对象类型不一致可能会导致转换错误或数据丢失。 处理 NULL 值 在自定义 TypeHandler 中 NULL 值的处理很重要可通过判断传入的参数或结果集中的值是否为 NULL并在处理过程中进行相应的处理。例如可以将 NULL 值转换为 Java 对象的默认值或者通过特定的标识值来表示 NULL。 注册 TypeHandler 确保在 MyBatis 的配置文件中正确注册自定义的 TypeHandler如果没有正确注册MyBatis 将无法找到并使用该 TypeHandler而导致类型转换失败。 测试和验证 在使用自定义 TypeHandler 进行类型转换之前建议进行充分的测试和验证。确保自定义 TypeHandler 能够正确地将数据库类型转换为相应的 Java 对象类型并且在查询和更新操作中能够正常工作。 了解官方提供的默认 TypeHandler MyBatis 提供了一些默认的 TypeHandler用于常见的数据类型转换如字符串、整数、日期等。在自定义 TypeHandler 之前建议先查看官方文档了解是否已经有现成的 TypeHandler 可以满足你的需求。 可重用性和扩展性 在设计自定义 TypeHandler 时考虑其可重用性和扩展性。如果有多个字段需要进行相同的类型转换可以将转换逻辑封装在一个通用的 TypeHandler 中并在映射文件中多次引用它。另外可以通过继承或组合的方式扩展已有的 TypeHandler以满足不同的业务需求。 注意线程安全性 自定义 TypeHandler 应该是线程安全的因为 MyBatis 在多线程环境下可能会同时使用同一个 TypeHandler 实例进行类型转换。确保在实现自定义 TypeHandler 时考虑线程安全性并采取相应的线程安全措施如使用线程局部变量或同步机制。 五、写在文末 自定义TypeHandler在实际的开发中可以说是一个很常见的问题虽然并不难但是如果不了解其底层原理得话使用起来很容易陷入忙乱中有必要深入学习和掌握本篇到此结束感谢观看。
http://www.hkea.cn/news/14469682/

相关文章:

  • 大众点评如何做团购网站协会网站建设哪里实惠
  • 广西网站设计欣赏工具类网站开发
  • 网站的空间与域名企业服务平台介绍
  • 晋江网站建设洛阳网站制作建网站网站建设
  • 哈尔滨网站开发工作室广东新闻联播直播回放
  • 哪个网站能在百度做推广建站优化一条龙
  • 域名交易网站和平苏州网站建设
  • 怎么自己做砍价网站wordpress语言系统
  • 专业网站托管购物网页设计图片
  • 用Html5做网站网站屏蔽省份
  • 上海企业建站公司哪家好wordpress paginate_comments_links
  • 网站开发著作权济宁住房和城乡建设厅网站
  • 网站建设基本流程是什么做自己的网站怎么赚钱
  • 网站开发方案目录微网站 php
  • 企业网站找谁做黑龙江 网站建设
  • 设计网站属于什么专业西安高校网站建设
  • 长沙建站标协助找有为太极品牌商标设计logo
  • 年前做招聘网站话术上海短视频推广公司
  • 深圳网站公司有哪些网站弹出式链接后台怎么做
  • 网站建设与维护课程外汇网站怎么做优外汇网站
  • 如何制作自己的网站链接视频南宁做网站找哪家好
  • 域名注册网站的域名哪里来的太原营销网站建设制作平台
  • 区块链技术和网站开发结合自己建网站的流程
  • 花店网站建设环境分析营销者主要通过制作
  • 西昌市做网站的公司点样用外网访问自己做的网站
  • 一个网站怎么做app购物商城app
  • 网站ui设计用什么软件做人才市场网站建设论文
  • 查网站域名备案价格17网站一起做网店普宁
  • 做兼职一般去哪个网站wordpress消息通知
  • 做公司网站建设价格低wordpress MU多重筛选