一、小需求
我们需要将java中的list类型转化成为字符串转化成string 保存到数据库
比如集合中[1,2,3,4] 数据库中的保存成 1,2,3,4
二、代码实现
package com.gupaoedu.type;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author: kangping
*
* 泛型传你要转换的字段,我们是要把List集合转换成拼接的字符串
*/
public class MyTypeHandler extends BaseTypeHandler<List<Integer>> {
/**
* 设置结果集
* @param ps
* @param i
* @param parameter
* @param jdbcType
* @throws SQLException
*/
public void setNonNullParameter(PreparedStatement ps, int i, List<Integer> parameter, JdbcType jdbcType)
throws SQLException {
// 设置 String 类型的参数的时候调用,Java类型到JDBC类型
// 注意只有在字段上添加typeHandler属性才会生效
// insertBlog name字段
System.out.println("---------------setNonNullParameter1:"+parameter);
if (parameter != null && parameter.size() > 0) {
String str =parameter.stream().map(e -> e.toString()).collect(Collectors.joining(","));
ps.setString(i, str);
} else {
ps.setString(i, "");
}
}
/**
* 通过列名称从结果集获取数据
* @param rs
* @param columnName
* @return
* @throws SQLException
*/
public List<Integer> getNullableResult(ResultSet rs, String columnName) throws SQLException {
// 根据列名获取 String 类型的参数的时候调用,JDBC类型到java类型
// 注意只有在字段上添加typeHandler属性才会生效
System.out.println("---------------getNullableResult1:"+columnName);
String columnValues = rs.getString(columnName);
if (columnValues!=null && !columnValues.equals("")){
String[] split = columnValues.split(",");
List<Integer> list = Arrays.asList(split).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList());
return list;
}
return new ArrayList<Integer>();
}
/**
* 通过列下标获取数据
* @param rs
* @param columnIndex
* @return
* @throws SQLException
*/
public List<Integer> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
// 根据下标获取 String 类型的参数的时候调用
System.out.println("---------------getNullableResult2:"+columnIndex);
return null;
}
/**
* 获取游相关的数据
* @param cs
* @param columnIndex
* @return
* @throws SQLException
*/
public List<Integer> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
System.out.println("---------------getNullableResult3:");
return null;
}
}
- 继承BaseTypeHandler类,实现当中的方法
- 传入的泛型为需要转换的java类型
- 实现逻辑(看上面的代码和注释)
三、怎么使用
1.我们查询结果时,需要在resultMap当中的那个字段上配置一个typeHandler标签,如下:
<resultMap id="Basic_column" type="com.gupaoedu.domain.Test">
<result column="id" property="id"/>
<!--<result column="types" property="types"/>-->
<result column="types" property="types" typeHandler="com.gupaoedu.type.MyTypeHandler"/>
</resultMap>
2.当我们插入数据时,需要在对应的字段的#{}当中配置typeHandler,注意这里不需要加双引号,如下:
<insert id="insert" parameterType="com.gupaoedu.domain.Test">
insert into test(id,types) value (#{id},#{types,typeHandler=com.gupaoedu.type.MyTypeHandler})
</insert>