MyBatis自定义类型转换器

本文介绍如何在MyBatis中自定义类型转换器,以实现Java中的boolean类型与数据库number类型的相互转换。通过编写继承BaseTypeHandler的转换器类,并在MyBatis配置文件中注册,最后在mapper.xml中应用,实现类型转换。

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>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘歌唱家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值