本文共 3113 字,大约阅读时间需要 10 分钟。
MyBatis虽然自身提供了很多种默认的转换机制,比如数据库中的number类型会自动转换成java的int类型,varchar/varchar2会自动转换成String…如果这些默认的类型转换依旧不能满足程序的开发,开发者就应该考虑自己去编写类型转换器!
本文以jav中的boolean转化为数据库中number为例子。(True-1,false-0)
下面讲述实现方法:
1.编写继承 BaseTypeHandler的实现类BooleanAndIntConverter(转换器类)
从数据库取数据用的下面的getXx方法,放数据到数据库中用的是setXX方法!
package converter;import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;//自定义类型转化器 java:boolean -> sql:number 要么implements TypeHandler 要么...public class BooleanAndIntConverter extends BaseTypeHandler<Boolean> { //继承实现类要好写一点 //java(boolean)->db(number) /** *preparedStatement:preparedStatement对象 * i:preparedStatement对象操作参数的位置 * aBoolean:java值 * jdbcType:jdbc操作的数据库类型 */ @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, Boolean aBoolean, JdbcType jdbcType) throws SQLException { if(aBoolean){ preparedStatement.setInt(i,1); }else{ preparedStatement.setInt(i,0); } } //db->java @Override public Boolean getNullableResult(ResultSet resultSet, String s) throws SQLException { int sexNum = resultSet.getInt(s);// if(sexNum==1)// return true;// else// return false; return sexNum == 1?true:false; } //db->java @Override public Boolean getNullableResult(ResultSet resultSet, int i) throws SQLException { int sexNum = resultSet.getInt(i); return sexNum == 1?true:false; } //db->java @Override public Boolean getNullableResult(CallableStatement callableStatement, int i) throws SQLException { int sexNum = callableStatement.getInt(i); return sexNum == 1?true:false; }}
2.配置Mybatis的核心配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--配置转换器--> <typeHandlers> <typeHandler handler="converter.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER"/> </typeHandlers></configuration>
3.使用使用时要改变对应mapper.xml的方法中的返回值
使用resultMap强制改变类型:(下面只是案例,没任何实际意义)
<!--使用转换器的查询--> <select id="queryStudentByStunoWithConverter" resultMap="studentResult" parameterType="int"> select * from student3 where stuno = #{stuno} </select> <resultMap type="student3" id="studentResult"> <!--分为主键id 和 非主键 result--> <id property="stuNo" column="stuno"/> <result property="stuName" column="stuname"/> <result property="stuAge" column="stuage"/> <result property="graName" column="graname"/> <result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER"/> </resultMap><!--使用转换器的增加--> <insert id="addStudentWithConverter" parameterType="student3"> insert into student3(stuno,stuname,stuage,graname,stusex) values(#{stuNo},#{stuName},#{stuAge},#{graName},#{stuSex,javaType=boolean,jdbcType=INTEGER}) </insert>
至此,类型转换器就可以正常使用了。
转载地址:http://dfhe.baihongyu.com/