gimyeondong 2020. 4. 24. 15:21

Oracle - Developer

테이블 이름 : Messages

seq : 1 ~ 무한대까지 1씩 증가

name 문자 20글자 비워둘 수 없음

contents 문자 300글자 비워둘 수 없음

write_date 날짜 기본값 sysdate

//Oracle SQL

create table Messages (
    seq number primary key,
    name varchar(20) not null,
    contents  varchar(300) not null,
    write_date date default sysdate
);

create sequence messages_seq
start with 1
increment by 1
nomaxvalue
nocache;

외부 라이브러리 적용 (ojdbc6)

외부 라이브러리 Build Path로 넣는 방식은 웹에서는 사용 못함

 

C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib

에 있는 ojdbc6 복사 붙여넣기


package kh.backend.exam;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// @WebServlet : 당 서블릿으로 접속하는 URL 값
@WebServlet("/Exam01")
public class Exam01 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		String contents = request.getParameter("contents");
		System.out.println(request.getRemoteAddr()+ " : " +name + " : " + contents);
	
		// JDBC 코드로 name과 contents 값을 테이블에 저장해보세요.
		
		int result =0;

		try {
			String url = "jdbc:oracle:thin:@localhost:1521:xe"; //thin(연결드라이버):ip주소: :xe(파일이름)
			String loginId = "kh";
			String loginPw = "kh";
			String sql = 
					"insert into Messages values(messages_seq.nextval, ?, ?, sysdate)"; //.nextval 기억하자
			Class.forName("oracle.jdbc.driver.OracleDriver"); //
			try(Connection con = DriverManager.getConnection(url, loginId, loginPw);
				PreparedStatement pstat = con.prepareStatement(sql);){
				pstat.setString(1, name);
				pstat.setString(2, contents);
				result = pstat.executeUpdate();
				con.commit();
			}
			// SQL 문법 대로 넣기, 단 세미콜론은 오류가 나므로 넣지 말것
			// 만약 실패했다면? 오라클 예외발생 / 성공한다면 1 
			// 트렌젝션으로 삽입
			// 그 후에 commit 해줘야함 (connection 객체)
			// 다 사용한 연결 끊어주기 - DBMS도 무한 접속을 막기 위한 접속제한 있기 때문
		}catch(Exception e) {
			e.printStackTrace();
		}

		PrintWriter pw = response.getWriter();
		if(result>0) {
			pw.append("<marquee>Message input complete</marquee>");
			
		}else {
			pw.append("fail");
		}
		
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.5.0.js"
	integrity="sha256-r/AaFHrszJtwpe+tHyNi/XCfMxYpbsRg2Uqn0x3s2zc="
	crossorigin="anonymous"></script>
</head>
<body>
	<form action="Exam01" method="get"><!-- 데이터목적지 -->
		 <input type="text" name="name" placeholder="작성자"><br>
		 <input	type="text" name="contents" placeholder="내용"><br>
		 <input type="submit">
	</form>
</body>
</html>

에러 : column not allowed here

"insert into Messages values(messages_seq.nextval, ?, ?, sysdate)";

시퀀스 넣을 때 .nextval 잊지 말것!

매번 시퀀스 쓸 때마다 까먹는다.