본문 바로가기
CLASS/SPRING,JSTL

#7-3 / mybatis DB연결 - 포인트 (insert, select ,select one,delete)

by hingu 2024. 7. 22.

1. userpoint table 생성

create table userpoint(
uidx int(5) not null auto_increment,
uid varchar(100) not null,
uname char(100) not null,
upoint int(5) not null,
udate timestamp not null default current_timestamp(),
primary key(uidx)
);

 

2. DAO 생성  - pointdao.java 

package api;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class pointdao {
	int uidx,upoint;
	String uid,uname,udate;
}

 

3. point.jsp

<body>
	<form id="frm" method="post" action="./pointok.do">
		사용자 아이디 : <input type="text" name="uid"><br>
		사용자 이름 : <input type="text" name="uname"><br>
		지급할 포인트 : <input type="text" name="upoint" maxlength="5"><br>
		<input type="button" value="포인트 지급" id="btn">
	</form>
</body>

<script type="text/javascript">
	document.getElementById("btn").addEventListener("click",function(){
		frm.submit();
	});
</script>

 

4. config.xml - <configuration></configuration> 안에 추가

<!--  DAO,VO,getter,setter 을 연결하는 역할(Module,Controller) -->
<configuration>
	<!--해당 영역 추가-->
	<typeAliases>
		<typeAlias alias="pointdao" type="api.pointdao"/>
	</typeAliases>
</configuration>

=> configuration 안에 각종 DAO클래스를 모두 등록 (단, alias 값 중복 금지)

 

5. mapper.xml -  <mapper></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">
<!-- sql문법에 대한 그룹 명 -->
<mapper namespace="datadb">
	<!-- 해당 영역 추가 - 해당 그룹에 따른 id값으로 query문을 실행 -->
    	<select id="point_select" resultType="pointdao">
		select * from userpoint order by uidx desc
	</select>
    
	<insert id="point_insert">
		insert into userpoint (uidx,uid,uname,upoint,udate)
		values ('0',#{uid},#{uname},#{upoint},now()) 
	</insert>
</mapper>

 

${ } : 필드명 , 테이블명 처리 가능한 파라미터 ( 치환..? 이라고 생각하면 될듯.. 직접 가져올때는 해당 문법 사용 )

#{ } : 값을 적용시킬때 사용하는 파라미터 ( dao로 가져오는 경우 ) - 거의 얘 쓴다고 보면 됨 

 

resultType="pointdao" : config.xml의 alias값 넣으면 됨

=> 해당 select 문 작성시 pointlist기능 제작시 배열에 넣을 필요 없음!

=> select 태그에만 사용 하는 속성!

 

 

6. @Controller - @PostMapping("/pointok.do")

package api;

//~import 생략

@Controller
public class apimain2 {		
	PrintWriter pw = null;
	
	@Inject
	private SqlSessionFactory sqlfact;
	SqlSession se = null;
	
	/*---- 포인트 insert ----*/
	@PostMapping("/pointok.do")
	public String pointok(@ModelAttribute("point") pointdao dao,HttpServletResponse res) {
		res.setContentType("text/html;charset=utf-8");
		try {
			this.se = sqlfact.openSession();
			this.se.insert("datadb.point_insert",dao);

			this.pw = res.getWriter();
			this.pw.write("<script>"
					+ "alert('정상적으로 지급 완료되었습니다.');"
					+ "location.href='./point_list.do';"
					+ "</script>");
		}catch(Exception e) {
			System.out.println("db 접속 오류!");
		}finally {
			this.pw.close();
			this.se.close();
		}
		
		return null;
	}
	
	/*---- 포인트 select ----*/
	@GetMapping("/point_list.do")
	public String point_list(Model m) {
    	//getter,setter로 이루어진 배열 : Interface
		List<pointdao> all = null; //arrayList 사용 불가! 
		try {
			this.se = sqlfact.openSession();
			all = this.se.selectList("datadb.point_select");
			
			m.addAttribute("all",all); //Model사용 jstl로 넘김
		}catch(Exception e) {
			System.out.println("database 접속 오류 발생!");
		}finally {
			this.se.close();
		}
		return null;
	}

}

 

insert : this.se.insert(mapper.xml의 mapper namespace . 실행할쿼리문 id)

select : this.selectList( mapper.xml의 mapper namespace . 실행할쿼리문 id )

 

selectList : 여러개의 데이터를 dao를 이용하여 출력하는 방식

selectOne : 딱 하나의 데이터를 dao를 이용하여 출력하는 방식 (얜 받는 변수타입 arrayList 쓰는게 좋다)

 

7. point_list.jsp - 포인트 생성 내역 리스트 페이지

<%@page import="api.pointdao"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="cr" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>포인트 생성 내역 리스트</title>
</head>
<body>
	<h3>[ 데이터 리스트 출력 ]</h3>
	<ul style="list-style:none; padding : 0;">
		<cr:forEach var="listdata" items="${all}">
			<li style="border-bottom : 1px solid #ddd;">
				<p><b>아이디</b> : ${listdata.uid}</p>
				<p>고객명 : ${listdata.uname}</p>
				<p>포인트 금액 : ${listdata.upoint}</p>
				<p>지급일자 : ${listdata.udate}</p>
			</li>	
		</cr:forEach>
	</ul>
</body>
</html>

잘찍힘 ㅎ

 

 

/* view.. */

8. mapper.xml에 추가

<select id="point_one" resultType="pointdao">
    select * from userpoint where uidx=#{aa} order by uidx desc
</select>

#{aa} : 아무거나 적어도 됨 

 

9. view 페이지 (selectOne) @Controller에 추가 - list.jsp에서 해당 li 클릭시 

ex ) view 페이지로 넘길시

** 검색기능 제작시 에는 selectlist로 해야함! => 검색결과가 몇개가 될지 모름..

/*---- 포인트 select one ----*/
@GetMapping("/point_view.do")
public String point_view(Model m, String uidx) {
    System.out.println(uidx);

    try {
        this.se = sqlfact.openSession();
        pointdao pd = this.se.selectOne("datadb.point_one",uidx);
        ArrayList<Object> onedata = new ArrayList<Object>();
        onedata.add(pd.getUidx());
        onedata.add(pd.getUid());
        onedata.add(pd.getUpoint());
        onedata.add(pd.getUname());
        onedata.add(pd.getUdate());
        System.out.println(onedata); //걍 sysout으로 확인

    }catch(Exception e) {
        System.out.println("DB 연결 오류!");
    }finally {
        this.se.close();
    }

    return null;
}

=> http://localhost:8080/point_view.do?uidx=3 로 접속시

[3, dndhkd, 5000, dndhkd, 2024-07-22 14:36:05] 해당 번호에 맞는 배열  잘찍힙니당..

 

 

 

/* delete.. */

point_list에 onlick 추가

<input type="button" value="데이터 삭제" id="btn" data="${listdata.uidx}" onclick="data_del(this)">

<script>
	function data_del(val){
		if(confirm('정말 삭제하시겠습니까?')){
			var input = document.createElement('input');
			input.type = 'hidden';
			input.name = 'uidx';
			input.value = '';
			input.value = val.getAttribute("data");
			frm.appendChild(input);
			
			frm.submit();			
		}
	}
</script>

 

 

mapper.xml에 추가

<delete id="point_delete">
    delete from userpoint where uidx=#{del} order by uidx desc;
</delete>

 

 

@Controller에 추가 - list.jsp에서 삭제버튼 클릭시 

@PostMapping("/data_del.do")
public void data_del(@ModelAttribute("point") pointdao dao,String uidx,HttpServletResponse res) {
    res.setContentType("text/html;charset=utf-8");
    try {
        this.pw = res.getWriter();
        this.se = sqlfact.openSession();
        int result = this.se.delete("datadb.point_delete",uidx);
        if(result > 0) {
            this.pw.write("<script>"
                    + "alert('데이터 삭제가 정상적으로 완료되었습니다.');"
                    + "location.href='./point_list.do';"
                    + "</script>");				
        } //else 쓸필요 x 어차피 에러나면 catch로 빠짐ㅋ

    }catch(Exception e) {
        System.out.println("database 오류 발생~!");
    }finally {
        this.pw.close();
        this.se.close();
    }
}

 

 

getter,setter시 이런식으로 많이씀.. 

package api;

import java.util.ArrayList;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class pointdao {
	int uidx,upoint;
	String uid,uname,udate;
	
	public ArrayList<Object> data(){
		ArrayList<Object> onedata = new ArrayList<Object>();
		onedata.add(this.getUidx());
		onedata.add(this.getUid());
		onedata.add(this.getUpoint());
		onedata.add(this.getUname());
		onedata.add(this.getUdate());
		
		return onedata;
	}
}