建设网站注意实现,深圳网站建设服务哪家有,深圳网络推广案例,oa系统软件1. 问题#xff1a;
假设这么一个场景 localurl里面的值大概这样#xff1a;dwad21.jpg,dwad22.jpg,dwad.23.jpg 是一个字符串 如果我在sql表中有一个字段#xff08;local_url#xff09;是本地图片资源的多个url字符串拼接值。我想在java后端中不进行额外的转换就取值加…
1. 问题
假设这么一个场景 localurl里面的值大概这样dwad21.jpg,dwad22.jpg,dwad.23.jpg 是一个字符串 如果我在sql表中有一个字段local_url是本地图片资源的多个url字符串拼接值。我想在java后端中不进行额外的转换就取值加值。我需要的是里面的dwad21.jpg最好做集合处理。 最好的情况就是使用sql映射到对象的时候就把把字符串变成集合dwad21.jpg,dwad22.jpg,dwad.23.jpg {dwad21.jpg,dwad22.jpg,dwad.23.jpg} 然后使用insert或者update的时候自动把集合变成字符串{dwad21.jpg,dwad22.jpg,dwad.23.jpg} dwad21.jpg,dwad22.jpg,dwad.23.jpg
2. 解决思路
2.1.typehandler官网介绍
主要是对请求数据或者接受数据进行自定义映射处理。
我只能说mybaits非常任性了提供了自定义类型转换器。 mybatis官网配置类型处理器 《------------------------------------------------------------------》 功能MyBatis 在设置预处理语句PreparedStatement中的参数或从结果集中取出一个值时 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。 下面是常用的数据类型的默认使用的类型处理器。
类型处理器Java 类型JDBC 类型BooleanTypeHandlerjava.lang.Boolean,boolean BOOLEANByteTypeHandlerjava.lang.Byte,byte NUMERIC,BYTEShortTypeHandlerjava.lang.Short, short NUMERIC SMALLINTIntegerTypeHandlerjava.lang.Integer, int NUMERIC INTEGERLongTypeHandlerjava.lang.Long, long NUMERIC BIGINTFloatTypeHandlerjava.lang.Float, float NUMERIC FLOATDoubleTypeHandlerjava.lang.Double, double NUMERIC ,DOUBLEBigDecimalTypeHandlerjava.math.BigDecimal NUMERIC, DECIMALStringTypeHandlerjava.lang.String CHAR, VARCHAR
2.2. 创建自定义handler 你可以重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为 实现 org.apache.ibatis.type.TypeHandler 接口继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler 并且可以可选地将它映射到一个 JDBC 类型。比如 在大部分使用场景中mybaitis的默认类型转换器就可以帮助大家的java对象到jdbc对象的转换。
但是我的整的花活显然不是满足。正好mybatis允许我们自定义类转换器。
我们这里使用实现接口的方法进行类型控制器的声明
public class StringToListTypeHandler implements TypeHandlerListString {Overridepublic void setParameter(PreparedStatement ps, int i, ListString parameter, JdbcType jdbcType) throws SQLException {if (parameter ! null) {ps.setString(i, String.join(,, parameter));} else {ps.setNull(i, jdbcType.TYPE_CODE);}}Overridepublic ListString getResult(ResultSet rs, String columnName) throws SQLException {String columnValue rs.getString(columnName);return convertStringToList(columnValue);}Overridepublic ListString getResult(ResultSet rs, int columnIndex) throws SQLException {String columnValue rs.getString(columnIndex);return convertStringToList(columnValue);}Overridepublic ListString getResult(CallableStatement cs, int columnIndex) throws SQLException {String columnValue cs.getString(columnIndex);return convertStringToList(columnValue);}private ListString convertStringToList(String columnValue) {if (columnValue ! null) {return Arrays.asList(columnValue.split(,));} else {return null;}}
}setParameter 方法这个方法用于将 Java 对象的参数设置到 PreparedStatement 中通常用于将参数绑定到 SQL 语句中的占位符。在这个示例中它将 List 类型的参数转换为逗号分隔的字符串并设置到 PreparedStatement 中。如果参数为 null它将设置为数据库类型的 null 值。 getResult(ResultSet rs, String columnName)从 ResultSet 对象中获取结果根据列名 columnName 获取对应的列的值。 getResult(ResultSet rs, int columnIndex)从 ResultSet 对象中获取结果根据列索引 columnIndex 获取对应的列的值。 getResult(CallableStatement cs, int columnIndex)从 CallableStatement 对象中获取结果根据列索引 columnIndex 获取对应的列的值。通常这种情况用于从存储过程中获取结果。 一般只实现一个方法即可
2.3. 注册类型转换器
要注意 MyBatis 不会通过检测数据库元信息来决定使用哪种类型所以你必须在参数和结果映射中指明字段是 VARCHAR 类型
typeHandlerstypeHandler handlercom.chen.behindimagesmanage.handler.StringToListTypeHandler javaTypejava.util.Listjava.lang.String jdbcTypeVARCHAR/
/typeHandlers当然这里也可以配置别名如果这里设置了类型在mapper里就可以不用设置了。
2.4. mapper使用类型转换器
mapper xml文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.chen.behindimagesmanage.dao.FileDao!-- 定义一个查询语句 --resultMap idimageMetaDataResultMap typecom.chen.behindimagesmanage.pojo.ImageMetaDataid propertyid columnid /result propertymd5 columnmd5 /result propertyaliyunUrl columnaliyun_url /result propertylocalUrl columnlocal_url typeHandlercom.chen.behindimagesmanage.handler.StringToListTypeHandler /result propertyversion columnversion //resultMapselect idgetAllImg resultTypeimageMetaDataResultMapSELECT * FROM image_metadata/select!-- 定义一个更新语句 --parameterMap idimageMetaDataParamMap typecom.chen.behindimagesmanage.pojo.ImageMetaDataparameter propertyid jdbcTypeINTEGER javaTypejava.lang.Integer modeIN/parameter propertymd5 jdbcTypeVARCHAR javaTypejava.lang.String modeIN/parameter propertyaliyunUrl jdbcTypeVARCHAR javaTypejava.lang.String modeIN/parameter propertylocalUrl typeHandlercom.chen.behindimagesmanage.handler.StringToListTypeHandler/parameter propertyversion jdbcTypeINTEGER javaTypeint modeIN//parameterMapupdate idupdateLocalUrl parameterTypeimageMetaDataParamMapUPDATE image_metadata SET local_url #{imageMetaData.localUrl}, version #{imageMetaData.localUrl} 1 WHERE version #{imageMetaData.localUrl}/update/mapper
mapper接口层
Mapper
public interface FileDao {/*** 获取所有img归属信息* return 所有归属信息*/ListImageMetaData getAllImg();/*** 更新元数据归属服务器* param imageMetaData 更新的元数据列* return 影响行*/int updateLocalUrl(ImageMetaData imageMetaData);
}