需求
使用Ibatis时,我们通常是将一个Java类映射成一张表,属性与列一一对应。有时,我们需要将一个Java类映射成表中的一列。此时我们需要handler。
Handler
TypeHandlerCallback实现Java类型与数据库类型的映射。
例如,有一个Product类,我们要把它映射到PRD表,将desc字段映射成PRD表中的DESC列。
Product类:
class Product{
private long id;
private Description desc;
// 省略getter、setter
}
Description类:
class Description{
private String title;
private String content;
// 省略getter、setter
}
PRD表:
列名 | 类型 |
ID | BIGINT |
DESC | VARCHAR |
第一步,编写DescTypeHandlerCallback:
public class DescTypeHandlerCallback implements TypeHandlerCallback {
public Object getResult(ResultGetter getter) throws SQLException {
String[] tokens = getter.getString().split(":");
Description foo = new Description();
foo.setTitle(tokens[0]);
foo.setContent(tokens[1]);
return foo;
}
public void setParameter(ParameterSetter setter, Object obj) throws SQLException {
Description foo = (Description) obj;
setter.setString(foo.getTitle() + ":" + foo.getContent());
}
public Object valueOf(String str) {
return null;
}
}
我们只需要实现Description与字符串的转化,框架会负责字符串与VARCHAR的转化
Description类对应的字符串格式是:title+ ":" + content
setParameter
将Description对象转化为字符串
我们调用setter的setString方法将转化得到的字符串回传给框架
getResult
将字符串转化Description对象
我们通过调用getter的getString方法获得DESC列的字符串值,将转化得到的Description返回给框架
第二步,在sqlmap文件中定义别名:
<typeAlias alias="descHandler" type="test.DescTypeHandlerCallback"/>
第三步,使用handler
在映射参数时:
<insert parameterClass="test.Product">
insert into BIG_FOO (ID, DESC) values (#id#, #desc,<span style="color:#ff0000;">handler=descHandler</span>#)
</insert>
在映射结果时:
<resultMap id="prdMap>
<result property="id" column="ID"/>
<result property="desc" column=DESC" <span style="color:#ff0000;">handler="descHandler"</span>/>
</resultMap>
<select parameterClass="int" resultMap="prdMap">
select ID,DESC from PRODUCT where ID=#value#
</select>
扩展Ibatis支持类型
我们在sqlmap-config中做如下配置:
<typeHandler javaType="test.Description" jdbcType="VARCHAR" callback="test.DescTypeHandlerCallback"/>
此后,Ibatis将会知道如何映射Description,在映射时,我们不需要指定handler。
Ibatis默认支持如下类型:
- 八种基本类型以及装箱类型
- String
- 时间类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp
- BigDecimal