使用Mybatis的TypeHandler实现字段的类型映射转换
程序员文章站
2022-04-23 15:55:58
...
1. mybatis的TypeHandler类型转换
它的作用就是将java类型(javaType)转化为jdbc类型(jdbcType),或者将jdbc类型(jdbcType)转化为java类型(javaType)。
2. 通过一个例子来了解TypeHandler的实现机制
将java字符数组String[]转化成数据库varchar类型。如:String[] interests = {“movie”, “music”}转为”movie,music",同时也能实现从varchar转化为String[] 数组。
- 自定义类型转换器
//定义JavaType的数据类型,描述了哪些java类型可被拦截
@MappedTypes({String[].class})
//定义JdbcType类型,这里的类型不可自己随意定义,必须要是枚举类org.apache.ibatis.type.JdbcType所枚举的数据类型。
@MappedJdbcTypes({JdbcType.VARCHAR})
public class StringArrayTypeHandler extends BaseTypeHandler<String[]>{
/**
* 把Java类型参数转换为对应的数据库类型
* @param ps 当前的PreparedStatement对象
* @param i 当前参数位置
* @param parameter 当前参数的Java对象
* @param jdbcType 当前参数的数据库类型
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {
// 由于BaseTypeHandler中已经把parameter为null的情况做了处理,所以这里我们就不用在判断parameter是否为空,直接用就可以了
StringBuffer result = new StringBuffer();
for (String value : parameter) {
result.append(value).append(",");
}
result.deleteCharAt(result.length() - 1);
ps.setString(i, result.toString());
}
/**
* 获取数据结果集时把数据库类型转换为对应的Java类型
* @param rs 当前的结果集
* @param columnName 当前的字段名称
* @return 转换后的Java对象
* @throws SQLException
*/
@Override
public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
return this.getStringArray(rs.getString(columnName));
}
/**
* 通过字段位置获取字段数据时把数据库类型转换为对应的Java类型
* @param rs 当前的结果集
* @param columnIndex 当前字段的位置
* @return 转换后的Java对象
* @throws SQLException
*/
@Override
public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return this.getStringArray(rs.getString(columnIndex));
}
/**
* 调用存储过程后把数据库类型的数据转换为对应的Java类型
* @param cs 当前的CallableStatement执行后的CallableStatement
* @param columnIndex 当前输出参数的位置
* @return
* @throws SQLException
*/
@Override
public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return this.getStringArray(cs.getString(columnIndex));
}
/**
* 讲”movie,music"转化为数组对象
* @param columnValue
* @return
*/
private String[] getStringArray(String columnValue) {
if (columnValue == null)
return null;
return columnValue.split(",");
}
}
- 配置文件里配置自定义的TypeHandler
<typeHandlers>
<!--<typeHandler handler="com.yongssu.mybatis.demo1.StringArrayTypeHandler" javaType="[Ljava.lang.String;" jdbcType="VARCHAR"/>-->
<typeHandler handler="com.yongssu.mybatis.demo1.StringArrayTypeHandler"/>
</typeHandlers>
如果在自定义类型转化器时通过注解标注了对应的javaType以及jdbcType,则在配置文件中不需要再次声明;如果没有,则需要在配置文件中说明avaType和jdbcType。
- 声明包含String[]数组的学生类
public class Student {
private int student_id;
private String student_name;
private int student_age;
private String student_phone;
private String[] interests;
public Student() {
super();
}
public int getStudent_id() {
return student_id;
}
public void setStudent_id(int student_id) {
this.student_id = student_id;
}
public String getStudent_name() {
return student_name;
}
public void setStudent_name(String student_name) {
this.student_name = student_name;
}
public int getStudent_age() {
return student_age;
}
public void setStudent_age(int student_age) {
this.student_age = student_age;
}
public String getStudent_phone() {
return student_phone;
}
public void setStudent_phone(String student_phone) {
this.student_phone = student_phone;
}
public String[] getInterests() {
return interests;
}
public void setInterests(String[] interests) {
this.interests = interests;
}
@Override
public String toString() {
return "Student{" +
"student_id=" + student_id +
", student_name='" + student_name + '\'' +
", student_age=" + student_age +
", student_phone='" + student_phone + '\'' +
", interests=" + Arrays.toString(interests) +
'}';
}
}
- 总结
通过上面的例子,可以发现要实现自定义TypeHandler,只需要继承BaseTypeHandler,然后实现相应的转换规则就可以了。
原文链接:https://www.jianshu.com/p/6172c7f6e27e
推荐阅读
-
oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
-
代码-mysql中字段为text类型使用mybatis的Criteria查询无法进行封装
-
mybatis使用generator自动生成代码时的类型转换
-
mysql的timestamp类型字段为'0000-00-00 00:00:00'导致mybatis映射时报错解决方法
-
MyBatis自定义TypeHandler处理枚举类型的字段
-
使用Mybatis的TypeHandler实现字段的类型映射转换
-
oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
-
Python 注释,简单的用户输入输出,类型转换问题及使用if 语句实现猜年龄
-
MyBatis里字段到枚举类型的转换/映射