java/mybatis无法写入Date/TimeStamp的毫秒部分到mariadb里

一、毫秒信息丢失的原因

mysql-connector识别服务端信息时,误判服务端不支持存储毫秒

public class NativeCapabilities implements ServerCapabilities {
    public NativeCapabilities(NativePacketPayload initialHandshakePacket) {
        try {
            // 获取的版本信息是:5.5.5-10.3.6-MariaDB-1:10.3.6+maria~jessie-log
            this.serverVersion = ServerVersion.parseVersion(initialHandshakePacket.readString(StringSelfDataType.STRING_TERM, "ASCII"));            
            ......
            ......
            this.serverHasFracSecsSupport = this.serverVersion.meetsMinimum(new ServerVersion(5, 6, 4));
        } catch (Throwable t) {

        }
    }
}

于是在绑定时间类型的参数时,不写入毫秒信息

public abstract class AbstractQueryBindings<T extends BindValue> implements QueryBindings<T> {
    @Override
    public void setTimestamp(int parameterIndex, Timestamp x, MysqlType targetMysqlType) {
        int fractLen = -1;
        if (!this.session.getServerSession().getCapabilities().serverSupportsFracSecs() || !this.sendFractionalSeconds.getValue()) {
            fractLen = 0;
        } else if (this.columnDefinition != null && parameterIndex <= this.columnDefinition.getFields().length && parameterIndex >= 0) {
            fractLen = this.columnDefinition.getFields()[parameterIndex].getDecimals();
        }

        setTimestamp(parameterIndex, x, null, fractLen, targetMysqlType);
    }
}

二、使用mariadb官方客户端处理毫秒信息

1、使用正确的数据类型
数据表字段使用类型:datetime(3);
java程序使用类型:java.util.Date,或者它的子类:java.sql.Timestamp;
注意:不能是java.sql.Date

2、引入依赖

			<dependency>
				<groupId>org.mariadb.jdbc</groupId>
				<artifactId>mariadb-java-client</artifactId>
				<version>3.0.9</version>
			</dependency>

3、修改jdbc地址

jdbc:mariadb://10.0.0.1:3306/mydb?serverTimezone=GMT%2B8&useUnicode=true&useSSL=false&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值