一般在表设计的时候会考虑到数据库字段类型和java中属性一致的问题,但是也有可能会出现一些情况导致类型不一致的问题,比如:二次开发中需求更改等。此时数据库和java中的代码不能随便更改,所以考虑的思路是通过typeHandler作为中间体来把类型转换。
当然,如果可以直接在获取字段后,直接通过simpleFormart来转换后,来处理数据就可以了。
此方法是在获取不了字段的情况下进行的。
数据库中类型:varchar
java的pojo属性:Date
实现类型转换功能其实就是三步:
一.定义一个转换工具类进行自己需要类型的转换(比如在工具包中新建一个TypeHandlerToString类,继承 BaseTypeHandler
二.注册刚定义的转换工具类,使它可以起作用
三.在UserMapper.xml文件中给出要用哪个TypeHandler
第一:添加一个工具类来定义转换的类型
a.在工具类包中定义一个工具类,如:TypeHandlerToString 继承 BaseTypeHandler
b.重写相应的四个方法(一个set,三个get---get方法只是参数不一样)
一个set方法
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
ps.setString(i,simpleDateFormat.format(parameter));
}
@Override
public Date getNullableResult(ResultSet rs, String columnIndex) throws SQLException {
String varchartime = rs.getString(columnIndex);
if(varchartime != null){
return new Date(Long.parseLong(varchartime));
}
else return null;
}
@Override
public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String varchartime = rs.getString(columnIndex);
if(varchartime != null){
return new Date(Long.parseLong(varchartime));
}
else return null;
}
@Override
public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String varchartime = cs.getString(columnIndex);
if(varchartime != null){
return new Date(Long.parseLong(varchartime));
}
else return null;
}
第二:在mybatis-config.xml文件中注册,添加typeHandler组件,包含了handler,jdbcType,javaType
注册可以两种方式:在实现类上添加注解 或 在mybatis-config.xml添加标签
handler:自己定义的转换工具类来映射,如:cn.lung.flower.utils.TypeHandlerToString,这个属性是一定要有的
jdbcType:数据库中字段的类型,如:varchar
javaType:java中的属性,如:Date
此处需要注意:java的pojo类的date类型一定要是java.util.Date,如果是java.sql.Date的数据会出现错误。而在mybatis-config.xml文件中的类型mybatis-config.xml文件中的类型也可以是java.sql.Date,但是最好和pojo一致。
至此,类型的转换功能已经可以使用了
-----------------------------------------------------------------------------------------------
扩展一下:
在注册的时候,可以分为多种情况(拿注解举例子):
只添加@MappedJdbcTypes注解,不添加@MappedTypes : 个人测试,显示的数据和数据库中不一致
只添加@MappedTypes注解,不添加@MappedJdbcTypes : 个人测试,数据一致
两种注解都不添加 : 个人测试,数据一致
在mybatis-config.xml文件中添加或者不添加 jdbcType,javaType 属性,和注解的情况是一样的
它内部是如何匹配到的在这就不详细解释了,这个链接有详细分析:http://blog.csdn.net/a1258531/article/details/51822875
-----------------------------------------------------------------------------------------------
第三:在UserMapper.xml文件的resultMap组件中添加 javaType+jdbcType或者 typeHandler ,可以匹配到之前定义的转换工具类
这一步会涉及到mybatis内部是如何找到转换类的(如果是string和data类型之间的转换,整个第三步都可以不要。如果是,如:String<---->varchar的话,需要下面的操作)
如果注册时 只添加@MappedTypes注解,不添加@MappedJdbcType 对应的UserMapper文件中resultMap就只添加javaType,
或者是用typeHandler代替,直接指定实现类,如下:
所以最简单的做法是:
自定义的实现类继承BaseTypeHandler +mytis-config.xml文件组件只添加handler属性 + UserMapper.xml文件resultMap字段用typeHandler
测试一下:
写一个User类,定义一个类型为java.util.Date的属性date,重写toString(),加入SimpleDateFormat,指定格式
SimpleDateFormat s = new SimpleDateFormat("yyyy/MM/dd/ HH:mm:ss");
@Override
public String toString() {
return " date=" s.format(date) ;
}
随便找一个地方调用user对象,打印出来,结果:
注意一个基本问题:格式设置时要和数据库的格式一样,比如:数据库精确到秒,则java端也要精确到秒,否则数据丢失
LG