1-23(第6天)MyBatis(二)typeHandler类型转换器

typeHandler

jdbcType

javaType

系统定义的typeHandler

系统提供的typeHandler能覆盖大部分场景的要求,但有些特有的数据类型如枚举是不能正常转换的。

自定义的typeHandler

【要点】

  1. 要实现TypeHandler<T>类
  2.  
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定义了两个类作为枚举类型的支持

  1. EnumOrdinalTypeHandler(数据库返回枚举数组的下标)
  2. EnumTypeHandler(数据库返回枚举名称)
  3. 自定义的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);
	}

}

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值