Spring의 LocalTime을 MySQL의 Time으로 INSERT하고 싶다 (milliseconds도)

개요



String 형으로 취득한 11:12:13.14 (시간:분:초.밀리초)를
MySQL에 INSERT하여

와 밀리초까지 표시시키는 방법에 대해입니다. (날짜 정보 필요 없음)

그런 보통으로 구현하면 할 수 있을 것 같지 않아?
라고 생각하지 않습니까?

간단하게 보이고 귀찮은 처리를 끼지 않으면 잘 되지 않았습니다. . .
더 스마트한 방법을 아시는 분이 있으면 가르쳐 주시면 매우 기쁩니다! !

버전



Spring



build.gradle
id 'org.springframework.boot' version '2.2.2.BUILD-SNAPSHOT'
sourceCompatibility = '1.8'

    runtimeOnly('mysql:mysql-connector-java')
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')

데이터베이스


MySQL 8.0

스텝 그 1 테이블 작성



소수점 3자리까지 대응
MySQL :: MySQL 5.6 참조 설명서 :: 11.1.2 날짜 및 시간 유형 개요
create table timesample( 
    ...
    start_time TIME(3)
);


스텝 그 2 AttributeConverter의 작성



JPA 가 엔티티의 필드의 형태로서 java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime 는 대응하고 있지 않기 때문에, 다음과 같은 AttributeConverter 를 작성할 필요가 있습니다.
package app.entities.converter;

import java.time.LocalTime;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class LocalTimeConverter implements AttributeConverter<LocalTime,  java.sql.Time> {

    @Override
    public java.sql.Time convertToDatabaseColumn(LocalTime time) {
        return time == null ? null : java.sql.Time.valueOf(time);
    }

    @Override
    public LocalTime convertToEntityAttribute(java.sql.Time  value) {
        return value == null ? null : value.toLocalTime();
    }
}

Entity
    @Column(name = "start_time")
    private LocalTime startTime;
entity.setStartTime(LocalTime.of(11, 12, 13, 14*10000000));

repository.save(entity);



밀리 초가 들어 있지 않습니다!

스텝 그 3 밀리 세컨드를 보유해 java.sql.Time 로 변환한다



방금 만든 LocalTimeConverter의 convertToDatabaseColumn 메서드 변경
spring-밀리초 java.time.LocalTime을 밀리초 java.sql.Time에 매핑하는 방법

LocalTimeConverter
package app.entities.converter;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalTime;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class LocalTimeConverter implements AttributeConverter<LocalTime,  java.sql.Time> {

    @Override
    public java.sql.Time convertToDatabaseColumn(LocalTime time) {
        if(time == null) return null;

        // この日付はコンバートで捨てられるので何でもOK
        long epochMilli = time.atDate(LocalDate.of(2019, 1, 1)).atZone(java.time.ZoneId.systemDefault())
                .toInstant().toEpochMilli();
        java.sql.Time sqlTime = new java.sql.Time(epochMilli);
        return sqlTime;
    }

    @Override
    public LocalTime convertToEntityAttribute(java.sql.Time  value) {
        if (value == null) return null;

        String localTimeStr = new SimpleDateFormat("HH:mm:ss.SSS").format(value);
        LocalTime localTime = LocalTime.parse(localTimeStr);
        return localTime;
    }
}

좋은 웹페이지 즐겨찾기