IT/development

[mybatis] foreach parameterType hashmap ์˜ˆ์ œ

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2022. 11. 20.

๋ฏธ๋ž˜์˜ ๋‚˜๋ฅผ ์œ„ํ•ด ๊ธฐ๋กํ•œ๋‹ค. ๐Ÿ˜ƒ

mybatis์—์„œ foreach๋ฅผ ๋Œ๋ฆด ๋•Œ list๋Š” ์ด์ œ ์ข€ ์ต์ˆ™ํ•ด ์กŒ๋Š”๋ฐ map์€ ์•„์ง ์ข€ ์„œํˆฐ ๋А๋‚Œ์ด ๋“ค์–ด ๊ธฐ๋กํ•œ๋‹ค.

์˜ˆ์ œ๋Š” ๋™์ ์œผ๋กœ insert๋ฌธ์˜ ๋‚ด์šฉ๊ณผ SELECT๋ฌธ์˜ ๋‚ด์šฉ์„ ์ฑ„์šฐ๋Š” ์˜ˆ์ œ์ด๋‹ค.

์•„์ง์€ ์™„์„ฑํ˜•์ด ์•„๋‹ˆ๊ณ  ์•„์ด๋””์–ด๋งŒ ๋…น์ธ๊ฑฐ๋ผ ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ํ—ˆ์ˆ ํ•˜์ง€๋งŒ ์—…๋ฐ์ดํŠธ ํ•ด ๋‚˜๊ฐˆ ๊ฒƒ์ด๋‹ค.

jpa๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑ ์‹œ ์˜คํƒˆ์ž ๋ฐฉ์ง€์™€ ํผํฌ๋จผ์Šค ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” ์ค‘

๊ฒฐ๊ตญ ๋‹จ์ˆœ๋ฐ˜๋ณต ๋…ธ๊ฐ€๋‹ค๋ฅผ ๋งŽ์ด ์ค„์ด๊ธฐ ์œ„ํ•จ์ด๋‹ค.

ํ…Œ์ด๋ธ” ์ƒ์„ฑ

CREATE TABLE `t_member`(
`user_seq` bigint auto_increment,
`user_id` varchar (250),
`user_name` varchar(250),
primary key(user_seq)
);

์†Œ์Šค

mapper 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="paging.study.mapper.MemberMapper">

    <insert id="insertMem" parameterType="hashmap">
        INSERT INTO t_member
        <foreach collection="column" item="column" open="(" separator="," close=")">
            ${column}
        </foreach>
        VALUES
        <foreach collection="column_value" item="column_value" open="(" separator="," close=")">
            #{column_value}
        </foreach>
    </insert>

    <select id="findMember" resultType="hashMap" parameterType="hashMap">
        SELECT
        <foreach collection="column" index="index" item="column" separator=",">
            ${column}
        </foreach>
        FROM ${tableName}
    </select>


</mapper>

parameter๋กœ ๋ฐ›์€ map์— ์ ‘๊ทผํ•ด ๋™์ ์œผ๋กœ ์ปฌ๋Ÿผ๊ณผ ํ…Œ์ด๋ธ”์„ ๊ฐ€์ ธ์™€ SQL๋ฌธ์„ ์„ธํŒ…ํ•œ๋‹ค.

์ด ๋•Œ ์ฃผ์˜์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

map์— ์ €์žฅ ์‹œ ํ‚ค๊ฐ’๊ณผ foreach์˜ collection๋ช…์ด ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ ์ปฌ๋Ÿผ ํ‚ค๊ฐ’์„ ๋ณ€๊ฒฝ ํ›„ ํ…Œ์ŠคํŠธ ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ collection์ด null๊ฐ’์ด๋ผ๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

mapper interface

package paging.study.mapper;

import org.apache.ibatis.annotations.Mapper;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Mapper
public interface MemberMapper {
    void insertMem(Map<String, Object> param);
    List<Map<String, Object>> findMember(Map<String, Object> param);
}

Map์„ parameter๋กœ ๋ฐ›๋Š”๋‹ค.

mapper service

package paging.study.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import paging.study.domain.Criteria;
import paging.study.domain.vo.BoardVO;
import paging.study.mapper.BoardMapper;
import paging.study.mapper.MemberMapper;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberService {

    private final MemberMapper memberMapper;

    public void insert(List<String> column, List<String> column_value) {
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("column", column);
        param.put("column_value", column_value);
        memberMapper.insertMem(param);
    }

    public List<Map<String, Object>> findMember(List<String> column, String tableName) {
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("column", column);
        param.put("tableName", tableName);
        return memberMapper.findMember(param);
    }





}

insert()์—์„œ๋Š” ์ปฌ๋Ÿผ๋ช…๊ณผ ์ปฌ๋Ÿผ์— ํ•ด๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ list๋กœ ๋ฐ›์•„์„œ map์— ์ €์žฅํ•ด์„œ mapper๋กœ ๋ณด๋‚ด๊ณ 

findMember()์—์„œ๋Š” list๋กœ ์ปฌ๋Ÿผ๋ช…์„, String์œผ๋กœ ํ…Œ์ด๋ธ”๋ช…์„ ๋ฐ›๋Š”๋‹ค.

test code

package paging.study.service;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
@Slf4j
@Transactional
class MemberServiceTest {

    @Autowired MemberService memberService;

    @Test
    @DisplayName("insert")
    @Commit
    public void insert() {
        List<String> column = new ArrayList<>();
        column.add("user_id");
        column.add("user_name");
    
        List<String> column_value = new ArrayList<>();
        column_value.add("์•„์ด์–ธ๋งจ");
        column_value.add("๋กœ๋‹ค์ฃผ");
        memberService.insert(column, column_value);
    }

    @Test
    @DisplayName("find")
    public void find() {
        List<String> column = new ArrayList<>();
        column.add("user_id");
        column.add("user_name");
        List<Map<String, Object>> list = memberService.findMember(column, "t_member");
        System.out.println("list = " + list.toString());
    }

}

์‹คํ–‰ ๊ฒฐ๊ณผ

insert

select

์•„๋ž˜์ฒ˜๋Ÿผ ํ™œ์šฉํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

controller

ํ™”๋ฉด์—์„œ ์ „๋‹ฌ ๋ฐ›์€ parameter๋ฅผ map์œผ๋กœ ๋ฐ›๊ณ  service method ํ˜ธ์ถœ

@PostMapping("/board/new")
    public String create(@RequestParam Map<String, Object> map) throws Exception {
        boardService.insertBoard(map);
}

service

	@Transactional
    public void insertBoard(Map<String, Object> map) {
		
        Map<String, Object> mapperParam = new HashMap<String, Object>();
        List<Object> columns = new ArrayList<>();
        List<Object> column_values = new ArrayList<>();
		// map์—์„œ key, value ์ถ”์ถœํ•ด์„œ list์— ์ €์žฅ
        for (Object obj: map.keySet()) {
            columns.add(obj);
            column_values.add(map.get(obj));
        }
        mapperParam.put("column", columns);
        mapperParam.put("column_value", column_values);

        boardMapper.insertBoard(mapperParam);
    }

mapper interface

void insertBoard(Map<String, Object> map);

mapper xml

<!-- map์„ ๋ฃจํ”„ ๋Œ๋ฉด์„œ ์ปฌ๋Ÿผ๊ณผ ๋ฐ์ดํ„ฐ ์„ธํŒ… -->
<insert id="insertBoard" parameterType="hashmap">
        INSERT INTO t_board
            (
             <foreach collection="column" item="column" separator=",">
                ${column}
             </foreach>
             , reg_date
             , update_date
             )
        VALUES
            (
            <foreach collection="column_value" item="column_value" separator=",">
                #{column_value}
            </foreach>
            , now()
            , now()
            )
    </insert>

๊ฐœ์ธ ์Šคํ„ฐ๋”” ๊ธฐ๋ก์„ ๋ฉ”๋ชจํ•˜๋Š” ๊ณต๊ฐ„์ด๋ผ ํ‹€๋ฆฐ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‹€๋ฆฐ ์  ์žˆ์„ ๊ฒฝ์šฐ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

[mybatis] mybatis ๋ฐฐ์—ด ์ €์žฅ(feat. foreach)

๋ชฉ์ฐจ ์œ„์™€ ๊ฐ™์ด insert๋ฅผ 1๊ฐœ ์ด์ƒ ํ•˜๋Š” ๋กœ์ง์„ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๊ณ  ๋ฏธ๋ž˜์˜ ๋‚ด๊ฐ€ ๋ณด๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•œ๋‹ค. ๐Ÿ˜„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐฐ์—ด๋กœ ๊ฐ’์„ ๋ฐ›์•„์„œ DB์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ–ˆ๋‹ค. ์ฐธ๊ณ ๋กœ mysql๊ณผ Oracle์€ ๋ฌธ

yaga.tistory.com

 

[mybatis] mybatis ๋™์ ์ฟผ๋ฆฌ(feat. <where></where>)

๋ชฉ์ฐจ mybatis Dynamic SQL ๐Ÿ˜ƒ ๊ณ„์† ์‹ค์ˆ˜ ํ–ˆ๋˜ ๋™์ ์ฟผ๋ฆฌ์ด๋‹ค. ์˜ค๋Š˜ ๋‚˜๋Š” ์ด๊ฑธ ์ดํ•ด ํ–ˆ์ง€๋งŒ ๋ฏธ๋ž˜์˜ ๋„Œ ๋˜ ๊นŒ๋จน์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์—ฌ๊ธฐ์— ๋ฉ”๋ชจํ•ด ๋‘”๋‹ค. ๋™์  WHERE ํšŒ์› ํ…Œ์ด๋ธ”์—์„œ ํšŒ์›์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์˜ ์กด์žฌ์—

yaga.tistory.com

 

[mybatis] map์„ list๋กœ ๋ฐ›์•„์„œ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๊ธฐ

๋ชฉ์ฐจ ๋ฏธ๋ž˜์˜ ๋‚ด๊ฐ€ ๋ณด๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•จ ํ…Œ์ŠคํŠธ ํ…Œ์ด๋ธ” ๐Ÿ˜ƒ CREATE TABLE `tmp_board`( `board_seq` bigint auto_increment, `title` varchar (30), `contents` varchar (30), `name` varchar (30), `reg_date` timestamp, `update_date` timestamp, primary

yaga.tistory.com

 

[mybatis] mybatis ์ด์ค‘ foreach insert(feat. ์ด์ค‘ ๊ณ„์ธต ๊ฐ์ฒด ์ €์žฅ)

๋ชฉ์ฐจ mybatis๋ฅผ ์ด์šฉํ•ด์„œ ๊ณ„์ธต ๊ตฌ์กฐ์˜ DTO ํ˜น์€ VO๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๋กํ•œ๋‹ค. ๋Œ€์ƒ DBMS: mysql, mariaDB ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ์ฒด๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.(์‹œ๊ฐ„ ์ƒ ์ฝ”๋“œ ์œ„์ฃผ๋กœ ์ตœ

yaga.tistory.com

 

[mybatis] selectkey๊ฐ’ return(Oracle)

SELECT BOARD_NO_SEQ.NEXTVAL FROM DUAL /* ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ */ INSERT INTO BOARD ( BOARD_NO , TITLE , CONTENT , WRITER , CREATE_DATE ) VALUES ( #{boardNo} , #{title} , #{content} , #{writer} , SYSDATE ) /* ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก(mapper interface) */ void insertBoa

yaga.tistory.com

๋Œ“๊ธ€