我们可以使用自定义 typeHandler 来处理 enum 类型的映射。在实体 User 中有两个 enum 类型的属性。
public class User {
private int id;
private String name;
private int age;
private Gender gender;
private Skill skill;
// getter and setter
}
数据库中分别为 tinyint 类型和 varchar ,我们可以通过 typeHandler 来进行映射。
创建 enum 类型的 typeHandler。
有两种方式来创建自定义的 typeHandler ,实现 TypeHandler和继承 BaseTypeHandler 。 @MappedTypes({Gender.class}) public class GenderHandler implements TypeHandler<Gender> { @Override public void setParameter(PreparedStatement preparedStatement, int i, Gender gender, JdbcType jdbcType) throws SQLException { preparedStatement.setInt(i, gender.getValue()); } @Override public Gender getResult(ResultSet resultSet, String s) throws SQLException { return Gender.nameOf(resultSet.getInt(s)); } @Override public Gender getResult(ResultSet resultSet, int i) throws SQLException { return Gender.nameOf(resultSet.getInt(i)); } @Override public Gender getResult(CallableStatement callableStatement, int i) throws SQLException { return Gender.nameOf(callableStatement.getInt(i)); } }
@MappedTypes({Skill.class}) public class SkillHandler extends BaseTypeHandler<Skill> { @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, Skill skill, JdbcType jdbcType) throws SQLException { preparedStatement.setString(i, skill.getValue()); } @Override public Skill getNullableResult(ResultSet resultSet, String s) throws SQLException { return Skill.nameOf(resultSet.getString(s)); } @Override public Skill getNullableResult(ResultSet resultSet, int i) throws SQLException { return Skill.nameOf(resultSet.getString(i)); } @Override public Skill getNullableResult(CallableStatement callableStatement, int i) throws SQLException { return Skill.nameOf(callableStatement.getString(i)); } }
自定义 typeHandler 上要加上 @MappedTypes 。
- 在配置文件中加入 typeHandler 的配置。
这样就可以在 insert 和 select 的时候完成 enum 类型的映射了。mybatis: type-handlers-package: com.rolex.microlabs.handler