MyBatis-Plus——字段类型处理器TypeHandler

字段类型处理器(TypeHandler)

1,准备工作

(1)MyBatis 中的 TypeHandler 类型处理器用于 JavaTypeJdbcType 之间的转换,假设我们用户表中有一个联系方式字段,类型为字符串:

在这里插入图片描述

(2)而对应的实体类代码如下,可以看到实体类中 contact 属性类型为 Map。由于与数据库字段类型不匹配,如果不做任何处理的话无论是查询还是插入都会报错。

这里我们通过 @TableField 注解将 FastjsonTypeHandler 这个类型处理器快速注入到 mybatis 容器中:

注意:使用字段类型处理器时,必须开启映射注解 @TableName(autoResultMap = true)。否则插入没问题,但查询时该字段会为空。

@Data
@TableName(autoResultMap = true)
public class UserInfo {private Integer id;private String userName;private String passWord;private Integer age;@TableField(typeHandler = FastjsonTypeHandler.class)private Map<String, String> contact;
}

(3)由于这里用到了 Fastjson 这个JSON 处理器,所以项目中也要添加相关的依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.56</version>
</dependency>

2,开始测试

(1)首先创建一个对象插入到数据库,可以看到虽然对象里的 contact 是一个 Map,但会自动转成 JSON 字符串存到数据库中:

UserInfo user = new UserInfo();
user.setUserName("hangge");
user.setPassWord("123");
//添加联系方式
Map<String, String> contact = new HashMap<>();
contact.put("phone", "010-1234567");
contact.put("tel", "13388889999");
user.setContact(contact);
userInfoMapper.insert(user);

在这里插入图片描述

(2)接着测试下查询,可以发现数据库的 字符串也会自动转换成 :

List<UserInfo> users = userInfoMapper.selectList(null);
System.out.println(users);

在这里插入图片描述

附:自定义 TypeHandler 类型处理器

1,准备工作

(1)如果我们需要实现一个自定义的 TypeHandler 类型处理器,则需继承 ListTypeHandler 接口,接口作用是用于指定 jdbcjava 的数据类型间对应关系处理。接口代码如下:

public interface TypeHandler<T> {// 保存操作,数据入库之前时数据处理void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;//下面三个则是,从数据库加载数据后,vo对象封装前的数据处理T getResult(ResultSet rs, String columnName) throws SQLException;T getResult(ResultSet rs, int columnIndex) throws SQLException;T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}

(2)这里我们定义一个 list类型转varchar (逗号隔开的字符串)的类型处理器,即 list [1,2,3] ==》varchar 1,2,3

@MappedJdbcTypes(JdbcType.VARCHAR)  //数据库类型
@MappedTypes({List.class})          //java数据类型
@Log
public class ListTypeHandler implements TypeHandler<List<String>> {@Overridepublic void setParameter(PreparedStatement ps, int i,List<String> parameter, JdbcType jdbcType) throws SQLException {log.info("method ====>>> setParameter");String hobbys = dealListToOneStr(parameter);ps.setString(i , hobbys);}/*** 集合拼接字符串* @param parameter* @return*/private String dealListToOneStr(List<String> parameter){if(parameter == null || parameter.size() <=0)return null;String res = "";for (int i = 0 ;i < parameter.size(); i++) {if(i == parameter.size()-1){res+=parameter.get(i);return res;}res+=parameter.get(i)+",";}return null;}@Overridepublic List<String> getResult(ResultSet rs, String columnName)throws SQLException {log.info("method ====>>> getResult(ResultSet rs, String columnName)");return Arrays.asList(rs.getString(columnName).split(","));}@Overridepublic List<String> getResult(ResultSet rs, int columnIndex)throws SQLException {log.info("method ====>>> getResult(ResultSet rs, int columnIndex)");return Arrays.asList(rs.getString(columnIndex).split(","));}@Overridepublic List<String> getResult(CallableStatement cs, int columnIndex) throws SQLException{log.info("method ====>>> getResult(CallableStatement cs, int columnIndex)");String hobbys = cs.getString(columnIndex);return Arrays.asList(hobbys.split(","));}
}

(3)接着在对应的实例类中使用@TableField 注解指定使用这个自定义的字段类型处理器:

@Data
@TableName(autoResultMap = true)
public class UserInfo {private Integer id;private String userName;private String passWord;private Integer age;@TableField(typeHandler = ListTypeHandler.class)private List<String> contact;
}

2,开始测试

(1)首先创建一个对象插入到数据库,可以看到虽然对象里的 contact List,但会自动转成逗号隔开的字符串存到数据

UserInfo user = new UserInfo();
user.setUserName("hangge");
user.setPassWord("123");
//添加联系方式
List<String> contact = new ArrayList<>();
contact.add("010-1234567");
contact.add("13388889999");
contact.add("10001");
user.setContact(contact);
userInfoMapper.insert(user);

(2)接着测试下查询,可以发现数据库的字符串也会自动还原成 List:

List<UserInfo> users = userInfoMapper.selectList(null);
System.out.println(users);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

额外参数_Pytorch获取模型参数情况的方法

分享人工智能技术干货&#xff0c;专注深度学习与计算机视觉领域&#xff01;相较于Tensorflow&#xff0c;Pytorch一开始就是以动态图构建神经网络图的&#xff0c;其获取模型参数的方法也比较容易&#xff0c;既可以根据其内建接口自己写代码获取模型参数情况&#xff0c;也可…

Mybatis-Plus之逻辑删除

概念 什么是逻辑删除 逻辑删除:假删除。将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。 数据库实现思路:插入数据时,标记为未删除状态;查询、修改时,只获取未删除状态的数据进行操作;删除时则更新删除状态为已删除…

查看分支编码_MySQL分支数据库MariaDB之CentOS安装教程

MariaDB数据库管理系统是MySQL的一个分支&#xff0c;由MySQL的创始人Michael Widenius主持开发。采用GPL授权许可 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;在存储引擎方面&#xff0c;使用XtraDB(英语&#xff1a;XtraDB)来代替MySQL的InnoDB。1…

关联规则算法c语言样例及分析_推荐系统总结系列-关联规则算法(四)

基于关联规则的推荐有三种方法&#xff1a;Apriori关联规则算法FP Tree关联规则算法&#xff1b;PrefixSpan关联规则算法&#xff1b;关联规则挖掘推荐算法&#xff1a;关联规则挖掘是一种在大规模交易中识别类似规则关系模式的通用技术&#xff0c;可以应用到推荐系统中。交易…

perclos嘴巴_一种基于视频分析的疲劳状态检测方法及装置与流程

本发明涉及疲劳检测领域&#xff0c;特别是涉及一种基于视频分析的疲劳状态综合检测方法及装置。背景技术&#xff1a;疲劳状态检测技术在交通运输、生产安全、教育培训等许多领域应用广泛。目前&#xff0c;疲劳状态检测的方法一般可分为接触式和非接触式两大类。其中&#xf…

Mybatis-Plus条件

Mybatis-Plus条件 条件构造器 说明: 以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中没有标明condition的方法,默认为true以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)以下方法在入参中出现的R为泛型,在普通wrapper中…

Mysql - Innodb锁、事务与隔离级别

我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题&#xff0c;数据库…

东南西北十字图_word画东南西北方向图标 怎么在Word里绘制方向十字图标

如果你使用的是2007版的话&#xff0c;可以在插入选项中找到插入图形选项&#xff0c;里面有一个箭头总汇&#xff0c;选择你所需要的就行了&#xff01;如果是2003版的话&#xff0c;也可以在插入选项中找到图形&#xff0c;里面也有这一项&#xff01;怎么样在word07文档里键…

语言非递归求解树的高度_算法素颜(11):无死角“盘”它!二分查找树

引言《菜鸟也能“种”好二叉树&#xff01;》一文中提到了&#xff1a;为了方便查找&#xff0c;需要进行分层分类整理。而满足这种目标的数据结构之一就是树。树的叶子节点可以看作是最终要搜寻的目标物&#xff1b;叶子节点以上的每一层&#xff0c;都可以看作是一个大类别、…

Mysql InnoDB存储引擎的锁相关

Mysql InnoDB存储引擎的锁相关 InnoDB下&#xff0c;mysql四个级别隔离下加锁操作 四个级别隔离的写操作都加X锁串行化下读加S锁select … for update, select … lock in share mode 分别加x锁&#xff0c;s锁在需要加锁的场景下&#xff0c;会根据情况使用三种加锁策略&…

安装python37路径报错_Robot framework安装python3.7导入HttpLibrary.HTTP报错

报错信息&#xff1a;20200106 18:23:28.178 [WARN]: Importing test library "HttpLibrary.HTTP" failedTraceback (most recent call last):Importing test library HttpLibrary.HTTP failed: SyntaxError: invalid syntax (__init__.py, line 16)Traceback (most …

MySQLl的可串行化_mysql事务串行化的锁机制是怎样的?

1、mysql的可串行化 首先&#xff1a;可串行化serializable 这是事务的最高级别&#xff0c;在每条读的数据上&#xff0c;加上锁&#xff0c;使之不可能相互冲突&#xff0c;因此&#xff0c;会导致大量的超时现象。 解释如下&#xff1a; 以A&#xff0c;B用户为例&#…

显示器尺寸对照表_电脑显示器尺寸对照表一览,教你怎么选择最适合自己的显示器尺寸...

显示小课堂&#xff1a;显示器买大买小谁说了算&#xff1f; [本文来自&#xff1a;www.ii77.com]今天&#xff0c;笔者想和大家讨论一下关于显示器尺寸选择方面的问题。通过这两年显示器行业的发展我们不难看出&#xff0c;现在显示器的尺寸越来越大&#xff0c;三十几吋、四十…

MySQL事务隔离级别理解_解读MYSQL的可重复读、幻读及实现原理

前言 提到事务&#xff0c;你肯定不会陌生&#xff0c;最经典的例子就是转账&#xff0c;甲转账给乙100块&#xff0c;当乙的账户中到账100块的时候&#xff0c;甲的账户就应该减去100块&#xff0c;事务可以有效的做到这一点。 在MySQL中&#xff0c;事务支持实在引擎层实现的…

react 子传参父_React 子组件向父组件传值的方法

本文介绍了React 子组件向父组件传值的方法&#xff0c;分享给大家子组件需要控制自己的 state&#xff0c; 然后告诉父组件自己的state&#xff0c;通过props调用父组件中用来控制state的函数&#xff0c;在父组件中展示子组件的state变化。/***实现在输入框输入邮箱时&#x…

MySQ事务

事务 事务是访问数据库的一个操作序列&#xff0c;事务的正确执行使得数据库从一种状态转换为另一种状态。事务必须服从ACID原则。原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。 原子性&#xff1a;不可分割&#xff0c;事务要么全部被执…

boost互斥锁_boost锁使用总结

boost锁的概述&#xff1a;boost库中提供了mutex类与lock类&#xff0c;通过组合可以轻易的构建读写锁与互斥锁。举个通俗的例子&#xff0c;如果共享资源是一个自动锁住的房间&#xff0c;互斥体是钥匙&#xff0c;进入房间必须取钥匙&#xff0c;离开房间应该还钥匙。这就对应…

MySQL 是如何实现四大隔离级别的?

MySQL 是如何实现四大隔离级别的&#xff1f; 在mvcc下&#xff0c;mysql中用到的锁还是共享锁和排他锁么&#xff1f;如果是的话&#xff0c;那么是怎样结合锁和mvcc来实现rc和rr隔离级别的呢&#xff1f;还有mysql中在ru隔离级别下&#xff0c;两个事务同时读取数据对象A&am…

无符号右移负数_关于负数的右移与无符号右移运算小结

对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:对于负数的右移&#xff1a;因为负数在内存中是以补码形式存在的&#xff0c;所有首先根据负…

Linux命令 移动/复制文件/目录到指定目录下

1、同一个服务器下复制文件或文件夹 1.1 复制文件 复制文件&#xff1a;把1.txt 复制到根目录下的sbin目录 cp 文件名&#xff08;可带路径&#xff09;目标路径&#xff08;带路径&#xff09;如&#xff1a;cp 1.txt ~/sbin/1,2 复制目录 复制目录&#xff1a;把relea…