注册typeHandler
注册TypeHandler
建立了自己的TypeHandler之后就需要把它注册到Mybatis的配置文件中,让Mybatis能够识别并使用它。注册TypeHandler主要有两种方式,一种是通过在Mybatis配置文件中定义typeHandlers元素的子元素typeHandler来注册;另一种是通过在Mybatis配置文件中定义typeHandlers元素的子元素package来注册。使用typeHandler子元素注册时一次只能注册一个TypeHandler,而使用package子元素注册时,Mybatis会把指定包里面的所有TypeHandler都注册为TypeHandler。使用typeHandler子元素注册时我们需要通过它的handler属性来指明当前要注册的TypeHandler的全名称,这个属性是必须要的。另外还有两个附加属性可以指定,一个是javaType,用以指定对应的java类型;另一个是jdbcType,用以指定对应的jdbc类型。使用package子元素注册时需要我们通过它的name属性来指定要扫描的包,如果这个时候我们也需要指定对应TypeHandler的javaType和jdbcType的话就需要我们在TypeHandler类上使用注解来定义了。Mybatis注册TypeHandler最基本的方式就是建立一个javaType、jdbcType和TypeHandler的对应关系。在使用typeHandler子元素进行注册的时候,有三种类型的注册方式:
1.如果我们指定了javaType和jdbcType,那么Mybatis会注册一个对应javaType和jdbcType的TypeHandler。
2.如果我们只指定了javaType属性,那么这个时候又分两种情况:
(1)如果我们通过注解的形式在TypeHandler类上用@MappedJdbcTypes指定了对应的jdbcType,那么Mybatis会一一注册指定的javaType、jdbcType和TypeHandler的组合,也包括使用这种形式指定了jdbcType为null的情况。现假设我们有如下这样一个StringArrayTypeHandler:
配置文件
<typeHandlers>
<typeHandler handler="com.xxx.typeHandler.TestStringTypeHandler" javaType="string" jdbcType="VARCHAR" />
</typeHandlers>
实现typeHandler接口
package com.xxx.typeHandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.log4j.Logger;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Created by chenjianan on 2016/11/10-17:00.
* <p>
* Describe:
*/
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({String.class})
public class TestStringTypeHandler extends BaseTypeHandler<String> {
private Logger log= Logger.getLogger(TestStringTypeHandler.class);
public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
log.info("使用我的TypeHandler");
preparedStatement.setString(i, s);
}
public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
log.info("使用我的TypeHandler,ResultSet列名获取");
return resultSet.getString(s);
}
public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
log.info("使用我的TypeHandler,ResultSet下标获取");
return resultSet.getString(i);
}
public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
log.info("使用我的TypeHandler,callableStatement下标获取");
return callableStatement.getString(i);
}
}
自定义typeHandler的使用
方法一
<resultMap id="roleMap" type="role">
<result jdbcType="VARCHAR" javaType="string" column="note" property="note" />
</resultMap>
<select id="typeHandlerTest" parameterType="string" resultMap="roleMap">
SELECT note FROM role WHERE note=#{note}
</select>
这里的 jdbcType="VARCHAR" javaType="string" 要和 配置文件的 javaType="string" jdbcType="VARCHAR" 一致
方法二
<resultMap id="roleMap" type="role">
<result column="note" property="note" typeHandler="com.plife.typeHandler.TestStringTypeHandler" />
</resultMap>
<select id="typeHandlerTest" parameterType="string" resultMap="roleMap">
SELECT note FROM role WHERE note=#{note}
</select>
这种方法 配置文件的 typeHandler不用配置
方法三
<select id="typeHandlerTest" parameterType="string" resultType="role">
SELECT note FROM role WHERE note=#{note javaType=string,jdbcType=VARCHAR,typeHandler=com.plife.typeHandler.TestStringTypeHandler}
</select>
这种方法 配置文件的 typeHandler不用配置