분류MariaDB 아래의 글

import java.time.LocalDateTime;

public class SampleEntity {

private Long id;
private LocalDateTime startDt;

// Getter & Setter
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public LocalDateTime getStartDt() {
    return startDt;
}

public void setStartDt(LocalDateTime startDt) {
    this.startDt = startDt;
}

}

MariaDB에서 SELECT 절에서 중복된 결과를 제거하려면 DISTINCT 키워드를 사용합니다.

기본 문법

SELECT DISTINCT column1, column2, ...
FROM table_name;

예시

예제 테이블: students

idnamemajor
1AliceCS
2BobMath
3AliceCS
4DavePhysics
SELECT DISTINCT name, major FROM students;

결과:

namemajor
AliceCS
BobMath
DavePhysics
DISTINCT는 지정한 열의 전체 조합이 중복일 때만 제거합니다.

단일 컬럼 중복 제거

SELECT DISTINCT name FROM students;

이 경우 name 값이 동일하면 한 번만 나타납니다.

참고사항

  • DISTINCTGROUP BY와도 유사한 결과를 낼 수 있지만, GROUP BY는 집계 함수와 함께 자주 사용됩니다.
  • DISTINCTORDER BY와 함께 사용해도 됩니다:

    SELECT DISTINCT name FROM students ORDER BY name;

원하는 컬럼 조합이나 예제가 있다면 알려주시면 구체적으로 도와드릴 수 있어요.

mariadb에서 from_dt는 DATE 형입니다. React 화면에서 '2025-06-02T01:59:30.885Z' 전달되어 실행 결과 Incorrect data value 오류가 발생하였습니다. 해결 방법 알려주세요

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeParseException;
import java.time.format.DateTimeFormatter;

public class DateParser {

private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

/**
 * ISO 8601 문자열을 "yyyy-MM-dd" 형식 문자열로 변환
 * - 유효하지 않은 경우 null 반환
 */
public static String parseToDateString(String isoString) {
    if (isoString == null || isoString.trim().isEmpty()) {
        return null;
    }

    try {
        Instant instant = Instant.parse(isoString);
        LocalDate localDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();
        return localDate.format(DATE_FORMATTER);
    } catch (DateTimeParseException e) {
        return null;
    }
}

}

java, spring, ibatis, mariadb 환경에서 activity 테이블에 pk는 activity_id BIGINT AUTO_INCREMENT 컬럼 입니다.
activity 테이블에 Insert하고 pk인 activity_id 리턴 받아 activity_detail 테이블에 정보를 저장하려고
합니다.
해당 예제 만들어 주세요.

Java + Spring + iBatis + MariaDB 환경에서 다음 요구사항을 만족하는 예제를 만들어드리겠습니다:

activity 테이블에 데이터를 INSERT하고, 자동 생성된 activity_id(PK)를 반환받아
✅ 그 값을 이용해 activity_detail 테이블에 데이터를 저장

✅ 1. 테이블 구조 예시

-- activity 테이블
CREATE TABLE activity (
    activity_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- activity_detail 테이블
CREATE TABLE activity_detail (
    detail_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    activity_id BIGINT,
    description TEXT,
    FOREIGN KEY (activity_id) REFERENCES activity(activity_id)
);

✅ 2. iBatis SQL Mapper 구성 (ActivityMapper.xml)

<?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="ActivityMapper">

  <!-- 1. activity insert -->
  <insert id="insertActivity" parameterType="Activity" useGeneratedKeys="true" keyProperty="activityId">
    INSERT INTO activity (name)
    VALUES (#{name})
  </insert>

  <!-- 2. activity_detail insert -->
  <insert id="insertActivityDetail" parameterType="ActivityDetail">
    INSERT INTO activity_detail (activity_id, description)
    VALUES (#{activityId}, #{description})
  </insert>

</mapper>
useGeneratedKeys="true"keyProperty="activityId"를 사용하여 Activity 객체의 activityId 필드에 자동 증가 키를 저장합니다.

✅ 3. Java DTO 클래스

// Activity.java
public class Activity {
    private Long activityId;
    private String name;

    // getter/setter
    public Long getActivityId() { return activityId; }
    public void setActivityId(Long activityId) { this.activityId = activityId; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

// ActivityDetail.java
public class ActivityDetail {
    private Long detailId;
    private Long activityId;
    private String description;

    // getter/setter
    public Long getDetailId() { return detailId; }
    public void setDetailId(Long detailId) { this.detailId = detailId; }
    public Long getActivityId() { return activityId; }
    public void setActivityId(Long activityId) { this.activityId = activityId; }
    public String getDescription() { return description; }
    public void setDescription(String description) { this.description = description; }
}

✅ 4. DAO Interface

public interface ActivityMapper {
    void insertActivity(Activity activity);
    void insertActivityDetail(ActivityDetail activityDetail);
}

✅ 5. Service 클래스

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;

@Service
public class ActivityService {

    @Resource
    private ActivityMapper activityMapper;

    @Transactional
    public void createActivityWithDetail(String activityName, String description) {
        // 1. Activity 생성
        Activity activity = new Activity();
        activity.setName(activityName);
        activityMapper.insertActivity(activity);

        // 2. 생성된 PK(activityId)를 활용한 Detail 저장
        ActivityDetail detail = new ActivityDetail();
        detail.setActivityId(activity.getActivityId());
        detail.setDescription(description);
        activityMapper.insertActivityDetail(detail);
    }
}

✅ 6. Controller 예시

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/activity")
public class ActivityController {

    private final ActivityService activityService;

    public ActivityController(ActivityService activityService) {
        this.activityService = activityService;
    }

    @PostMapping
    public String create(@RequestParam String name, @RequestParam String description) {
        activityService.createActivityWithDetail(name, description);
        return "저장 완료";
    }
}

✅ 정리

  • @Transactional 로 두 insert를 하나의 트랜잭션으로 묶어 처리합니다.
  • useGeneratedKeys를 통해 activity_id 자동 반환받음
  • 반환된 PK를 기반으로 activity_detail에 저장

필요하시면 MyBatis Config, Spring Boot 설정 등도 도와드릴 수 있습니다.