观点:MybatisPlus字段类型转换的实现示例
目录
resultMap的作用是什么mybatisPlus如何完成字段映射自动映射@TableField是能够指定jdbcType的mybatis如何完成查询参数转换先来回忆下在mybatis中的resultMap作用和是什么
(资料图片仅供参考)
resultMap的作用是什么
在使用传统的mybatis时,我们一般都会在xml文件定义一个ResultMap
对每个字段都有自己的定义都有两个类型
javaType可以不显式写出来,mybatis可以根据指定的实体类推断出来
jdbcType 也就是对应到数据库中的字段类型
mybatis完成数据库的数据到java实体类型的转换这两个类型是必不可少的。会根据javaType和jdbcType去匹配到对应的处理器完成类型转换
mybatis内置了很多typeHandler在启动时注册
public TypeHandlerRegistry(Configuration configuration) {
this.unknownTypeHandler = new UnknownTypeHandler(configuration);
register(Boolean.class, new BooleanTypeHandler());
register(boolean.class, new BooleanTypeHandler());
register(JdbcType.BOOLEAN, new BooleanTypeHandler());
register(JdbcType.BIT, new BooleanTypeHandler());
register(Byte.class, new ByteTypeHandler());
register(byte.class, new ByteTypeHandler());
register(JdbcType.TINYINT, new ByteTypeHandler());
register(Short.class, new ShortTypeHandler());
register(short.class, new ShortTypeHandler());
register(JdbcType.SMALLINT, new ShortTypeHandler());
register(Integer.class, new IntegerTypeHandler());
register(int.class, new IntegerTypeHandler());
register(JdbcType.INTEGER, new IntegerTypeHandler());
register(Long.class, new LongTypeHandler());
register(long.class, new LongTypeHandler());
register(Float.class, new FloatTypeHandler());
register(float.class, new FloatTypeHandler());
register(JdbcType.FLOAT, new FloatTypeHandler());
register(Double.class, new DoubleTypeHandler());
register(double.class, new DoubleTypeHandler());
register(JdbcType.DOUBLE, new DoubleTypeHandler());
register(Reader.class, new ClobReaderTypeHandler());
register(String.class, new StringTypeHandler());
register(String.class, JdbcType.CHAR, new StringTypeHandler());
register(String.class, JdbcType.CLOB, new ClobTypeHandler());
register(String.class, JdbcType.VARCHAR, new StringTypeHandler());
register(String.class, JdbcType.LONGVARCHAR, new StringTypeHandler());
register(String.class, JdbcType.NVARCHAR, new NStringTypeHandler());
register(String.class, JdbcType.NCHAR, new NStringTypeHandler());
register(String.class, JdbcType.NCLOB, new NClobTypeHandler());
register(JdbcType.CHAR, new StringTypeHandler());
register(JdbcType.VARCHAR, new StringTypeHandler());
register(JdbcType.CLOB, new ClobTypeHandler());
register(JdbcType.LONGVARCHAR, new StringTypeHandler());
register(JdbcType.NVARCHAR, new NStringTypeHandler());
register(JdbcType.NCHAR, new NStringTypeHandler());
register(JdbcType.NCLOB, new NClobTypeHandler());
register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler());
register(JdbcType.ARRAY, new ArrayTypeHandler());
register(BigInteger.class, new BigIntegerTypeHandler());
register(JdbcType.BIGINT, new LongTypeHandler());
register(BigDecimal.class, new BigDecimalTypeHandler());
register(JdbcType.REAL, new BigDecimalTypeHandler());
register(JdbcType.DECIMAL, new BigDecimalTypeHandler());
register(JdbcType.NUMERIC, new BigDecimalTypeHandler());
register(InputStream.class, new BlobInputStreamTypeHandler());
register(Byte[].class, new ByteObjectArrayTypeHandler());
register(Byte[].class, JdbcType.BLOB, new BlobByteObjectArrayTypeHandler());
register(Byte[].class, JdbcType.LONGVARBINARY, new BlobByteObjectArrayTypeHandler());
register(byte[].class, new ByteArrayTypeHandler());
register(byte[].class, JdbcType.BLOB, new BlobTypeHandler());
register(byte[].class, JdbcType.LONGVARBINARY, new BlobTypeHandler());
register(JdbcType.LONGVARBINARY, new BlobTypeHandler());
register(JdbcType.BLOB, new BlobTypeHandler());
register(Object.class, unknownTypeHandler);
register(Object.class, JdbcType.OTHER, unknownTypeHandler);
register(JdbcType.OTHER, unknownTypeHandler);
register(Date.class, new DateTypeHandler());
register(Date.class, JdbcType.DATE, new DateOnlyTypeHandler());
register(Date.class, JdbcType.TIME, new TimeOnlyTypeHandler());
register(JdbcType.TIMESTAMP, new DateTypeHandler());
register(JdbcType.DATE, new DateOnlyTypeHandler());
register(JdbcType.TIME, new TimeOnlyTypeHandler());
register(java.sql.Date.class, new SqlDateTypeHandler());
register(java.sql.Time.class, new SqlTimeTypeHandler());
register(java.sql.Timestamp.class, new SqlTimestampTypeHandler());
register(String.class, JdbcType.SQLXML, new SqlxmlTypeHandler());
register(Instant.class, new InstantTypeHandler());
register(LocalDateTime.class, new LocalDateTimeTypeHandler());
register(LocalDate.class, new LocalDateTypeHandler());
register(LocalTime.class, new LocalTimeTypeHandler());
register(OffsetDateTime.class, new OffsetDateTimeTypeHandler());
register(OffsetTime.class, new OffsetTimeTypeHandler());
register(ZonedDateTime.class, new ZonedDateTimeTypeHandler());
register(Month.class, new MonthTypeHandler());
register(Year.class, new YearTypeHandler());
register(YearMonth.class, new YearMonthTypeHandler());
register(JapaneseDate.class, new JapaneseDateTypeHandler());
// issue #273
register(Character.class, new CharacterTypeHandler());
register(char.class, new CharacterTypeHandler());
}
当然我们不指定类型的话mybatis也具备自动推断类型的能力。
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#createAutomaticMappings
创建自动的字段映射根据数据库查询结果类型,和我们指定的对象字段类型做映射
mybatisPlus如何完成字段映射
当然也可以指定resultMap
@TableNam中有resultMap属性
/**
* 实体映射结果集,
* 只生效与 mp 自动注入的 method
*/
String resultMap() default "";@Mapper public interface UserDoMapper extends BaseMapper{ @Results( id = "userResultMap", value = {@Result(column = "id",property = "id",javaType = Integer.class,jdbcType = JdbcType.INTEGER), @Result(column = "user_name",property = "userName",javaType = String.class,jdbcType = JdbcType.VARCHAR), @Result(column = "pass_word",property = "passWord",javaType = String.class,jdbcType = JdbcType.VARCHAR), @Result(column = "real_name",property = "realName",javaType = String.class,jdbcType = JdbcType.VARCHAR), @Result(column = "json_arr",property = "jsonArr",typeHandler = StringToJsonArrayBaseTypeHandler.class), } ) @Select("SELECT * FROM user ${ew.customSqlSegment}") User searchDetail( @Param(Constants.WRAPPER) Wrapper wrapper); }
@TableName(resultMap = "userResultMap")
public class User {
@TableField(jdbcType = JdbcType.INTEGER)
private Integer id;
@TableField(jdbcType = JdbcType.VARCHAR)
private String userName;
@TableField(jdbcType = JdbcType.VARCHAR)
private String passWord;
@TableField(jdbcType = JdbcType.VARCHAR)
private String realName;
@TableField(typeHandler = StringToJsonArrayBaseTypeHandler.class)
private List jsonArr;
} 那么我们不想手动定义ResutMap但是又想处理一些复杂类型的转换 就可以使用autoResultMap
自动映射
我们在使用mybatisPlus时在大多数情况是不会定义resultMap的,那么mybatisPlus是如何完成字段映射的,那么答案显而易见,就是使用myabtis的字段自动创建映射的功能。
自动映射的方案有什么缺点?
1.对于复杂的类型,无法指定转换方案,无法使用自定义的类型转换器。
2.无法使用关联查询
开启autoResultMap
@TableName(autoResultMap = true)
那么mybatisPlus会根据我们的实体类的类型,为我们自动注入resultMap,注入的resultMap也会自动推断出需要使用的类型转换器当然我们也可以指定
例如
@TableField(typeHandler = StringToJsonArrayBaseTypeHandler.class)
private List jsonArr; 也因此说,对于查询来说,mybatisPlus通过@TableField指定类型转换器,一定要开启autoResultMap才能生效了。另外mybatisPlus只会为BaseMapper中的方法生成resultMap,而我们自定义的方法,是不会生成的。
例如
@Mapper public interface UserDoMapper extends BaseMapper{ @Select("SELECT * FROM user ${ew.customSqlSegment}") User searchDetail( @Param(Constants.WRAPPER) Wrapper wrapper); }
这种写法autoResultMap和指定的类型转换器是不会生效的。如果有复杂字段转换需求,需要通过@Results标签定义resultMap
例如
以及通过@ResultMap标签进行引用
@TableField是能够指定jdbcType的
不指定jdbcType时mybatis往往也能够完成自动转换,例如java中的String自然对应到数据库的VAERCHAR
在mybatis无法根据自动完成javaType到jdbcType的转换时,可以使用@TableField注解完成转换,例如我们想将一个数据库中的VARCHAR类型映射成为java中的Integer,对于插入操作时又要完成Integer到VARCHAR的转换,如果不指定jdbcType那么插入操作将会报错
@TableField(jdbcType = JdbcType.VARCHAR)
private Integer age;mybatis如何完成查询参数转换
前面看的是对于查询结果的转换,那么对于插入,更新,查询等操作,也有一个javaType到jdbcType的转换,对于复杂的字段类型 例如集合转json又是如何生效的?
还是先看传统mybatis定义映射的写法
insert into zb_labour_bid_auction_list (id, uuid, uuid_t, creater, create_time, updater, update_time, item_d, item_n, order_no, list_no, sub_project_name, construction_tech, unit, project_quantity, unit_price, total, remark, supplier_no, supplier_name) values (#{id,jdbcType=BIGINT}, #{uuid,jdbcType=VARCHAR}, #{uuidT,jdbcType=VARCHAR}, #{creater,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updater,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}, #{itemD,jdbcType=VARCHAR}, #{itemN,jdbcType=VARCHAR}, #{orderNo,jdbcType=VARCHAR}, #{listNo,jdbcType=VARCHAR}, #{subProjectName,jdbcType=VARCHAR}, #{constructionTech,jdbcType=VARCHAR}, #{unit,jdbcType=VARCHAR}, #{projectQuantity,jdbcType=NUMERIC}, #{unitPrice,jdbcType=NUMERIC}, #{total,jdbcType=NUMERIC}, #{remark,jdbcType=VARCHAR}, #{supplierNo,jdbcType=VARCHAR}, #{supplierName,jdbcType=VARCHAR})
在参数上一般都会定义jdbcType,至于JavaType可以从parameterType指定的class中推断出来,这样javaTyp和jdbcType都被确定下来,很容易匹配到对应的处理器进行类型转换。
那么在mybatisPlus中显然不会为每个入参字段定义jdbcType,那么对于入参是如何进行转换的,复杂类型又是如何指定的
@TableField(typeHandler = StringToJsonArrayBaseTypeHandler.class)
private List jsonArr; 答案也是通过@TableField指定的,而且即使关闭autoResultMap,对于查询参数的转换,指定的类型转换器和jdbcType也是会生效的。
到此这篇关于MybatisPlus字段类型转换的实现示例的文章就介绍到这了,更多相关MybatisPlus 字段类型转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
标签:
- 观点:MybatisPlus字段类型转换的实现示例
- 世界观热点:中华多少钱一包最新价格表_中华多少钱一包
- 环球播报:据《乌克兰真理报》、TSN新闻网7月1日报道,乌克兰总统泽连斯基在接受西班牙《世界报》采访时称,自俄私营军事集团“瓦格纳”参加俄乌冲突以来,乌军已消灭2.1万名“瓦格纳”成员,另有8000名“瓦格纳”成员受伤
- 今热点:古人称男子二十岁为_古人称男子二十岁为什么之年
- 北京广告协会:对蔡某某做好风险把控 粉丝群体未成年占多数!!_天天微动态
- 卢浮宫断臂维纳斯多高 神游卢浮宫八女神|环球信息
- 最新:江苏组织“人才夜市”挖掘见习岗位、发放社保补助稳岗促就业
- 沙摩柯三国杀_沙摩柯_每日快看
- 《火影究极风暴》新作新预告:鸣人佐助又打起来了!
- 头条:新一轮大范围强降雨来了 京津冀等地高温将短暂减弱
- 天天速讯:票务、寄存、咨询 故宫博物院一站式“观众服务中心”启用
- 暑运期间河北机场集团预计运送旅客225万人次 全球热门
- 环球速看:冬月结衣_冬月
- 九寨沟什么特产值得买|全球独家
- 厦门可发朋友圈的句子 句句精选随你挑 焦点滚动
- 捷达手动变速箱油多久换一次(捷达车多久换一次变速箱油?)
- 小米折叠屏和华为折叠屏对比(小米折叠屏松动)
- 湘西州民族实验小学开展暑假前防溺水应急演练 世界新视野
- 环球速讯:pptv怎么快进 pptv加速器
- 校正空速_关于校正空速概略
- 南昌县(小蓝经开区):全力以赴拼经济 顺利实现“双过半”-全球关注
- 刘军洛的博客_刘军洛最新微博
- 五地“合奏”《唱支山歌给党听》 今头条
- 前沿资讯!十四运帮助辽宁队夺冠 周琦赛后采访:只要辽宁需要我 我就会回来
- 售24.98万起 新款MINI COUNTRYMAN上市|全球快讯
- 天天热文:第一视角09 | 深蓝锚定行业第一增程品牌 是对的时间对的角色吗
- 甲氨蝶呤片作用与功效_甲氨蝶呤片作用
- 全球时讯:iphone 换电池价格(iphone 换电池)
- 天天时讯:利率是什么意思举例(利率是什么意思)
- 中国代表:美重返联合国教科文组织后不能搞对立和分裂 世界热消息
- 环球热头条丨擦亮生态“底色” 矿山复绿展新颜
- 德国去年资本外逃创纪录!欧洲最大经济体或已开启去工业化进程|当前滚动
- 青藏铁路格拉段“换装”完成 7月1日投入运营
- 病娇啥意思?_病娇啥意思
- 中国共产党首部党章,在这里诞生
- 【新要闻】中原镖局赵天豪第二部第22集 中原镖局之天地英豪人物简略介绍
- 佩杜拉:AC米兰对赫拉芬贝赫很感兴趣,球员希望有更多出场时间 今日热门
- 世界看点:祖冲之简介20字_祖冲之简介
- 德商产投服务(02270)附属认购3000万元理财产品
- 全球速看:高温黄色预警:山东等地局地超40℃,午后尽量减少户外活动
- 记者:曼联希望面谈未来,但德赫亚本周末要结婚 当前快播
- 世纪娱乐国际(00959)公布年度业绩 净亏损6254.9万港元 同比增长约16.02倍
- 先秦重器秦公钟:春秋时期早期秦文化的见证者|字见中国
- 天天资讯:松湖股份拟投资3万美金设立全资子公司香港半夏科技有限公司
- 北烤南蒸!全国热哭预警地图发布,超20省份迎高温持久战|环球热门
- 微信迁移公众号_公众号迁移流程
- 顺利退龙虎榜:营业部净买入25.00万元|世界热消息
- 冠冕服(冠冕) 独家
- 单位合影留念照片文字 合影留念文字-天天信息
- 水利部:2022年全国用水效率进一步提升
- 法国6月CPI月率0.2%
- 【环球报资讯】爱情不火热的星座,爱你只是一个外表,最爱的人是你自己
- 材料作文 中考(巧用材料夺高分:中考作文经典材料百变通) 全球今头条
- 山西出台若干措施推进承接东部地区外商制造业产业转移 视讯
- 无人驾驶概念股异动拉升 浙江世宝涨停
- 恒源煤电:6月29日融券净卖出1.69万股,连续3日累计净卖出3.64万股
- 剑网三开服监控安卓_剑网三开服监控-速读
- 每日速递:会泽“三学三比三看”为干部成长赋能
- 当前报道:警方:仁济医院“医生嫖娼、组织卖淫”系谣言 造谣者该院实习生
- “红纽带” 舞起来 ——京山市深化共同缔造推进党建引领基层治理创新试点综述 当前关注
- 男子多次剪断共享单车刹车线,警方蹲点两天将其抓获 每日观察
- 操盘必读|近七成银行家认为货币政策“适度”;3月末银行业对外金融资产15683亿美元|今亮点
- 电脑小键盘打不出数字num键会亮(电脑小键盘打不出数字)|天天快资讯
- 属牛2024感情和桃花运 表现不俗
- 此功能已修复(此选项卡已修复) 快报
- 妈妈为什么晚上总是嗯的叫,爸爸又不在家 实时焦点
- 寄生魔偶OVA
- 董宇辉小作文 董宇辉又给西安写小作文了 基本情况讲解
- 当前关注:离岸人民币兑美元失守7.27关口
- 石鳞鱼油怎么做(石鳞鱼油配方) 天天热议
- 天天视讯!捷强装备:终止重大资产重组事项
- 天天热点评!拓邦股份:公司正在与客户合作工业领域边缘计算终端
- 我国首列时速80公里A型“中国标准”地铁今日亮相
- 彭清林出院了!关于未来,他这样说……|快报
- 普华永道预测:2027中国将重新成为全球第一大电影市场
- 恒瑞医药:磷酸瑞格列汀片、奥特康唑胶囊(SHR8008胶囊)获药品注册证书-每日热点
- 环球视点!义乌火车站进站要转“十八弯”,旅客苦进站久矣!回复来了……
- 总额延续恢复态势 今年前五个月物流运行数据来啦 天天微速讯
- 安永:A股IPO活动全球领先,港股下半年有望逐步复苏
- 当前快讯:花旗大中华区首席经济学家:当前需降低存量房贷利率,降低住户部门付息压力
- 雅马哈f600和f310哪个好_雅马哈f600 今日精选
- 世界速讯:苹果屏幕镜像怎么连接电视盒子_苹果屏幕镜像怎么连接电视
- 腾笼换鸟 凤凰涅槃 当前热议
- 【环球热闻】荣耀Magic4 至臻版图中文字提取方法介绍
- 每日消息!室内通风、适度锻炼 有助预防慢阻肺
- 全球资讯:印度止咳糖浆被揭用工业原料
- 两年内跌超30%,上海“最强学区房”神话破灭?曾经一周涨39.4%-世界最新
- 世界速讯:湖北新铜都城发9.8亿元私募项目状态更新为“终止”
- 中国物流与采购联合会:1-5月物流总额129.9万亿元 同比增长4.5% 世界热门
- 星源卓镁6月29日盘中涨幅达5%_每日快播
- 广西三代接力守护城市“颜值” 后代致力改善环卫一线工作-当前头条
- 30亿!大基金二期出手,战投华虹半导体回A
- 重点聚焦!全民k歌视频制作软件 全民k歌视频制作
- 【世界独家】国内期货主力合约涨跌不一,甲醇涨超3%,原油、燃油涨超1%
- 三旺通信(688618)6月28日主力资金净买入167.06万元
- 吓!女子全身变成火龙果色,竟因家里养了它,路边花20元买的……_全球热消息
- 全球速看:到2021年 互联汽车信息娱乐和远程信息处理占98%的M2M数据流量
- 英伟达 RTX 4060 显卡测试:RTX 2080 水平,不及 RTX 3060 Ti
- 创纪录!俄罗斯一次发射43颗卫星-世界热门
- 会议策划内容包括哪些方面有哪些_会议策划 天天快看点
广告
广告
- 长治襄垣县增收11517万元 提前15天实现首季“开门红”
- 黑龙江讷河新增1例确诊4例无症状 病例详情公布
- 浙江宁波余姚奉化宁海三地开展核酸检测 结果均为阴性
- 浙江湖州南浔三处棋牌室经营者被行拘
- 那年今日 | 一张漫画涨知识之12月13日
- 在宁波乘火车跨省出行须持48小时内核酸阴性证明
- 浙江温州一地发现核酸弱阳性?复采复检结果均为阴性
- 浙江三门发现一名密接者:二次核酸检测结果均为阴性
- 贱卖的发电机 新买的制茶机——安徽水电供区改革两周年回访见闻
- 浙江杭州新增1例新冠肺炎确诊病例 为集中隔离人员
- 2022年研考在即,学硕缩招,专硕时代真的来了?
- 探访杭州核酸检测点:排队高峰多在夜间 医院24小时运转
- 浙江发挥零售药店“哨点”作用 织就疫情防控监测网
- 哈尔滨市本轮疫情首批1名确诊患者出院
- 宁波镇海第三轮全员核酸检测574181人 结果均为阴性
- 陕西新增本土确诊病例1例、境外输入无症状感染者2例
- 齐齐哈尔讷河一地调整为中风险地区
- 浙江新增新冠肺炎确诊病例75例 其中本土74例
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 黑龙江无新增确诊病例 新增本土核酸检测初筛阳性人员5例





