MariaDB에서 문자열 합치기 방법
SELECT CONCAT('Hello', ' ', 'World') AS combined_string;
-- 결과: 'Hello World'
SELECT LPAD('123', 5, '0') AS padded_number;
-- 결과: '00123'
파트너사와 공존 및 협력하는 새로운 시스템 도입 시대, 디지털 노동력으로 기업의 역량을 무한히 확장시키는 방법을 알아보세요. VIW로 여러분의 상상을 지금 현실로 만들어 보세요.
SELECT CONCAT('Hello', ' ', 'World') AS combined_string;
-- 결과: 'Hello World'
SELECT LPAD('123', 5, '0') AS padded_number;
-- 결과: '00123'
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
id | name | major |
---|---|---|
1 | Alice | CS |
2 | Bob | Math |
3 | Alice | CS |
4 | Dave | Physics |
SELECT DISTINCT name, major FROM students;
결과:
name | major |
---|---|
Alice | CS |
Bob | Math |
Dave | Physics |
DISTINCT
는 지정한 열의 전체 조합이 중복일 때만 제거합니다.
SELECT DISTINCT name FROM students;
이 경우 name
값이 동일하면 한 번만 나타납니다.
DISTINCT
는 GROUP BY
와도 유사한 결과를 낼 수 있지만, GROUP BY
는 집계 함수와 함께 자주 사용됩니다.DISTINCT
는 ORDER 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
테이블에 데이터를 저장
-- 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)
);
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
필드에 자동 증가 키를 저장합니다.
// 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; }
}
public interface ActivityMapper {
void insertActivity(Activity activity);
void insertActivityDetail(ActivityDetail activityDetail);
}
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);
}
}
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
자동 반환받음activity_detail
에 저장필요하시면 MyBatis Config, Spring Boot 설정 등도 도와드릴 수 있습니다.