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

发布于 2022-09-06 10:30:54 字数 123 浏览 12 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

猥琐帝 2022-09-13 10:30:55

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

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

class MyVersionClass{

 int major,
 int minor,
 int reversion

}

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

壹場煙雨 2022-09-13 10:30:55

TypeHandler 一般用于复杂类型的装换,比如你的字段是 JSON 格式,自动转化成 POJO。

JDBC 的 API 提供了 Java 与 数据库类型装换,比如ResultSet,

本人的SF直播中,有详细讲解:

JDBC : https://segmentfault.com/l/15...
MyBatis : https://segmentfault.com/l/15...

囚我心虐我身 2022-09-13 10:30:55

正因为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());
}
指尖凝香 2022-09-13 10:30:55
在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!");
    }































~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文