- orm框架干厚,從Javabean獲取數(shù)據(jù)插入數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)創(chuàng)建Javabean象缀。
- 當(dāng)Javabean和數(shù)據(jù)庫(kù)表字段類型一致時(shí)顾腊,普通映射就可以處理轉(zhuǎn)換。
- 當(dāng)Javabean和數(shù)據(jù)庫(kù)表字段不同時(shí)鞋怀,就需要TypeHandler來(lái)處理轉(zhuǎn)換。Javabean字段類型叫javaType,數(shù)據(jù)庫(kù)字段類型叫 jdbcType,例如jdbcType為varchar 或者int 想轉(zhuǎn)為javaType為Enum時(shí)持搜;jdbcType為varchar,javaType為Date時(shí)密似。
- JavaType轉(zhuǎn)為jdbc想要的參數(shù)時(shí)機(jī)就是在PreparedStatement中設(shè)置參數(shù)時(shí),把jdbcType轉(zhuǎn)為javaType就是在ResultSet中取出值后葫盼。
下面以Enum類型為例残腌,文章開頭有官方文檔可以參考
1. org.apache.ibatis.type.EnumOrdinalTypeHandler
按照Enum類中出現(xiàn)順序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>
<!-- 根據(jù)類別代碼查詢數(shù)據(jù) -->
<select id="selectAll"
resultType="com.company.combine.model.User">
SELECT * FROM USER
</select>
2. org.apache.ibatis.type.EnumTypeHandler,配置如第一點(diǎn)贫导,這個(gè)是按照類型抛猫,數(shù)據(jù)庫(kù)直接是MALE,FEMALE
可以繼承TypeHandler也可以繼承BaseTypeHandler
3. 自定義的TypeHander EnumSexTypeHandler,配置如第一點(diǎn)
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轉(zhuǎn)為jdbc想要的參數(shù)就是在PreparedStatement中設(shè)置參數(shù)時(shí)
- getResult() 把jdbcType轉(zhuǎn)為javaType就是在ResultSet中取出值后孩灯。