这期内容当中小编将会给大家带来有关怎么在Mybatis中通过自定义TypeHandler解决特殊类型转换问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
创新互联公司基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业四川移动机房托管报价,主机托管价格性价比高,为金融证券行业服务器托管,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。
定义一个role类,与数据库的role表对应:
public class Role { private Integer id; private String name; private Integer[] accessIds; private Date createTime; // ... ignore get and set methods }
注意到里面有一个accessIds字段,它的类型是Integer[]
数据库设计:
DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `access_ids` varchar(255) DEFAULT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of role -- ---------------------------- INSERT INTO `role` VALUES ('1', '测试角色', ',1,2,', '2019-11-14 13:43:14');
自定义Handler类
通过继承BaseTypeHandler类,重写其方法,定义一个Integer[]与数据库varchar类型自动转换的Handler类:
/** * Java Int数组与MySQL String转换器 * 比如[1,2,3] --> ",1,2,3," */ public class StringToIntArrayHandler extends BaseTypeHandler{ private static final String splitCharset = ","; @Override public void setNonNullParameter(PreparedStatement ps, int i, Integer[] objects, JdbcType jdbcType) throws SQLException { String str = arrayToString(objects); ps.setString(i, str); } @Override public Integer[] getNullableResult(ResultSet rs, String columnName) throws SQLException { String str = rs.getString(columnName); return stringToArray(str); } @Override public Integer[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String str = rs.getString(columnIndex); return stringToArray(str); } @Override public Integer[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String str = cs.getString(columnIndex); return stringToArray(str); } // --- private methods --- /** * Integer数组转String * 注:使用提前设定好的分隔符分割数组的每一项 */ private static String arrayToString(Integer[] array) { StringBuilder res = new StringBuilder(); if (array != null && array.length > 0) { for (Object o : array) { res.append(splitCharset).append(o.toString()); } res.append(splitCharset); } return res.length() > 0 ? res.toString() : null; } /** * 从String转Integer数组 * 注:String是用分隔符分割的,使用String.split方法可以分解为数组 */ private static Integer[] stringToArray(String str) { List list = new ArrayList<>(); if (str != null) { String[] array = str.split(splitCharset); if (array.length > 0) { for (String o : array) { if (o != null && o.length() > 0) { list.add(Integer.parseInt(o)); } } } } return list.toArray(new Integer[0]); } }
这个类的具体作用是什么呢?
当Java中类型是Integer[]时,使用这个Handler类,将Integer[]转换为以,号分割的字符串,然后存入数据库
当从数据库读取以,分割值的字符串时,可以通过这个Handler,自动将字符串转换为Integer[]数组
下面我们演示一下具体的使用smile
在Mybatis中应用自定义的Handler
Mybatis存放SQL语句的XML文件:
SELECT LAST_INSERT_ID() INSERT INTO role (name, create_time, access_ids) VALUES (#{name}, #{createTime} , #{accessIds, jdbcType=VARCHAR, typeHandler=com.example.model.dao.handler.StringToIntArrayHandler})
上述就是小编为大家分享的怎么在Mybatis中通过自定义TypeHandler解决特殊类型转换问题了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。