MERGE INTO
조건문에 따라서 INSERT / UPDATE / DELETE를 실행
기본키 제약사항 위반(PRIMARY KEY)
MERGE INTO LPROD A
USING DUAL ON(A.LPROD_ID = '101')
WHEN MATCHED THEN
UPDATE
SET A.LPROD_GU = 'S101',
A.LPROD_NM = '상품분류명101'
WHEN NOT MATCHED THEN
INSERT (LPROD_ID , LPROD_GU , LPROD_NM)
VALUES(101 , 'S101' , '상품분류명101');
LPROD_ID = 101인 행에서
데이터가 존재하면(WHEN MATCHED THEN) UPDATE 실행 ,
데이터가 존재하지 않으면(WHEN NOT MATCHED THEN) INSERT 실행
실행시 아래와 같이 확인
작업 완료후엔 반드시 COMMIT
MERGE INTO MEMBER A
USING DUAL ON(A.USER_NO = 1)
WHEN MATCHED THEN
UPDATE
SET A.COIN = A.COIN + 500
WHEN NOT MATCHED THEN
INSERT (USER_NO , USER_ID , USER_PW , USER_NAME , COIN , REG_DATE , UPD_DATE , ENABLED)
VALUES(6,'a006','$2a$10$vd.Y8PtJfTina10HtRQ6vOS/LXMf8.b4dejXsiXtI/3Wamkm4l1Ou','개똥이' , 0 , SYSDATE , NULL , '1');
USER_NO = 1 값 존재시 COIN+500 , 쿼리 실행시 아래와 같이 COIN 증가 확인
로그인 버튼 만들기 ,tiles/aside.jsp => a href ="/login" 으로 수정
// lprod/list.jsp 내 <script>가장 하단 부분(360번째줄 부근)
// result.total : 전체 행의 수
/* sessionStorage
1) 브라우저 세션 기간 동안 만 사용할 수 있으며 탭이나 창을 닫을 때 삭제된다.
2) 새로고침을 해도 유지된다.
3) 변경 된 사항은 현재 페이지에서 닫힐 때까지 저장되어 사용할 수 있다.
4) 탭이 닫히면 저장된 데이터가 삭제 된다.
*/
// session.setAttribute("total" , result.total);
sessionStorage.setItem("total" , result.total);
script 내 btnInsert부분 아래와 같이 수정
//아이디 자동 생성
$("#btnInsert").on("click",function(){
// session.getAttribute("total");
let total = sessionStorage.getItem("total");
console.log("total : " + total);
// lprod테이블의 MAX(LPROD_ID) + 1
// contentType:"application/json;charset=utf=8"
// data:JSON.stringify(data)
/*
요청 URI "/lprod/getMaxLprodId"
요청파라미터 :
요청방식 : post
*/
$.ajax({
url:"/lprod/getMaxLprodId",
type:"post",
dataType:"text",
beforeSend:function(xhr){
xhr.setRequestHeader("${_csrf.headerName}","${_csrf.token}");
},
success:function(result){
console.log("result : " , result);
lprodId = Number(result) + 1;
$("#lprodIdNew").val(lprodId);
$("#lprodIdNew").attr("readonly",true);
}
});
// tbody에 접근해서 자식요소들(<tr>들) 중에서 마지막 자식 요소(last())의 자식 중에서 0번째(<td>38</td>)의 text값
// let lprodId = $("#lprodTbody").children().first().children("td").eq(0).html();
// console.log("lprodId : " + lprodId);
// Number(숫자형문자)->숫자형으로 변환
});
DB에서 결과확인
LprodController에 getMaxLprodId메소드 추가(service,impl , dao , lprod_SQL.xml 수정)
수정후 LPROD_ID의 MAX 값으로 result값이 출력되는지 확인
SELECT MAX(LPROD_ID) FROM LPROD
위 쿼리문에서의 결과값과 브라우저 콘솔 result값과 동일하면 성공
위 내용을 merge into 쿼리문으로 실행해보자 lprod_sql.xml 쿼리문 수정
<insert id="insertOne" parameterType="lprodVO">
INSERT INTO LPROD(LPROD_ID,LPROD_GU,LPROD_NM)
VALUES(#{lprodId}, #{lprodGu}, #{lprodNm})
</insert>
// 위 insert문을 아래와 같이 수정
<update id="insertOne" parameterType="lprodVO">
MERGE INTO LPROD A
USING DUAL ON(A.LPROD_ID = #{lprodId})
WHEN MATCHED THEN
UPDATE
SET A.LPROD_GU = #{lprodGu}
, A.LPROD_NM = #{lprodNm}
WHEN NOT MATCHED THEN
INSERT (LPROD_ID, LPROD_GU, LPROD_NM)
VALUES(#{lprodId},#{lprodGu},#{lprodNm})
</update>
LPROD_ID의 값이 존재시 수정 , 존재하지 않으면 INSERT
(LPROD_ID의 값은 쿼리문으로 LPROD_ID의 MAX값을 가져오고 자바스크립트내에서 해당값에 +1을 해준다)