想一个事情 ,例:
我数据库的表 定义了一个表student 里面有一个字段 stu_sex int类型 可是我对应的实体类是 String 类型或者其他类型
这个时候 实体类与数据库表肯定对应不上 我该怎么办呢?怎么解决这个问题? 《针对于极端类型》《一般没人这么写》
我现在有一个表:student表 1表示男 0 表示女
对应的实体类 Student类:“男” --“女”
1. 这个使用就需要用到mybatis提供的类转换器了:
首先我们需要创建一个转换器 转换器就是一个java类 这个类实现了TypeHandler 接口 或者继承了BaseTypeHandler类 他就是一个转换器了!一般都继承BaseHandler类 因为方便些!
package org.bin.test; 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; /** * 类的转换器 现在要把 数据库中的 Int 转换成String类型 * 需要继承 BaseTypeHandler 这类 */ /* * preparedStatement:PreparedStatement对象 * i:PreparedStatement对象操作参数的位置 * s:java值 * jdbcType:jdbc操作的数据库类型 */ public class TypeHandlerAndString extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException { //判断如果是男的 向数据库插入1 如果不是 插入 0 if (s.equals("男")){ preparedStatement.setInt(i,1); }else { preparedStatement.setInt(i,0); } } @Override public String getNullableResult(ResultSet resultSet, String s) throws SQLException { int sex = resultSet.getInt(s); return sex == 1 ? "男":"女"; } @Override public String getNullableResult(ResultSet resultSet, int i) throws SQLException { int sex = resultSet.getInt(i); return sex == 1 ? "男":"女"; } @Override public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException { int sex = callableStatement.getInt(i); return sex == 1 ? "男":"女"; } }
重写类的方法:
set 就是java 向数据库存取
get就是数据库读到java
2.配置mybatis的核心配置文件
现在我们可以看到 handler:转换器的全路径 jdbctype:数据库字段 的类型 javatype :实体类中的类型
3.我们现在编写Mapper.xml文件配置
注意:现在数据库的字段类型 与 实体类的类型不一样了 返回值就不是 resultType了 而是变成了 resultMap!!
我们现在创建一个 resultMap标签
注意我圈出来的 地方 这些都是主要注意的地方!
测试:
好了测试成功了!数据库存的是0 获取到的是女 测试成功!