MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用 类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器(截取部分):
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler,
然后可以选择性地将它映射到一个JDBC类型。
例如需求:一个Java中的Date数据类型,我想将之存到数据库的时候存成一 个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库的varchar毫秒值之间转换。
步骤分3步走:
① 定义转换类继承类BaseTypeHandler
② 覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult 为查询时 mysql的字符串类型转换成 java的Type类型的方法
③ 在MyBatis核心配置文件中进行注册
④ 测试转换是否正确
我们就写 写继承的吧:
1.首先在数据库user中添加 birthday 字段 然后设置为bigint型(毫秒 所以bigint) 、Bean加上字段 birthday 是Date类型
【这里省略 写接口 和 写 映射文件,就是一个普通的加入用户:】
2.我们继承BaseTypeHandler类吧 泛型为你要转换的类型:
package com.bihu.handler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
public class DateTypeHandler extends BaseTypeHandler<Date> {
//这个是java数据中的类型 到 数据库中的数据类型 的回调方法
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
preparedStatement.setLong(i,date.getTime()); //i就是位置 ,然后设置一下Date转换一下毫秒值
}
//这个是数据库中的类型 到 java数据类型 的回调方法【下面三个都是】
/**
*
* @param resultSet 查询出来的结果集
* @param s 要转换的字段名称
*/
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
long aLong = resultSet.getLong(s);//按照字段获取到数据库的Long【bigint】
return new Date(aLong); // Long转Date返回
}
//这个是数据库中的类型 到 java数据类型 的回调方法
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
long aLong = resultSet.getLong(i); //按照index找
return new Date(aLong); // Long转Date返回
}
//这个是数据库中的类型 到 java数据类型 的回调方法
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
long aLong = callableStatement.getLong(i); //按照index找
return new Date(aLong); // Long转Date返回
}
}
DateTypeHandler 【时间类型转换器】
3.我们在核心配置文件注册一下即可:
然后我们测试:
package com.bihu.Service;
import com.bihu.Bean.User;
import com.bihu.Dao.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
public class UserService {
public static void main(String[] args) throws IOException {
User bihu = new User();
bihu.setId(10086);
bihu.setUsername("中国一动不动");
bihu.setPassword("1008611");
bihu.setBirthday(new Date());
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(bihu);
sqlSession.commit(); //提交事务
sqlSession.close(); //关闭(回收)连接口
}
}
Service 测试
运行发现:
语句和参数都正确 发现date变了 一长串毫秒数。
返回查询来也一样 这里给出结果 不给出过程 自己测:
作者:咸瑜