mysql日期存储为int,mybatis做ORM映射与java.util.Date的转换问题

原创 2016年08月29日 16:26:05

在mysql做数据库的应用中,日期类型经常回存储为int(10)类型。方便排序和计算。但是在java中用Date.getTime返回的是13位的Long。并且在实体中我们如果用long来存储会有诸多不便。所以涉及到了转换问题。在我的项目中,用的是mybatis做持久性框架。对于这个问题用了以下方法处理。

  1. 用mybatis generate时,配置实体中用date来覆盖数据库中的int类型。
<columnOverride column="birthday" javaType="java.util.Date" jdbcType="INTEGER" />  
  1. 自定义TypeHandler实现TypeHandler接口
@MappedTypes({ Date.class })  
@MappedJdbcTypes({ JdbcType.INTEGER })  
public class DateIntTypeHandler implements TypeHandler<Date> {  

    @Override  
    public void setParameter(PreparedStatement ps, int i, Date parameter,  
            JdbcType jdbcType) throws SQLException {  
        if (parameter == null) {  
            if (jdbcType == null) {  
                throw new TypeException(  
                        "JDBC requires that the JdbcType must be specified for all nullable parameters.");  
            }  
            try {  
                ps.setNull(i, jdbcType.TYPE_CODE);  
            } catch (SQLException e) {  
                throw new TypeException(  
                        "Error setting null for parameter #"  
                                + i  
                                + " with JdbcType "  
                                + jdbcType  
                                + " . "  
                                + "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. "  
                                + "Cause: " + e, e);  
            }  
        } else {  
            int time = (int) (parameter.getTime() / 1000);  
            ps.setInt(i, time);  
        }  
    }  

    @Override  
    public Date getResult(ResultSet rs, String columnName) throws SQLException {  
        int res = rs.getInt(columnName);  
        long time = res * 1000L;  
        return new Date(time);  
    }  

    @Override  
    public Date getResult(ResultSet rs, int columnIndex) throws SQLException {  
        int res = rs.getInt(columnIndex);  
        long time = res * 1000L;  
        return new Date(time);  
    }  

    @Override  
    public Date getResult(CallableStatement cs, int columnIndex)  
            throws SQLException {  
        int res = cs.getInt(columnIndex);  
        long time = res * 1000L;  
        return new Date(time);  
    }  
}  
  1. 在mybatis的配置中引用自定义的转换处理类
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <!-- 自动扫描mapping.xml文件 -->  
        <property name="mapperLocations" value="classpath:sqlmap/mysql/module/*/*.xml"></property>  
        <strong><property name="typeHandlers">  
            <array>  
                <bean name="dateIntTypeHandler" class="*.utils.mybatis.DateIntTypeHandler" />  
            </array>  
        </property></strong>  
    </bean>  

myBatis之java.util.Date类型如何映射到mysql的datetime类型

理论上不用显示的定义jdbcType,只有当字段可为N
  • han_huayi
  • han_huayi
  • 2017年07月09日 17:44
  • 2810

mybatis mapper映射配置时间类型对应oracle,java里的Date 类型 TIMESTAMP

mapper namespace="cn.itcast.ssm.mapper.OrdersMapper" >                             private...
  • JesseCary
  • JesseCary
  • 2017年06月25日 21:19
  • 2808

myBatis返回integer值

经过测试,将resultMap="java.lang.Integer" 改成 resultType="java.lang.Integer" 也可以解决问题。...
  • yzllz001
  • yzllz001
  • 2017年03月17日 14:36
  • 2485

mybatis常用jdbcType数据类型以及对应的JavaType

1、MyBatis 通过包含的jdbcType类型BIT、FLOAT、CHAR 、TIMESTAMP 、 OTHER 、UNDEFINEDTINYINT 、REAL 、VARCHAR 、BINA...
  • Elenal
  • Elenal
  • 2016年12月12日 15:46
  • 11885

解决Mybatis查询时间日期得到的是long型时间问题

今天不小心被坑了一下。数据库字段存放的是Date类型,如果Java实体bean类也使用Date类型,不管是java.sql.Date还是java.util.Date,这样用Mybatis查询就会自动转...
  • lusyoe
  • lusyoe
  • 2016年12月21日 23:05
  • 3984

解决mybatis查询日期时间数据得到long类型数据的问题

使用mybatis查询数据时,如果数据库存储的是timestamp、datetime、date、time等时间类型,而Java bean也使用的是date类型,mybatis会自动将date类型转换为...
  • qq_29216083
  • qq_29216083
  • 2017年08月29日 15:46
  • 2129

mybatis中Date和DateTime字段的插入

最近公司使用MyBatis3做数据持久层,在字段中有Date和DateTime类型,在插入数据时只要将实体的属性设置成Timestamp就会对应mysql的DateTime类型,Date会对应mysq...
  • qiaomu8559968
  • qiaomu8559968
  • 2012年09月19日 11:43
  • 98134

java对世界各个时区(TimeZone)的通用转换处理方法

在进行国际性软件项目开发的过程中,有时候会碰到一些比较特殊的要求。比如:比如说,你做的是个购物网站(假设服务器放在中国上海),当全世界客户在你的网站上下订单买东西后,往往希望看到客户所在地下单时间,比...
  • zhanglu0223
  • zhanglu0223
  • 2015年08月09日 18:36
  • 8202

java 把string数据转换成date数据存入mysql的问题,如何获取当前时间date存入数据库

例如:String pstart1 = “1990-01-01”     java.sql.Date pstart=java.sql.Date.valueOf(pstart1);即可...
  • zhongmei121
  • zhongmei121
  • 2015年04月04日 22:26
  • 3206

如何通过 Mybatis 向Mysql 插入Date 或者DateTime

MyBatis3做数据持久层,在字段中有Date和DateTime类型,在插入数据时只要将实体的属性设置成Timestamp就会对应mysql的DateTime类型,Date会对应mysql的Date...
  • bigtree_3721
  • bigtree_3721
  • 2017年03月12日 11:58
  • 10345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql日期存储为int,mybatis做ORM映射与java.util.Date的转换问题
举报原因:
原因补充:

(最多只允许输入30个字)