相比JDBC,为什么MyBatis需要TypeHandler接口所提供的功能?

MyBatis中的TypeHandler的作用是用于Java与数据库的数据类型转换;
但在JDBC中,貌似并没有涉及到Java和数据库之间的类型转换啊.它们之间的类型转换指的是
什么时间发生的转换?
阅读 4.1k
4 个回答

数据库类型也有涯, 而Java类型也无涯, 以有涯对无涯, TypeHandler来也.

如果你有一个自己的类型,比如叫MyVersionClass 对应地要存到数据的一个MyVersion(varchar(100))字段里:

class MyVersionClass{

 int major,
 int minor,
 int reversion

}

保存时, 你想存成这个样子 1.2.3, 取出来后再还原成MyVersionClass, 这时你就可以定义一个MyVersionTypeHandler帮你在存储和取出时自动完成转换.

正因为JDBC没有涉及到java与数据库之间的类型转化,所以需要TypeHandler.
举个例子吧 IntegerTypeHandler
rs.getInt(columnName); // rs为ResultSet, 从int转化为Integer。
ps.setInt(i, parameter); // ps为PreparedStatement, 从Integer转化为int。 parameter为Integer类型

给你个Date类型好了。
DateOnlyTypeHandler

ps.setDate(i, new java.sql.Date((parameter.getTime())));
// 这边的parameter是 java.util.Date
java.sql.Date sqlDate = rs.getDate(columnName);
if (sqlDate != null) {
    return new java.util.Date(sqlDate.getTime());
}
在Java中的Girl实体类中,isBeauty的数据类型为Boolean[],
而MySQL中的Girl表的isBeauty字段的数据类型为varchar,
这时候在MyBatis中,直接向数据库添加数据将会出现错误,而TypeHandler接口可以解决这个问题.

图片描述

主要为4个文件,其中:
    Girl.java定义了实体类;
    girlMapper为MyBatis的映射文件;
    GirlTest.java为测试类;
    GirlTypeHandler.java为类型转换器,用于将Java中的Boolean[]类型转换为数据库中的varchar类型
    
具体代码如下:
-----------------------------------------------------------------------

数据表Girl:
create table girl(
    name varchar(20),
    isBeauty varchar(10)
)charset = utf8;    
    
    
    
-----------------------------------------------------------------------
Girl.java
    
public class Girl {
    
    private String name;
    private Boolean[] isBeauty;  //两个true代表美女,两个false代表非美女
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Boolean[] getIsBeauty() {
        return isBeauty;
    }
    public void setIsBeauty(Boolean[] isBeauty) {
        this.isBeauty = isBeauty;
    }
}    

------------------------------------------------------------------
girlMapper.xml

<mapper namespace="com.kgc.mybatis.pojo">
    <insert id="addGirl" parameterType="Girl">
        insert into girl values(#{name},#{isBeauty,jdbcType=VARCHAR})
    </insert>
</mapper>


------------------------------------------------------------------
public class GirlTypeHandler implements TypeHandler<Boolean[]> {

    @Override
    public void setParameter(PreparedStatement ps, int i, Boolean[] parameter, JdbcType jdbcType) throws SQLException {
        //为了方便,省略判断
        ps.setString(i, "很漂亮哦");
    }

    //省略其他几个方法...
    
}


------------------------------------------------------------------
测试类:
    @Test
    public void addGirl(){
        Girl girl = new Girl();
        girl.setName("小倩");
        
        Boolean[] beauty = {true,true};
        girl.setIsBeauty(beauty);
        //4.执行插入操作,返回影响行数
        int count = session.insert("com.kgc.mybatis.pojo.addGirl", girl);
        System.out.println(count>0?"insert succ!" : "insert fail!");
    }































撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题