無論是從預處理語句中設置一個值,還是從結果集里取出一個值,都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型
可以重寫類型處理器或創建你自己的類型處理器來處理不支持的或非標准的類型
實現 org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 然后可以選擇性地將它映射到一個 JDBC 類型
public class MyDemoTypeHandler extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { String ssex=(String)parameter; if("男".equals(ssex)){ ps.setInt(i, 0); }else if("女".equals(ssex)){ ps.setInt(i, 1); }else{ ps.setInt(i, 2); } } @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { int ssex=rs.getInt(columnName); if(ssex==0){ return "男"; }else if(ssex==1){ return "女"; }else{ return "not know"; } } @Override public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { int ssex=rs.getInt(columnIndex); if(ssex==0){ return "男"; }else if(ssex==1){ return "女"; }else{ return "not know"; } } @Override public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { int ssex=cs.getInt(columnIndex); if(ssex==0){ return "男"; }else if(ssex==1){ return "女"; }else{ return "not know"; } } }
1 <!-- mybatis-config.xml --> 2 <typeHandlers> 3 <typeHandler handler="cn.cgq.demo.mybatis.typeHandler.MyDemoTypeHandler" javaType="String" jdbcType="INTEGER"/> 4 </typeHandlers>
MyBatis 不會窺探數據庫元信息來決定使用哪種類型,所以你必須在參數和結果映射中指明那是 VARCHAR 類型的字段, 以使其能夠綁定到正確的類型處理器上。
在StudentMapper.xml中
1 <resultMap id="StudentResult" type="Student"> 2 <id column="sid" property="sid"/> 3 <result column="sname" property="sname"/> 4 <result column="ssex" property="ssex" javaType="String" jdbcType="INTEGER"/> 5 <result column="saddress" property="saddress"/> 6 </resultMap> 7 <select id="selectStudentBySsex" parameterType="String" resultType="Student"> 8 select * from Student where ssex=#{ssex,javaType=String,jdbcType=INTEGER} 9 </select>
javaType="String"java對應的數據類型
jdbcType="INTEGER"數據路對應的數據類型
表為4個字段,在數據庫中ssex用int存儲,而在java中用“男”,“女”來表示數據庫中的0,1
1 Student student = session.selectOne("cn.cgq.demo.mybatis.mapper.StudentMapper.selectStudentBySsex", "女"); 2 System.out.println(student.toString());
這樣就可以完成數據類型的轉換