在实际开发中,可能会遇到这种情况,就是在存储性别时,数据库中存的是int 类型,男女用0和1进行存储,但是在表单进行提交时,或者要在表单进行显示性别时,不可能去显示数据库中存储的0和1,而是显示经过处理的男和女,这时处理的方法有两种,一种是在后台查询到数据的时候,对数据进行判断,然后赋予相应的值,然后将值返回到页面进行显示,另一种方法就是使用mybatis 提供的typeHandler进行数据类型的转换;
mybatis 中自定义typehandle的使用;
自定义一个类,去继承父类 BaseTypeHandler
package com.test.util;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
public class SexTypeHandler extends BaseTypeHandler
{
/**
* 根据查询到的结果进行判断返回到页面
*/
@Override
public String getNullableResult(ResultSet resultSet, String arg1)
throws SQLException {
String resultSets=resultSet.getString(arg1);
if(resultSets.equals("0")){
return "女";
}else{
return "男";
}
}
@Override
public String getNullableResult(ResultSet resultSet, int arg1)
throws SQLException {
String resultSets=resultSet.getString(arg1);
if(resultSets.equals("0")){
return "女";
}else{
return "男";
}
}
@Override
public String getNullableResult(CallableStatement resultSet, int arg1)
throws SQLException {
String resultSets=resultSet.getString(arg1);
if(resultSets.equals("0")){
return "女";
}else{
return "男";
}
}
/**
* 进行判断赋值
* @param resultSet
* @param arg1
* @param arg2
* @param arg3
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i,
String j, JdbcType arg3) throws SQLException {
//判断如果传递过来的值是男,就存1,否则存0
if(j.equals("男")){
preparedStatement.setString(i, Integer.valueOf(1).toString());
}
else{
preparedStatement.setString(i, Integer.valueOf(0).toString());
}
}
}
1.@MappedJdbcTypes定义的是JdbcType类型,这里的类型不可自己随意定义,必须要是枚举类org.apache.ibatis.type.JdbcType所枚举的数据类型。
2.@MappedTypes定义的是JavaType的数据类型,描述了哪些Java类型可被拦截。
3.在我们启用了我们自定义的这个TypeHandler之后,数据的读写都会被这个类所过滤
4.在setNonNullParameter方法中,我们重新定义要写往数据库的数据。
5.在另外三个方法中我们将从数据库读出的数据类型进行转换。
在Mapper中的配置如下:
在mapper中的resultMap中的配置如上,在查询的时候,返回值的类型parameterMap=resultMap即可,但是该种方式只适用于查询数据的时候进行数据的转换,但是在插入数据的时候,并不适合;
在插入的时候配置如下:
insert into test (id, createDate, sex
)
values (#{id,jdbcType=INTEGER}, #{createdate,jdbcType=VARCHAR,typeHandler=com.test.util.typeHandler}, #{sex,jdbcType=INTEGER,typeHandler=com.test.util.SexTypeHandler}
)
亦可以这样
insert into test (id, createDate, sex
)
values (#{id,jdbcType=INTEGER}, #{createdate,jdbcType=VARCHAR,javaType=Date}, #{sex,jdbcType=INTEGER,javaType=String}
)
@RequestMapping("insert")
public int insert(){
Test test=new Test();
test.setCreatedate(new Date());
test.setId(4);
test.setSex("男");
Integer a=testMapper.insert(test);
return a;
}
public int insert(){
Test test=new Test();
test.setCreatedate(new Date());
test.setId(4);
test.setSex("男");
Integer a=testMapper.insert(test);
return a;
}