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>
至此,类型转换器就可以正常使用了。
本文介绍如何在MyBatis中自定义类型转换器,以实现Java中的boolean类型与数据库number类型的相互转换。通过编写继承BaseTypeHandler的转换器类,并在MyBatis配置文件中注册,最后在mapper.xml中应用,实现类型转换。


被折叠的 条评论
为什么被折叠?



