typeHandlers标签
类型处理器,处理可以使用默认的类型处理器,还可以自己重写类型处理器或创建自己的类型处理器,来处理不支持的或非标准的类型。
具体的做法:
实现 org.apache.ibatis.type.TypeHandler 接口,
或继承 org.apache.ibatis.type.BaseTypeHandler 类,
然后可以选择性的将它映射到一个JDBC类型。
例子:
一个Java中的Date 数据类型,我想将它存到数据库的时候,存成一个1970年至今的毫秒数,取出来时转换成Java的Date,即Java的Date与数据库的 varchar 毫秒值之间的转换。
开发步骤:
1.定义转换类,继承BaseTypeHandler 类,
2.覆盖4个未实现的方法,其中 setNonNullParameter 为程序设置 数据到数据库 的回调方法,getNullableResult 为查询时 MySQL的字符串类型转换成 Java 的Type类型的方法,
3.在MyBatis核心配置文件中进行注册
4.测试转换是否正确
首先,向数据库表中添加新的字段,birthday 类型类 bigint


修改User实体类为
package com.itheibai.entity;
import java.util.Date;
public class User {
private int id;
private String username;
private String password;
private Date birthday;
//此处省略了get、set和toString方法
创建mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheibai.dao.UserDao">
<insert id="save" parameterType="user">
insert into user values (#{id},#{username},#{password},#{birthday})
</insert>
</mapper>
dao层创建方法
package com.itheibai.dao;
import com.itheibai.entity.User;
public interface UserDao{
public void save(User user);
}
定义转换类,在com.itheibai目录下

package com.itheibai.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类型 转换成 数据库 需要的类型
* @param preparedStatement
* @param i
* @param date
* @param jdbcType
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
//将Java类型Date 转换为毫秒值
long time = date.getTime();
preparedStatement.setLong(i,time);
}
/**
* 将数据库 的类型转换成 Java类型
* @param resultSet 查询出的结果集
* @param s 要转换的字段的名称
* @return
* @throws SQLException
*/
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
//将结果集中需要的数据(long)转换成Date类型 返回
long aLong = resultSet.getLong(s);
Date date = new Date(aLong);
return date;
}
/**
* 将数据库 的类型转换成 Java类型
* @param resultSet 查询出的结果集
* @param i 要转换的字段
* @return
* @throws SQLException
*/
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
//将结果集中需要的数据(long)转换成Date类型 返回
long aLong = resultSet.getLong(i);
Date date = new Date(aLong);
return date;
}
/**
* 将数据库 的类型转换成 Java类型
* @param callableStatement
* @param i
* @return
* @throws SQLException
*/
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
long aLong = callableStatement.getLong(i);
Date date = new Date(aLong);
return date;
}
}
在核心配置文件中注册类型处理器
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--通过properties标签加载外部properties文件-->
<properties resource="jdbc.properties"></properties>
<!--自定义别名-->
<typeAliases>
<typeAlias type="com.itheibai.entity.User" alias="user"></typeAlias>
</typeAliases>
<!--注册类型处理器-->
<typeHandlers>
<typeHandler handler="com.itheibai.handler.DateTypeHandler"></typeHandler>
</typeHandlers>
<!--数据源环境-->
<environments default="developement">
<environment id="developement">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="com/itheibai/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
测试类型处理器
package com.itheibai.test;
import com.itheibai.dao.UserDao;
import com.itheibai.entity.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MyBatisTest {
/**
* 测试类型转换器
* @throws IOException
*/
@Test
public void test1() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//模拟传入的user数据
User user = new User();
user.setUsername("张三");
user.setPassword("123456");
user.setBirthday(new Date());
UserDao userDao = sqlSession.getMapper(UserDao.class);
userDao.save(user);
sqlSession.commit();
sqlSession.close();
}
}
测试结果

评论前必须登录!
注册