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文件如下:
parameterType="java.util.HashMap"
resultType="com.mybatis.demo.Account">
select
id,
name,
password,
role,
created,
last_login_time as lastLoginTime
from
account
]]>
and name = #{name}
and role=#{role}
and id = #{id}
接下来编写测试类,就可以发现已经能实现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);
}
}