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

MyBatis中的TypeHandler的作用是用于Java与数据库的数据类型转换;

但在JDBC中,貌似并没有涉及到Java和数据库之间的类型转换啊.它们之间的类型转换指的是

什么时间发生的转换?

回答

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

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

class MyVersionClass{

int major,

int minor,

int reversion

}

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

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

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

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

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

正因为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接口可以解决这个问题.

【java】相比JDBC,为什么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!");

}

以上是 【java】相比JDBC,为什么MyBatis需要TypeHandler接口所提供的功能? 的全部内容, 来源链接: utcz.com/a/72665.html

回到顶部