MyBatis自定义类型转换器
发布日期:2021-05-07 13:38:25 浏览次数:7 分类:原创文章

本文共 3113 字,大约阅读时间需要 10 分钟。

MyBatis虽然自身提供了很多种默认的转换机制,比如数据库中的number类型会自动转换成java的int类型,varchar/varchar2会自动转换成String…如果这些默认的类型转换依旧不能满足程序的开发,开发者就应该考虑自己去编写类型转换器!
本文以jav中的boolean转化为数据库中number为例子。(True-1,false-0)
下面讲述实现方法:
1.编写继承 BaseTypeHandler的实现类BooleanAndIntConverter(转换器类)
从数据库取数据用的下面的getXx方法,放数据到数据库中用的是setXX方法!

package converter;import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;//自定义类型转化器  java:boolean -> sql:number   要么implements TypeHandler  要么...public class BooleanAndIntConverter  extends BaseTypeHandler<Boolean> {   //继承实现类要好写一点    //java(boolean)->db(number)    /**     *preparedStatement:preparedStatement对象     * i:preparedStatement对象操作参数的位置     * aBoolean:java值     * jdbcType:jdbc操作的数据库类型     */    @Override    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Boolean aBoolean, JdbcType jdbcType) throws SQLException {           if(aBoolean){               preparedStatement.setInt(i,1);        }else{               preparedStatement.setInt(i,0);        }    }    //db->java    @Override    public Boolean getNullableResult(ResultSet resultSet, String s) throws SQLException {           int sexNum = resultSet.getInt(s);//        if(sexNum==1)//            return true;//        else//            return false;        return sexNum == 1?true:false;    }    //db->java    @Override    public Boolean getNullableResult(ResultSet resultSet, int i) throws SQLException {           int sexNum = resultSet.getInt(i);        return sexNum == 1?true:false;    }    //db->java    @Override    public Boolean getNullableResult(CallableStatement callableStatement, int i) throws SQLException {           int sexNum = callableStatement.getInt(i);        return sexNum == 1?true:false;    }}

2.配置Mybatis的核心配置文件

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--配置转换器-->    <typeHandlers>        <typeHandler handler="converter.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER"/>    </typeHandlers></configuration>

3.使用使用时要改变对应mapper.xml的方法中的返回值
使用resultMap强制改变类型:(下面只是案例,没任何实际意义)

<!--使用转换器的查询--> <select id="queryStudentByStunoWithConverter" resultMap="studentResult" parameterType="int">        select * from student3 where stuno = #{stuno}    </select>    <resultMap type="student3" id="studentResult">        <!--分为主键id  和  非主键 result-->        <id property="stuNo" column="stuno"/>        <result property="stuName" column="stuname"/>        <result property="stuAge" column="stuage"/>        <result property="graName" column="graname"/>        <result property="stuSex" column="stusex"  javaType="boolean" jdbcType="INTEGER"/>    </resultMap><!--使用转换器的增加-->    <insert id="addStudentWithConverter" parameterType="student3">        insert into student3(stuno,stuname,stuage,graname,stusex) values(#{stuNo},#{stuName},#{stuAge},#{graName},#{stuSex,javaType=boolean,jdbcType=INTEGER})    </insert>

至此,类型转换器就可以正常使用了。

上一篇:MyBatis环境切换问题
下一篇:EL表达式

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年03月17日 08时48分49秒