码迷,mamicode.com
首页 > 其他好文 > 详细

MyBatis 入门(五)--typeHandlers

时间:2016-05-12 19:04:10      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

一、作用及默认的处理

类型处理器的作用就是

  • 查询时把数据库存储的值转换成java类型
  • 修改是把java类型转换成数据库类型存储,处理
  • 下面这个表格描述了默认的类型处理器。
类型处理器 Java 类型 JDBC 类型
BooleanTypeHandler java.lang.Boolean, boolean 任何兼容的布尔值
ByteTypeHandler java.lang.Byte, byte 任何兼容的数字或字节类型
ShortTypeHandler java.lang.Short, short 任何兼容的数字或短整型
IntegerTypeHandler java.lang.Integer, int 任何兼容的数字和整型
LongTypeHandler java.lang.Long, long 任何兼容的数字或长整型
FloatTypeHandler java.lang.Float, float 任何兼容的数字或单精度浮点型
DoubleTypeHandler java.lang.Double, double 任何兼容的数字或双精度浮点型
BigDecimalTypeHandler java.math.BigDecimal 任何兼容的数字或十进制小数类型
StringTypeHandler java.lang.String CHAR 和 VARCHAR 类型
ClobTypeHandler java.lang.String CLOB 和 LONGVARCHAR 类型
NStringTypeHandler java.lang.String NVARCHAR 和 NCHAR 类型
NClobTypeHandler java.lang.String NCLOB 类型
ByteArrayTypeHandler byte[] 任何兼容的字节流类型
BlobTypeHandler byte[] BLOB 和 LONGVARBINARY 类型
DateTypeHandler java.util.Date TIMESTAMP 类型
DateOnlyTypeHandler java.util.Date DATE 类型
TimeOnlyTypeHandler java.util.Date TIME 类型
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP 类型
SqlDateTypeHandler java.sql.Date DATE 类型
SqlTimeTypeHandler java.sql.Time TIME 类型
ObjectTypeHandler Any 其他或未指定类型
EnumTypeHandler Enumeration Type VARCHAR-任何兼容的字符串类型, 作为代码存储(而不是索引)
EnumOrdinalTypeHandler Enumeration Type Any 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

MyBatis 入门(五)--typeHandlers

标签:

原文地址:http://blog.csdn.net/likewindy/article/details/51350995

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!