TypeHandler是什么
- TypeHandler被称作类型处理器,无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。
Type Handler | Java Types | JDBC Types |
---|---|---|
BooleanTypeHandler | java.lang.Boolean, boolean | Any compatible BOOLEAN |
ShortTypeHandler | java.lang.Short, short | Any compatible NUMERIC or SHORT INTEGER |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
… | … | 详细可见org.apache.ibatis.type包下内容 |
自定义一个TypeHandler
1. 创建一个类,继承BaseTypeHandler或者实现TypeHandler
- 继承BaseTypeHandler
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* author: boo
*/
@MappedTypes({String.class})
//@MappedJdbcTypes(JdbcType.VARCHAR)
public class AESEncryptHandler extends BaseTypeHandler<String>{
/** 将parameter转换成对应的数据库类型 */
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, AES.encrypt(parameter));
}
/** 根据字段名获取从数据库读取的字段数据 */
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
String columnValue = rs.getString(columnName);
return AES.decrypt(columnValue);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String columnValue = rs.getString(columnIndex);
return AES.decrypt(columnValue);
}
/** 根据下标获取从数据库读取的字段数据 */
@Override
public String getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String columnValue = cs.getString(columnIndex);
return AES.decrypt(columnValue);
}
public AESEncryptHandler() {
}
}
以上为自定义的一个TypeHandler,作用是对一些数据库的敏感字段进行加密处理;
其中 AES.encrypt(String str)
是自定义的一个字符串加密方法,这里可以根据自己的需求实现
- 实现TypeHandler接口的方法与上类似,不作赘述
2. 自定义TypeHandler的使用
- TypeHandler的使用方式有两种,全局注册使用,或指定字段使用
2.1 全局注册使用
有三种方式可以进行全局注册
-
- xml定义
<typeHandlers>
<typeHandler handler="com.boo.mybatis.demo.convert.AESEncryptHandler "/>
</typeHandlers>
-
- java config注入
@Configuration
public class MyBatisConfig
{
......
......
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{
String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
String mapperLocations = env.getProperty("mybatis.mapperLocations");
String configLocation = env.getProperty("mybatis.configLocation");
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
VFS.addImplClass(SpringBootVFS.class);
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(...);
// 自定义TypeHandler所在包
// sessionFactory.setTypeHandlersPackage("com.ruoyi.common.convert");
// 指定注册单个或多个TypeHandler
sessionFactory.setTypeHandlers(new TypeHandler[]{new AESEncryptHandler()});
sessionFactory.setTypeAliasesPackage(...);
sessionFactory.setMapperLocations(...);
sessionFactory.setConfigLocation(...);
return sessionFactory.getObject();
}
}
-
- @Annotation(注解)