mybatis typeHandler

typeHandler是类型转换器。如果你需要将一个枚举类型的数据存放到数据库,而数据库不支持枚举类型,所以需要将它保存为一个数值类型。那么,如何实现数据库类型和java枚举类型的相互转换呢?使用自定义的类型转换器即可。自定义的类型转换器需要实现typeHandler接口。

下面是一个枚举类型的定义:

public enum Role {

	USER(0, "普通用户"), MANAGER(1, "管理员");

	private int code;
	private String text;

	private Role(int code, String text) {
		this.code = code;
		this.text = text;
	}

	public int code() {
		return code;
	}

	public String text() {
		return text;
	}

	public static Role codeOf(int code) {
		for (Role role : values()) {
			if (role.code == code) {
				return role;
			}
		}

		throw new IllegalArgumentException("Invalid role code: " + code);
	}
}

我们定义一个自定义的类型转换器,如下:

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

public class RoleTypeHandler implements TypeHandler {

	@Override
	public void setParameter(PreparedStatement ps, int i, Role parameter, JdbcType jdbcType) throws SQLException {
		ps.setInt(i, parameter.code());
	}

	@Override
	public Role getResult(ResultSet rs, String columnName) throws SQLException {
		return Role.codeOf(rs.getInt(columnName));
	}

	@Override
	public Role getResult(ResultSet rs, int columnIndex) throws SQLException {
		return Role.codeOf(rs.getInt(columnIndex));
	}

	@Override
	public Role getResult(CallableStatement cs, int columnIndex) throws SQLException {
		return Role.codeOf(cs.getInt(columnIndex));
	}

}

接下来,需要注册自定义的类型转换器




    
        
    

	
		
			
			
				
				
				
				
			
		
	
	
		
	


 
mapper文件如下:


	
    
接下来编写测试类,就可以发现已经能实现java类型和数据库类型的自动换转了。测试类如下:

public class test {
    public static void main(String[] args) throws IOException {
        String config = "mybatis-config-standalone.xml";
        InputStream inputStream = Resources.getResourceAsStream(config);
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sessionFactory.openSession();
        Map params = new LinkedHashMap();
        params.put("name", "frank");
        Account account = sqlSession.selectOne("account.select",params);
        System.out.println(account);
    }
}

你可能感兴趣的:(mybatis)