关于类型处理器和resultmap

类型处理器(类型转换器)

  1. MyBatis自带一些常见的类型处理器

  2. 也可以自定义Mybatis类型处理器

JAVA 数据类型 –数据库(数据类型)

比如:

实体类 Student :Boolean stuSex true:男 /false:女

表中Student : number stuSex 1:男 / 0:女

自定义类型转换器

假设

我要在Student表里面新建一个性别列 男生用1 表示 女生用0表示(number类型),

此时实体类中我男生用的true 女生用的false(Boolean,仅仅是举个例子)。

数据类型不匹配此时数据类型不匹配。

创建类型转换器

需要实现TypeHandler接口 此接口有一个实现类 BaseTypeHandler

因此实现转换器有两种方法 实现 接口TypeHandler 和 继承BaseTypeHandler(简单)

所以这里采用后者,去extendthis method。

准备工作

新建一个Boolean的属性 叫做stuSex 。

private Boolean stuSex形成get set方法

转换器

新建一个转换器继承BaseTypeHandler,编译器会自动生成三个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//	get是DB数据-->java数据
public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getInt(columnName)==1?true:false;
}

public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getInt(columnIndex)==1?true:false;
}

public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getInt(columnIndex)==1?true:false;
}

// set是java数据-->DB数据
public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {

if(parameter) {
ps.setInt(i, 1);
}else {
ps.setInt(i, 0);
}
}

其中,

ps:PreparedStatement对象
i:PreparedStatement对象操作的参数的位置
parameter:Java值
jdbcType:jdbc操作的数据类型

这里用到了三元运算符,想起了之前一个写个人网站用到的一个三元运算符🤦‍♂️(更)。

conf配置

在config中加上转换器

1
2
3
<typeHandlers>
<typeHandler handler="转换器类名" javaType="Boolean" jdbcType="INTEGER"/>
</typeHandlers>

这样就算是好了 测试一下

mapper配置

使用了转换器的查询
1如果类中属性和表中的字段类型都能合理识别(String-varchar2),则可以使用resultType resultType=”top.eshyee.entity.Student”
否则(boolean-integer)使用resultMap
2如果类中的属性名和表中的字段名都能够合理识别(stuNo-stuno)则可以使用resultType
否则(id-stuno)使用resultMap

1
2
3
4
5
6
7
8
9
10
<select id="queryStudentBystuNumConverter" resultMap="studentResult" parameterType="int">
select * from student where stuno= #{stuno}
</select>
<resultMap type="top.eshyee.entity.Student" id="studentResult">
<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>

resultMap

resultMap可以实现两个功能:
1 类型转换
2 属性-字段名之间的映射关系

分为主键id和非主键result
如果实体类中的属性跟数据库中那个的字段名叫法不一样,从下面的映射关系中也可以更改 。

这样就好了,可以在test.java中测试一下了。🥐

总结

以前用过别的方法来转换数据库数据与java数据 但是这个更系统一些吧。

希望这次不要再出个3.5了。🐷