๋ฏธ๋์ ๋๋ฅผ ์ํด ๊ธฐ๋กํ๋ค. ๐
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
'IT > development' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[mybatis] mybatis ๋ฐฐ์ด ์ ์ฅ(feat. foreach) (0) | 2022.11.21 |
---|---|
[mybatis] mybatis ๋์ ์ฟผ๋ฆฌ(feat. <where></where>) (0) | 2022.11.20 |
[jQuery]radio/checkbox ์ฒดํฌ ์ฌ๋ถ ํ์ธ (0) | 2022.11.19 |
[IDE/SVN]eclipse svn branch ์์ฑ (0) | 2022.11.19 |
[springBoot] ํ์ด์ง๋ค์ด์ ์ฒ๋ฆฌ(feat. MariaDB) (0) | 2022.11.19 |
๋๊ธ