mybatis自定义数组类型解析器

mybatis自定义数组类型解析器

    • 1.编写类型解析器类
    • 2. 在mybatis-config.xml中注册该解析器
    • 3.使用自定义类型解析器

1.编写类型解析器类

  • 方案一:继承BaseTypeHandler类,重写方法
package com.ali.springboot.typeHandler;

import org.apache.ibatis.type.*;

import java.sql.*;

/**
 * @MappedJdbcTypes注解指定要处理的jdbc数据类型
 * @MappedTypes指定要处理的java类型
 */
MappedJdbcTypes(JdbcType.REAL)
@MappedTypes(Float.class)
public class ArrayTypeHanlder extends BaseTypeHandler {


    private static final String TYPE_NAME_FLOAT = "Float";
    private static final String TYPE_NAME_INTEGER = "Integer";
    private static final String TYPE_NAME_STRING = "String";


    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
        /**
         * 判断类型
         */
        String typeName=null;
        if(parameter instanceof Float[]){
            typeName=TYPE_NAME_FLOAT;
        }else if(parameter instanceof Integer[]){
            typeName=TYPE_NAME_INTEGER;
        }else if(parameter instanceof String[]){
            typeName=TYPE_NAME_STRING;
        }

        /**
         * 如果在定义的类型中没有该参数的类型,则抛出异常
         */
        if(typeName == null){
            throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
        }

        /**
         * 根据类型和参数创建相应的数组
         */
        Connection conn = ps.getConnection();
        Array array = conn.createArrayOf(typeName, parameter);
        ps.setArray(i, array);
    }

    @Override
    public Object[] getNullableResult(ResultSet rs, String s) throws SQLException {
        return getArray(rs.getArray(s));
    }

    @Override
    public Object[] getNullableResult(ResultSet rs, int i) throws SQLException {
        return getArray(rs.getArray(i));
    }

    @Override
    public Object[] getNullableResult(CallableStatement cs, int i) throws SQLException {
        return getArray(cs.getArray(i));
    }

    private Object[] getArray(Array array) {

        if (array == null) {
            return null;
        }

        try {
            return (Object[]) array.getArray();
        } catch (Exception e) {
        }

        return null;
    }
}

  • 方案二:实现TypeHandler重写方法
package com.ali.springboot.typeHandler;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;

import java.sql.*;

@MappedJdbcTypes(JdbcType.REAL)
@MappedTypes(Float.class)
public class FloatArrayTypeHandler implements TypeHandler {
    @Override
    public void setParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
        Connection conn = ps.getConnection();
        Array array = conn.createArrayOf(parameter.getClass().getName(), parameter);
        ps.setArray(i,array);
    }

    @Override
    public Object[] getResult(ResultSet rs, String s) throws SQLException {
        return getArray(rs.getArray(s));
    }

    @Override
    public Object[] getResult(ResultSet rs, int i) throws SQLException {
        return getArray(rs.getArray(i));
    }

    @Override
    public Object[] getResult(CallableStatement cs, int i) throws SQLException {
        return getArray(cs.getArray(i));
    }

    private Object[] getArray(Array array){
        if(array==null){
            return null;
        }
        try {
            return (Object[]) array.getArray();
        } catch (Exception e) {
        }

        return null;
    }

}

2. 在mybatis-config.xml中注册该解析器







    
        
    


3.使用自定义类型解析器




	
	
		
		
	


参考

你可能感兴趣的:(mybatis)