MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,或从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。
我们怎么配置一个自定义TypeHandler ?
MappedJdbcTypes({JdbcType.VARCHAR})
MappedTypes({String[].class})
public class StringArrayTypeHandler implements TypeHandler<String[]> { //..中间的实现代码省略了 //.. }
一: 注册TypeHandler
在Mybatis的配置文件中这样注册
<typeHandlers>
<typeHandler handler="com.jstudio.mybatis.handler.StringArrayTypeHandler" jdbcType="VARCHAR" javaType="[Ljava.lang.String;"/>
</typeHandlers>
在Spring的配置文件中直接配置
<!-- 配置sqlsessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 自动扫描 Mapper 文件, 借口命名与 *Mapper.xml 一致! -->
<property name="mapperLocations" value="classpath:org/jstudioframework/freeway/**/mapper/*Mapper.xml"/>
<property name="dataSource" ref="dataSource"/>
<!-- 配置Mybatis的插件plugin-->
<property name="plugins">
<list>
<ref bean="paginationInterceptor"/>
<ref bean="sqlStatementMonitorInterceptor"/>
</list>
</property>
<property name="typeHandlers">
<list>
<bean class="org.jstudioframework.mybatis.type.StringTokenizerLongTypeHandler" />
</list>
</property>
</bean>
二:在mapper.xml中使用
在resultMap的定义中对对应列定义typeHandler
<resultMap type="Note" id="baseResultMap">
<result property="id" column="id" />
<result property="names" column="names" jdbcType="VARCHAR" javaType="[java.lang.String;"
typeHandler="demo.StringArrayTypeHandler"/>
</resultMap>
这里只能是在select的时候才会使用自定义的TypeHandler处理对应的映射关系,如果要在insert或者update时使用则需要在sql定义中添加相应的内容。如下:
<update id="updateNames" parameterType="User">
update user
set names=#{names, javaType=[java.lang.String;, jdbcType=VARCHAR}
where id=#{id}
</update>
如果显示的注册了typehandler的jdbcType和javaType可用下面方式
<update id="updateNames" parameterType="User">
update user
set names=#{names,typeHandler=demo.StringArrayTypeHandler}
where id=#{id}
</update>
MyBatis TypeHandler配置
最新推荐文章于 2024-07-09 19:11:22 发布