1. MyBatis自带一些常见类型处理器
2. 自定义MyBatis类型处理器
java --数据库(jdbc类型)
示例:
实体类Student:boolean stuSex
true:男
false:女
表student:int stuSex
1:男
2:女
自定义类型转换器(boolean - int)
具体操作步骤
- 创建转换器:需要实现TypeHandler接口,可使用TypeHandler的一个实现类BaseTypeHandler
- 实现BaseTypeHandler的方法
//在此位置的泛型为Java类型
public class BooleanAndIntConverter extends BaseTypeHandler<Boolean>{
//java(boolean) - > DB(int)
/*
* ps:PreparedStatement对象
* i:PreparedStatement对象操作参数的位置
* parameter:java值
* jdbcType:jdbc操作的数据库类型
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {
if(parameter) {
//1
ps.setInt(i, 1);
}else {
ps.setInt(i, 0);
}
}
//get : DB(int) - > java(Boolean)
@Override
public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
int sexNum = rs.getInt(columnName);
return sexNum ==1 ? true : false;
}
@Override
public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int sexNum = rs.getInt(columnIndex);
return sexNum ==1 ? true : false;
}
//CallableStatement --存储过程 存储函数
@Override
public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
int sexNum = cs.getInt(columnIndex);
return sexNum ==1 ? true : false;
}
}
- 修改conf.xml
1.如果类中的属性和表中的字段能够合理识别 例如(String-varchar)否则可以使用resultMap 例如(Boolean - int )
<select id="queryStudentByStunoWithConverter" parameterType="int" resultMap="studentResult">
select * from student where stuno = #{stuno}
</select>
- 配置resultMap
type为返回值类型,studentResult为配置的resultMap 的id值,通过id找resultMap配置
resultMap中分为主键与非主键,主键用id 非主键用result
<!-- type为返回值类型,studentResult为配置的resultMap 的id值,通过id找resultMap配置 -->
<resultMap type="student" id="studentResult">
<!-- 分为主键与非主键
主键用id 非主键用result -->
<id property="stuNo" column="stuno"/>
<result property=" stuSex" column="stunsex" javaType="boolean" jdbcType="INTEGER"/>
</resultMap>
- 测试方法
public static void queryStudentByStunoWithConverter() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
System.out.println(studentMapper.queryStudentByStunoWithConverter(1).toString());
session.close();
}
使用转换器增加数据:
//添加学生带转换器
public static void addStudentsWithConverter() throws IOException {
Student student = new Student(8 , "ll" , 22 , "g4" , true);
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.addStudentWithConverter(student);
session.commit();
session.close();
}
<!-- 带转换器的增加 -->
<insert id="addStudentWithConverter" parameterType="student">
insert into student (stuno , stuname , stuage , graname , stusex) values ( #{stuNo} , #{stuName} , #{stuAge} , #{graName} , #{stuSex , javaType=boolean, jdbcType=INTEGER });
</insert>