티스토리 뷰

[Java / Mybatis] 일괄(Batch) 입력/수정(Insert/Update)


웹 서비스 만들 때 데이터베이스에 입력/수정을 할 경우 한 번의 요청에 여러 개의 정보를 입력해야 하는 상황이 종종 있습니다.

연관성 없는 각각의 정보를 입력할 때는 별 수 없이 각 정보의 입력/수정에 해당하는 쿼리를 실행해야합니다.

하지만 동일한 구조의 데이터들을 하나의 관계형 데이터베이스 데이블에 입력/수정 할 때에는 여러번의 쿼리 실행은 소모적인 방법이 될 수있습니다.


설명에 앞서 이 글은 SQL문을 작성법 대해 집중하기 위해서 Mybatis 설정에 관한 내용은 생략하겠습니다.


아래 설명을 테스트한 환경은 전자정부 3.7이고 Mybatis의 mapper interface 방식을 사용했습니다.


1. XML Mapper

<?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="com.tistory.khanorder.mapper.StuddentMapper">
	
	<insert id="batchInsert" parameterType="list">
		insert into `student_tb` 
			(`grade`, `classroom_num`, `age`, `name`, `sex`) 
		values 
			<foreach item="item" index="index" collection="list">
				<if test="index > 0">,</if>
				(#{ item.grade }, #{ item.classroom_num }, #{ item.age }, #{ item.name }, #{ item.sex })
			</foreach>;
	</insert>
	
</mapper>


2. Controller

package com.tistory.khanorder.web;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import com.tistory.khanorder.domain.StudentVO;
import com.tistory.khanorder.service.StudentService;

@Controller
public class Student {
	
	@Autowired
	StudentService stdntService;
	
	@RequestMapping(value = "/student/process.do")
	public String utilVsSql(HttpServletRequest req, ModelMap model) {
		
		List<studentvo> list = new ArrayList<studentvo>();
		
		list.add(new StudentVO(1, 1, 17, "김희철", "M"));
		list.add(new StudentVO(1, 1, 17, "박세영", "F"));
		list.add(new StudentVO(1, 2, 17, "민경훈", "M"));
		list.add(new StudentVO(1, 3, 18, "보아", "F"));
		list.add(new StudentVO(2, 1, 18, "김영철", "M"));
		list.add(new StudentVO(2, 2, 18, "이상민", "M"));
		list.add(new StudentVO(2, 3, 18, "이수근", "M"));
		list.add(new StudentVO(2, 3, 18, "김희선", "F"));
		list.add(new StudentVO(3, 1, 19, "서장훈", "M"));
		list.add(new StudentVO(3, 2, 19, "강호동", "M"));
		
		Integer result = stdntService.batchInsert(list);
		String message = "";
		if (result > 0) {
			message = "성공";
		} else {
			message = "실패";
		}
		model.addAttribute("message", message);
		
		// 뷰페이지는 각자 상황에 맞게 처리해준다.
        return "result";
	}

}


3. Service

package com.tistory.khanorder.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.tistory.khanorder.domain.StudentVO;
import com.tistory.khanorder.mapper.StudentMapper;

@Service
public class StudentService {
	
	@Autowired
	private StudentMapper stdntMapper;
	
	public Integer BatchInsert(List<studentvo> list) {
		
		Integer result = 0;
		
		try {
			result = stdntMapper.batchInsert(list);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return result;
		
	}

}


4. Mapper

package com.tistory.khanorder.mapper;

import java.util.List;

import com.tistory.khanorder.domain.StudentVO;

import egovframework.rte.psl.dataaccess.mapper.Mapper;

@Mapper
public interface StudentMapper {
	
	public Integer batchInsert(List<studentvo> list) throws Exception;

}


5. Domain

package com.tistory.khanorder.domain;

public class StudentVO {
	
	private Integer uid;
	private Integer grade;
	private Integer classroom_num;
	private Integer age;
	private String name;
	private String sex;
	
	public StudentVO(Integer grade, Integer classroom_num, Integer age, String name, String sex) {
		this.grade = grade;
		this.classroom_num = classroom_num;
		this.age = age;
		this.name = name;
		this.sex = sex;
	}

	public Integer getUid() {
		return uid;
	}

	public Integer getGrade() {
		return grade;
	}

	public Integer getClassroom_num() {
		return classroom_num;
	}

	public Integer getAge() {
		return age;
	}

	public String getName() {
		return name;
	}

	public String getSex() {
		return sex;
	}

	@Override
	public String toString() {
		return "StudentVO [uid=" + uid + ", grade=" + grade + ", classroom_num=" + classroom_num + ", age=" + age + ", name=" + name + ", sex=" + sex + "]";
	}

}



도움이 되셨다면 공감이나 좋아요 부탁드립니다~♡

광고를 클릭해주시면 더욱 감사하구요~♡v♡/

혹시 더 궁금하신 점이나 부족한 부분, 잘못된 내용이 있다면 댓글 부탁드립니다~~


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함