Mabatis typeHandler的使用

本文介绍如何在MyBatis中使用自定义TypeHandler实现数据库字段与Java对象之间的转换,以解决性别字段的显示问题。

在实际开发中,可能会遇到这种情况,就是在存储性别时,数据库中存的是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());
		}
	}
	

}

   
对于自定义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;

}

其他形式举一反三即可


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值