Mabatis typeHandler的使用

来源:互联网 发布:阿里云免费ssl 编辑:程序博客网 时间:2024/05/17 09:17

在实际开发中,可能会遇到这种情况,就是在存储性别时,数据库中存的是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{/** * 根据查询到的结果进行判断返回到页面 */@Overridepublic String getNullableResult(ResultSet resultSet, String arg1)throws SQLException {String resultSets=resultSet.getString(arg1);if(resultSets.equals("0")){return "女";}else{return "男";}}@Overridepublic String getNullableResult(ResultSet resultSet, int arg1)throws SQLException {String resultSets=resultSet.getString(arg1);if(resultSets.equals("0")){return "女";}else{return "男";}}@Overridepublic 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 */@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i,String j, JdbcType arg3) throws SQLException {//判断如果传递过来的值是男,就存1,否则存0if(j.equals("男")){preparedStatement.setString(i, Integer.valueOf(1).toString());}else{preparedStatement.setString(i, Integer.valueOf(0).toString());}}}
对于自定义typeHandler中的参数及方法解释:

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;

}

其他形式举一反三即可