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