TypeHandlers:类型处理器
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个JDBC类型。例如需求:一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库的varchar毫秒值之间转换。
开发步骤:
①定义转换类继承类BaseTypeHandler
②覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时 mysql的字符串类型转换成 java的Type类型的方法
③在MyBatis核心配置文件中进行注册
数据库文件
实体类
package com.domain;
import java.math.BigInteger;
import java.util.Date;
public class UserBir {
int id;
String username;
String password;
Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "UserBir{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", birthday=" + birthday +
'}';
}
}
映射文件
package com.util;
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 MyDate extends BaseTypeHandler<Date> {
// 将Java类型转换成数据库类型
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
preparedStatement.setLong(i, date.getTime());
}
// 将数据库中类型转换成Java类型
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
long Dlong = resultSet.getLong(s);
Date date = new Date(Dlong);
return date;
}
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
long Dlong = resultSet.getLong(i);
Date date = new Date(Dlong);
return date;
}
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
long Dlong = callableStatement.getLong(i);
Date date = new Date(Dlong);
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>
<!-- 注册类型处理器-->
<typeHandlers>
<typeHandler handler="com.util.MyDate"></typeHandler>
</typeHandlers>
<!-- 指定默认的环境名称-->
<environments default="development">
<!-- 指定当前环境名称-->
<environment id="development">
<!-- 事务管理器-->
<transactionManager type="JDBC"></transactionManager>
<!-- 指定当前数据类型是连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/one"/>
<property name="username" value="root"/>
<property name="password" value="admin123"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
编写接口
package com.mapper;
import com.domain.UserBir;
import java.util.List;
public interface UserMapper {
// 插入数据接口
void insert(UserBir userBir);
// 查询数据接口
List<UserBir> findAll();
}
下面进入正题
定义转换类继承类BaseTypeHandler
package com.util;
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 MyDate extends BaseTypeHandler<Date> {
// 将Java类型转换成数据库类型
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
preparedStatement.setLong(i, date.getTime());
}
// 将数据库中类型转换成Java类型
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
long Dlong = resultSet.getLong(s);
Date date = new Date(Dlong);
return date;
}
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
long Dlong = resultSet.getLong(i);
Date date = new Date(Dlong);
return date;
}
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
long Dlong = callableStatement.getLong(i);
Date date = new Date(Dlong);
return date;
}
}
在MyBatis核心配置文件中进行注册
<!-- 注册类型处理器-->
<typeHandlers>
<typeHandler handler="com.util.MyDate"></typeHandler>
</typeHandlers>
测试
package com.test;
import com.domain.UserBir;
import com.mapper.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 org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MyTest {
// 测试插入操作
@Test
public void test1() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserBir userBir = new UserBir();
userBir.setId(1);
userBir.setUsername("liu");
userBir.setPassword("123");
userBir.setBirthday(new Date());
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.insert(userBir);
sqlSession.close();
}
// 测试查询操作
@Test
public void test2() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<UserBir> list = userMapper.findAll();
System.out.println(list);
sqlSession.close();
}
}