MyBatis 入门(五)--typeHandlers

一、作用及默认的处理

类型处理器的作用就是

  • 查询时把数据库存储的值转换成java类型
  • 修改是把java类型转换成数据库类型存储,处理
  • 下面这个表格描述了默认的类型处理器。
类型处理器Java 类型JDBC 类型
BooleanTypeHandlerjava.lang.Boolean, boolean任何兼容的布尔值
ByteTypeHandlerjava.lang.Byte, byte任何兼容的数字或字节类型
ShortTypeHandlerjava.lang.Short, short任何兼容的数字或短整型
IntegerTypeHandlerjava.lang.Integer, int任何兼容的数字和整型
LongTypeHandlerjava.lang.Long, long任何兼容的数字或长整型
FloatTypeHandlerjava.lang.Float, float任何兼容的数字或单精度浮点型
DoubleTypeHandlerjava.lang.Double, double任何兼容的数字或双精度浮点型
BigDecimalTypeHandlerjava.math.BigDecimal任何兼容的数字或十进制小数类型
StringTypeHandlerjava.lang.StringCHAR 和 VARCHAR 类型
ClobTypeHandlerjava.lang.StringCLOB 和 LONGVARCHAR 类型
NStringTypeHandlerjava.lang.StringNVARCHAR 和 NCHAR 类型
NClobTypeHandlerjava.lang.StringNCLOB 类型
ByteArrayTypeHandlerbyte[]任何兼容的字节流类型
BlobTypeHandlerbyte[]BLOB 和 LONGVARBINARY 类型
DateTypeHandlerjava.util.DateTIMESTAMP 类型
DateOnlyTypeHandlerjava.util.DateDATE 类型
TimeOnlyTypeHandlerjava.util.DateTIME 类型
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP 类型
SqlDateTypeHandlerjava.sql.DateDATE 类型
SqlTimeTypeHandlerjava.sql.TimeTIME 类型
ObjectTypeHandlerAny其他或未指定类型
EnumTypeHandlerEnumeration TypeVARCHAR-任何兼容的字符串类型, 作为代码存储(而不是索引)
EnumOrdinalTypeHandlerEnumeration TypeAny compatible NUMERIC or DOUBLE, as the position is stored (not the code itself).

二、自定义类型

   例如我们在数据库经常把时间存储为一个14位的VARCHAR(YYYYmmddssss)。而前台java层为java.util.Date,在这里我们就简单做一个类型处理。
  • 定义类型处理
package com.elements.typehandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

public class DataTimeTypeHandler extends BaseTypeHandler<Date> {

    /**
     * 
     * 这里应该是在保存数据的时候,把前台的日期类型转换成数据的varchar 我们使用了SimpleDateFormat来转换data类型
     * */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i,
            Date parameter, JdbcType jdbcType) throws SQLException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        ps.setString(i, sdf.format(parameter));
    }

    /**
     * 下面三个函数应该都是返回到java层时调用,我们把varchar转换成Date类型
     */
    @Override
    public Date getNullableResult(ResultSet rs, String columnName)
            throws SQLException {
        String varchartime = rs.getString(columnName);
        if (varchartime!=null)
        return new Date(Long.parseLong(varchartime));
        else return null;
    }

    @Override
    public Date getNullableResult(ResultSet rs, int columnIndex)
            throws SQLException {
        String varchartime = rs.getString(columnIndex);
        if (varchartime!=null)
            return new Date(Long.parseLong(varchartime));
            else return null;
    }

    @Override
    public Date getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        String varchartime = cs.getString(columnIndex);
        if (varchartime!=null)
            return new Date(Long.parseLong(varchartime));
            else return null;
    }

}
  • mybatis-config.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <properties resource="jdbc.properties" />

  <typeHandlers>
     <typeHandler handler="com.elements.typehandler.DataTimeTypeHandler" javaType="java.util.Date" jdbcType="VARCHAR"/>
      <package name="com.elements.user"/>
  </typeHandlers>

    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>



    <mappers>
        <mapper class="com.elements.user.dao.UserMapper" />

    </mappers>

</configuration>
  • User类
package com.elements.user.model;

import java.util.Date;

public class User {    
    private Integer userid;   
    private String username;   
    private String useremail;   
    private Date createtime;   
    private Date updatetime;

    public Integer getUserid() {
        return userid;
    }   
    public void setUserid(Integer userid) {
        this.userid = userid;
    }  
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username == null ? null : username.trim();
    }   
    public String getUseremail() {
        return useremail;
    }    
    public void setUseremail(String useremail) {
        this.useremail = useremail == null ? null : useremail.trim();
    }   
    public Date getCreatetime() {
        return createtime;
    }   
    public void setCreatetime(Date createtime) {
        this.createtime = createtime ;
    }  
    public Date getUpdatetime() {
        return updatetime;
    }   
    public void setUpdatetime(Date updatetime) {
        this.updatetime = updatetime;
    }
    @Override
    public String toString() {
        return "User [userid=" + userid + ", username=" + username
                + ", useremail=" + useremail + ", createtime=" + createtime
                + ", updatetime=" + updatetime + "]";
    }


}
  • UserMapper配置文件
<?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.elements.user.dao.UserMapper" >


  <resultMap id="BaseResultMap" type="com.elements.user.model.User" >


    <id column="userId" property="userid" jdbcType="INTEGER" />
    <result column="UserName" property="username" jdbcType="VARCHAR" />
    <result column="UserEmail" property="useremail" jdbcType="VARCHAR" />
    <result column="createTime" property="createtime" jdbcType="VARCHAR" />
    <result column="updateTime" property="updatetime" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >

    userId, UserName, UserEmail, createTime, updateTime
  </sql>

  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >

    select 
    <include refid="Base_Column_List" />
    from user
    where userId = #{userid,jdbcType=INTEGER}
  </select>

  <insert id="insert" parameterType="com.elements.user.model.User" >

    insert into user (userId, UserName, UserEmail, 
      createTime, updateTime)
    values (#{userid,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{useremail,jdbcType=VARCHAR}, 
      #{createtime,jdbcType=VARCHAR}, #{updatetime,jdbcType=VARCHAR})
  </insert>


</mapper>  

注意:我们没有在mapper文件内显示的做类型转换 ,他已经默认把这两种类型(javaType=”java.util.Date” jdbcType=”VARCHAR” )的互转都调用我们的类型处理了
代码下载地址:http://pan.baidu.com/s/1eRDzY6m

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值