Programming/JDBC

JDBC에서 insert 쿼리 날리기, SQL 쿼리문법 불일치 오류해결(';' 세미콜론 지우기). 2022-02-09.

최동훈1 2022. 2. 9. 18:13

오늘은 JDBC에서 DB에서 데이터를 "조회" 하는 것이 아닌 "추가" 하는 과정을 해 보았다.

 

즉, SQL의 DML에는 SELECT, INSERT, UPDATE, DELETE 등이 있는데, 이번에는 insert문을 직접 JAVA에서 JDBC를 이용해 DB로 쿼리를 날리는 작업을 해 보았다.

차이점이 있는데, SELECT 만 쓸 때는, 결과집합(RESULTSET)객체를 만들어주고, 거기서 출력을 해야했었는데, 애초에 조회가 아니라 추가다보니 그럴 일이 없어졌다.(아래의 주석 처리한 부분.)

 

또 PreparedStatement를 통해 복잡한 인자들을 직접 추가하지말고, 이미 만들어진 SQL에 인덱스별로 추가해주면 된다.

 

 

우선 아래의 내가 쓴 코드를 보자. 전혀 문제될 것이 없어보인다.

 

public class program2 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		String url="jdbc:oracle:thin:@localhost:1521/xepdb1";
		
		String Title="울산광역시";
		String writer_id="최동훈";
		String content="서울에서도 울산에서 처럼, 꾸준하게 끝까지 하자. ";
		
		
		String sql="INSERT INTO notice (title,writer_id,content) VALUES (?,?,?);";
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con=DriverManager.getConnection(url,"NEWLEC","vdongv1620");
		//Statement st=con.createStatement();
		//ResultSet rs=st.executeQuery(sql);
		PreparedStatement st=con.prepareStatement(sql);
		
		st.setString(1, Title);			
		st.setString(2, writer_id);			
		st.setString(3, content);			
		
		int result=st.executeUpdate();
		System.out.println(result);
	
		st.close();
		con.close();
		
		
	}

}

그런데에러가 났다.

난 SQL을 제대로 썻기 때문에, 틀린 이유를 모르겠어서 계속 해매다가 세미콜론";"이 들어가면 애러가 난다는 사실을 알게 되었다.

INSERT INTO notice (title,writer_id,content) VALUES (?,?,?)

그래서 이렇게 세미콜론을 빼니, 정상적으로 작동되었다.

 

UPDATE를 통해 JDBC에서 DB에 저장된 테이블 변경을 해보자. 일단 필요한 쿼리와 java코드의 형식은 insert문과 거의 유사하다. 즉, 마찬가지로, SELECT 문과는 달리, executeQuery가 아닌 executeUpdate를 쓴다. 또한 결과집합이 필요 없기떄문에, resultset을 굳이 쓸 필요도 없다.

Update 쿼리를 통해 ID 10에 위치한 레코드를 변경해 보겠다.

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class updatepractice {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		String url="jdbc:oracle:thin:@localhost:1521/xepdb1";
		String title="울산";
		String writer_id="개발자";
		String content="나 최동훈은 백엔드 개발자가 되어서, 네카라쿠베에 입사할 것이다.";
		
		String sql="update notice set title=? , writer_id=? , content=?" + 
				"where id='10'";
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con=DriverManager.getConnection(url,"NEWLEC","vdongv1620");
		PreparedStatement st=con.prepareStatement(sql);
		st.setString(1, title);
		st.setString(2, writer_id);
		st.setString(3, content);
		
		int result=st.executeUpdate();
		System.out.println(result);
		
		st.close();
		con.close();
		
		
		
		
	}

}

 

 

바꾸기전 테이블.

새로 내가 날린 쿼리가 적용되었다.

JAVA코드 실행후 SQL DEVELOPER로 접속해서 확인한 모습, 

 

JDBC에서의 executeUpdate에 대해서는 내가 그 전에 쓴 포스팅 참고.

JDBC에서 레코드 가져오기, insert문으로 레코드 입력하기 + 트리거 개념+ 시퀀스 개념.+ statement 클래스의 DML에 따른 함수들. 2021-08-27 — "꾸준하게, 지속하자" (tistory.com)

 

JDBC에서 레코드 가져오기, insert문으로 레코드 입력하기 + 트리거 개념+ 시퀀스 개념.+ statement 클

이젠 실질적으로 자바 프로그램으로 DB에 접근해서 데이터를 얻어와 보자. 1. 만약 내가 DB에 저장된 모든 데이터를 가지고 오고 싶다면 어떻게 해야 할까? 쉽다. rs.next의 특성을 이용하면 된다. rs

ulsanboy.tistory.com

 

공부시간 1시간 20분.

순공시간 1시간.