- orm框架,从Javabean获取数据插入数据库,从数据库获取数据创建Javabean。
- 当Javabean和数据库表字段类型一致时,普通映射就可以处理转换。
- 当Javabean和数据库表字段不同时,就需要TypeHandler来处理转换。Javabean字段类型叫javaType,数据库字段类型叫 jdbcType,例如jdbcType为varchar 或者int 想转为javaType为Enum时;jdbcType为varchar,javaType为Date时。
- JavaType转为jdbc想要的参数时机就是在PreparedStatement中设置参数时,把jdbcType转为javaType就是在ResultSet中取出值后。
下面以Enum类型为例,文章开头有官方文档可以参考
1. org.apache.ibatis.type.EnumOrdinalTypeHandler
按照Enum类中出现顺序0,1,2...
1.0 EnumSex.java
package com.company.combine.model;
/**
* Created by liuqun on 2017/8/27.
*/
public enum EnumSex {
MALE(1,"男"), FEMALE(2, "女");
private int id;
private String name;
private EnumSex(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static EnumSex getEnumSex(int id) {
if (id == 1) {
return MALE;
} else if (id == 2) {
return FEMALE;
}
return null;
}
}
public class User {
...
private EnumSex enumSex;
...
public EnumSex getEnumSex() {
return enumSex;
}
public void setEnumSex(EnumSex enumSex) {
this.enumSex = enumSex;
}
}
1.1 在sqlMapConfig.xml中配置
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.company.combine.model.EnumSex"/>
<!--<typeHandler handler="org.apache.ibatis.type.EnumTypeHandler" javaType="com.company.combine.model.EnumSex"/>-->
<!--<typeHandler handler="com.company.combine.model.EnumSexTypeHandler" javaType="com.company.combine.model.EnumSex"/>-->
</typeHandlers>
1.2 mapper.xml insert
<insert id="insert" parameterType="com.company.combine.model.User"
useGeneratedKeys="true" keyProperty="id">
<!--<selectKey resultType="Integer" keyProperty="id" order="AFTER">-->
<!--SELECT LAST_INSERT_ID()-->
<!--</selectKey>-->
INSERT INTO USER (username,sex,address,enumsex) VALUES (#{username},#{sex},#{address},#{enumSex,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler})
<!-- INSERT INTO USER (username,sex,address,enumsex) VALUES (#{username},#{sex},#{address},#{enumSex,typeHandler=org.apache.ibatis.type.EnumTypeHandler})-->
<!--INSERT INTO USER (username,sex,address,enumsex) VALUES (#{username},#{sex},#{address},#{enumSex,typeHandler=com.company.combine.model.EnumSexTypeHandler})-->
</insert>
1.3 mapper.xml select
<resultMap id="result" type="com.company.combine.model.User">
<id property="id" column="id"/>
<!--<result property="enumSex" column="enumsex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>-->
<!--<result property="enumSex" column="enumsex" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>-->
<result property="enumSex" column="enumsex" typeHandler="com.company.combine.model.EnumSexTypeHandler"/>
</resultMap>
<!-- 根据类别代码查询数据 -->
<select id="selectAll"
resultType="com.company.combine.model.User">
SELECT * FROM USER
</select>
2. org.apache.ibatis.type.EnumTypeHandler,配置如第一点,这个是按照类型,数据库直接是MALE,FEMALE
可以继承TypeHandler也可以继承BaseTypeHandler
3. 自定义的TypeHander EnumSexTypeHandler,配置如第一点
public class EnumSexTypeHandler implements TypeHandler<EnumSex>{
Logger logManager = LogManager.getLogger(EnumSexTypeHandler.class);
@Override
public void setParameter(PreparedStatement preparedStatement, int i, EnumSex enumSex, JdbcType jdbcType) throws SQLException {
preparedStatement.setInt(i,enumSex.getId());
logManager.info("setParameter(PreparedStatement preparedStatement, int i, EnumSex enumSex, JdbcType jdbcType)");
}
@Override
public EnumSex getResult(ResultSet resultSet, String s) throws SQLException {
logManager.info("getResult(ResultSet resultSet, String s)");
int id = resultSet.getInt(s);
return EnumSex.getEnumSex(id);
}
@Override
public EnumSex getResult(ResultSet resultSet, int i) throws SQLException {
logManager.info("getResult(ResultSet resultSet, int i)");
int id = resultSet.getInt(i);
return EnumSex.getEnumSex(id);
}
@Override
public EnumSex getResult(CallableStatement callableStatement, int i) throws SQLException {
logManager.info("getResult(CallableStatement callableStatement, int i)");
int id = callableStatement.getInt(i);
return EnumSex.getEnumSex(id);
}
}
- setParameter() JavaType转为jdbc想要的参数就是在PreparedStatement中设置参数时
- getResult() 把jdbcType转为javaType就是在ResultSet中取出值后。