通过TypeHandler将javaType与jdbcType转换,主要涉及TypeHandler接口,BaseTypeHandler抽象类具体实现类
//类型转换器typeHandler,完成查询中javaType和jdbcType的转换
public interface TypeHandler<T>{ //T -> javaType
//通过PreparedStatement对象设置参数
void setParameter(PreparedStatement ps,int i,T parameter,jdbcType jdbcType)throws SQLException;
//获取结果集数据并转换为T类型返回的方法
T getResult(ResultSet rs,String columnName)throws SQLException;
T getResult(ResultSet rs,int columnIndex)throws SQLException;
T getResult(CallableStatement cs,int columnIndex)throws SQLException;//存储过程使用
}
//Mybatis本身实现typeHandler接口的基础抽象类
public abstract class BaseTypeHandler<T> extends TypeReference<T> implements TypeHandler{
...
@Override
//通过JDBC的PreparedStatement对象设置SQL语句参数
public void setParameters(PreparedStatement ps,int i,T parameter,jdbcType jdbcType)throws SQLException {
if(parameter == null){
if(jdbcType == null){//若参数parameter和jdbcType同时为空抛出TypeExpection异常
throw new TypeExpection(...);
}
try{
//若参数parameter为空且jdbcType不为空,通过PreparedStatement的setNull方法设置参数
ps.setNull(i,jdbcType.TYPE_CODE);
}catch(...){...}
}else {
try{
//若都不为空,通过parameter自身类型选择调用 PreparedStatement 上不同的方法
setNonNullParameter(ps,i,parameter,jdbcType);
}catch(...){...}
}
}
@Override
public T getResult(ResultSet rs,String columnName)throws SQLException{
T result;
try{//抽象方法各子类不同实现,获取结果集中指定的名为columnName的T类型数据
result = getNullableResult(rs,columnName);
}catch(...){...}
if(rs.wasNull()){return null;}
else return result;
}
@Override
public T getResult(ResultSet rs,int columnIndex)throws SQLException{...}
@Override
public T getResult(CallableStatement cs,int columnIndex)throws SQLException{...}
public abstract void setNullableResult(ResultSet rs,String columnName)throws SQLExeption;
...
}
//具体实现类,javaType为String与jdbcType为String转换(参数parameter为String类型,返回数据columnName列也为String类型)
public class StringTypeHandler extends BaseTypeHandler<String>{
@Override
public void setParameters(PreparedStatement ps,int i,T parameter,jdbcType jdbcType)throws SQLException{
ps.setString(i,parmeter);
}
@Override
//在ResultSet结果集中得到列columnName并将其以String类型返回
public String getNullableResult(ResultSet rs,String columnName)throws SQLException{
return rs.getString(columnName);
}
...
}
//系统注册typeHandler,通过类TypeHandlerRegistry的register方法注册
public TypeHandlerRegistry(){
register(Boolean.class,new BooleanTypeHandler());
...
}