디지털 컨버전스/Backend
[Backend] JDBC
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 잊지 말것!
매번 시퀀스 쓸 때마다 까먹는다.