typeHandler
jdbcType
javaType
系统定义的typeHandler
系统提供的typeHandler能覆盖大部分场景的要求,但有些特有的数据类型如枚举是不能正常转换的。
自定义的typeHandler
【要点】
- 要实现TypeHandler<T>类
package com.learn.ssm.chapter4.typehandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;
import org.apache.log4j.Logger;
//启用扫描注册的时候需要注解
@MappedTypes(String.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyTypeHandler implements TypeHandler<String> {
Logger logger = Logger.getLogger(MyTypeHandler.class);
@Override
public void setParameter(PreparedStatement ps, int i, String parameter,
JdbcType jdbcType) throws SQLException {
logger.info("设置string参数【" + parameter+"】");
ps.setString(i, parameter);
}
@Override
public String getResult(ResultSet rs, String columnName)
throws SQLException {
String result = rs.getString(columnName);
logger.info("读取string参数1【" + result+"】");
return result;
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
String result = rs.getString(columnIndex);
logger.info("读取string参数2【" + result+"】");
return result;
}
@Override
public String getResult(CallableStatement cs, int columnIndex)
throws SQLException {
String result = cs.getString(columnIndex);
logger.info("读取string参数3【" + result+"】");
return result;
}
}
RoleMapper.xml
有几种配置方法
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.learn.ssm.chapter4.mapper.RoleMapper">
<resultMap id="roleMapper" type="role">
<result property="id" column="id" />
<result property="roleName" column="role_name" jdbcType="VARCHAR"
javaType="string" />
<result property="note" column="note"
typeHandler="com.learn.ssm.chapter4.typehandler.MyTypeHandler" />
</resultMap>
<select id="getRole" parameterType="long" resultMap="roleMapper">
select id, role_name, note from t_role where id = #{id}
</select>
<select id="findRoles" parameterType="string" resultMap="roleMapper">
select id, role_name, note from t_role
where role_name like concat('%', #{roleName, jdbcType=VARCHAR,
javaType=string}, '%')
</select>
<select id="findRoles2" parameterType="string" resultMap="roleMapper">
select id, role_name, note from t_role
where note like concat('%', #{note,
typeHandler=com.learn.ssm.chapter4.typehandler.MyTypeHandler}, '%')
</select>
</mapper>
mybatis-config.xml
<typeHandlers>
<!--
第一种方法
<typeHandler jdbcType="VARCHAR" javaType="string"
handler="com.learn.ssm.chapter4.typehandler.MyTypeHandler" />
-->
第二种方法(该方法与MyTypeHandler类的注解结合使用)
<package name="com.learn.ssm.chapter4.typehandler" />
</typeHandlers>
枚举typeHandler
MyBatis定义了两个类作为枚举类型的支持
- EnumOrdinalTypeHandler(数据库返回枚举数组的下标)
- EnumTypeHandler(数据库返回枚举名称)
- 自定义的typeHandler
枚举类SexEnum
package com.learn.ssm.chapter4.enumeration;
public enum SexEnum {
MALE(1, "男"),
FEMALE(0, "女");
private int id;
private String name;
//setter getter...
SexEnum(int id, String name) {
this.id = id;
this.name = name;
}
public static SexEnum getSexById(int id) {
for (SexEnum sex : SexEnum.values()) {
if (sex.getId() == id) {
return sex;
}
}
return null;
}
}
User.java
package com.learn.ssm.chapter4.pojo;
import com.learn.ssm.chapter4.enumeration.SexEnum;
public class User {
private Long id;
private String userName;
private String password;
private SexEnum sex;
private String mobile;
private String tel;
private String email;
private String note;
/** setter and getter **/
}
UserMapper.java
package com.learn.ssm.chapter4.mapper;
import com.learn.ssm.chapter4.pojo.User;
public interface UserMapper {
public User getUser(Long id);
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.learn.ssm.chapter4.mapper.UserMapper">
<resultMap id="userMapper" type="user">
<result property="id" column="id" />
<result property="userName" column="user_name" />
<result property="password" column="password" />
<!--
<result property="sex" column="sex"
typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
-->
<!--
<result property="sex" column="sex"
typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
-->
<result property="sex" column="sex"
typeHandler="com.learn.ssm.chapter4.typehandler.SexEnumTypeHandler"/>
<result property="mobile" column="mobile" />
<result property="tel" column="tel" />
<result property="email" column="email" />
<result property="note" column="note" />
</resultMap>
<select id="getUser" resultMap="userMapper" parameterType="long">
select id, user_name, password, sex, mobile, tel, email, note from t_user
where id = #{id}
</select>
</mapper>
SexEnumTypeHandler.java
package com.learn.ssm.chapter4.typehandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import com.learn.ssm.chapter4.enumeration.SexEnum;
public class SexEnumTypeHandler implements TypeHandler<SexEnum> {
@Override
public void setParameter(PreparedStatement ps, int i, SexEnum parameter,
JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter.getId());
}
@Override
public SexEnum getResult(ResultSet rs, String columnName)
throws SQLException {
int id = rs.getInt(columnName);
return SexEnum.getSexById(id);
}
@Override
public SexEnum getResult(ResultSet rs, int columnIndex) throws SQLException {
int id = rs.getInt(columnIndex);
return SexEnum.getSexById(id);
}
@Override
public SexEnum getResult(CallableStatement cs, int columnIndex)
throws SQLException {
int id = cs.getInt(columnIndex);
return SexEnum.getSexById(id);
}
}