티스토리 뷰
Program.java파일을 복사해서 Program2.java 파일을 생성하고 실습을 진행
Program2.java 수정 전 코드
package ex1;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Program2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String url = "jdbc:oracle:thin:@192.168.219.103:1521/XE";
String sql = "SELECT * FROM NOTICE WHERE hit >= 10";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, "corini", "111111");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
while(rs.next()) {
int id = rs.getInt("ID");
String title = rs.getString("TITLE");
String writerId = rs.getString("WRITER_ID");
Date regDate = rs.getDate("REGDATE");
String content = rs.getString("CONTENT");
int hit = rs.getInt("hit");
System.out.printf("id: %d, title: %s, writerId: %s, regDate: %s, content: %s, hit: %d\n", id, title, writerId, regDate, content, hit);
}
rs.close();
st.close();
con.close();
}
}
코드 내에서 insert를 할 때 사용하지 않는 코드는 먼저 삭제하고 시작
package ex1;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Program2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String url = "jdbc:oracle:thin:@192.168.219.103:1521/XE";
String sql = "SELECT * FROM NOTICE";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, "corini", "111111");
Statement st = con.createStatement();
rs.close();
st.close();
con.close();
}
}
SELECT문을 사용 할때에는 Query를 사용하여 결과 집합을 얻지만 insert, update, delete에는 Update를 사용한다.
executeQuery(String sql): ResltSet 반환
excuteUpdate(String sql): int 반환
INSERT INTO notice (
title,
writer_id,
content,
files
) VALUES (
'TEST',
'newlec',
'content test',
''
);
이전에 만들어둔 INSERT 쿼리문을 복사 후 Program2.java의 String url = 코드에 복붙.
이클립스가 내려쓰기를 하면서 \r\n 이라는 문장을 추가로 넣어줬다(쿼리문으로 실행하면 문제가 발생)
나름 일을 열심히 하지만 이런 오류는... 직접 수정해주어야 한다.
쿼리문으로 수정하면서 '"+title+"' 이렇게 코드가 너무 복잡해졌다. 실수할 가능성이 높아진다.
이럴 때는 PreparedStatement도국 사용하면 쉽게 코드를 작성할 수 있다.
PeparedStatement
: JDBC의 쿼리문을 쉽게 작성할 수 있도록 도와주는 도구
package ex1;
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 Program2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
/*title, writerId, content, files를 정의*/
String title = "TEST";
String writerId ="newlec";
String content = "content test";
String files = "";
String url = "jdbc:oracle:thin:@192.168.219.103:1521/XE";
/*INSERT SQL문 */
String sql = "INSERT INTO notice ("
+ " title,"
+ " writer_id,"
+ " content,"
+ " files"
+ ") VALUES (?,?,?,?)"; //PreparedStatement를 통한 전달
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, "corini", "111111");
/*PreparedStatement도구 사용*/
PreparedStatement st = con.prepareStatement(sql);
//sql문 prepareStatement를 이용해서 st에 저장
/*preparedStatement이용, setString(인덱스값[1부터], 변수)로 저장 */
st.setString(1, title);
st.setString(2, writerId);
st.setString(3, content);
st.setString(4, files);
/*preparedStatement를 사용 할때에는 sql문을 전달하지 않는다! 이미 전달 되어있다.*/
int result = st.executeUpdate();
//excuteUpdate는 int로 실행된 row값을 result에 전달
System.out.println(result);
st.close();
con.close();
}
}
주석 처리된 부분들을 다시 확인하면서 코드를 이해해보자.
PreparedStatement의 사용법
/*INSERT SQL문 */
String sql = "INSERT INTO notice ("
+ " title,"
+ " writer_id,"
+ " content,"
+ " files"
+ ") VALUES (?,?,?,?)"; //PreparedStatement를 통한 전달
SQL문에서 VALUES (?,?,?,?)로 전달
/*PreparedStatement도구 사용*/
PreparedStatement st = con.prepareStatement(sql);
//sql문 prepareStatement를 이용해서 st에 저장
/*preparedStatement이용, setString(인덱스값[1부터], 변수)로 저장 */
st.setString(1, title);
st.setString(2, writerId);
st.setString(3, content);
st.setString(4, files);
/*preparedStatement를 사용 할때에는 sql문을 전달하지 않는다! 이미 전달 되어있다.*/
int result = st.executeUpdate();
//excuteUpdate는 int로 실행된 row값을 result에 전달
PreparedStatement를 정의 및 변수 저장, 결과 실행
PreparedStatement st = con.preparedStatement(sql);
st.setString(인덱스, 변수);
st.excuteUpdate();
한 개의 쿼리문이 실행되었다는 결과를 확인
사용방법은 알고 있으나 여러 번 직접 실습을 해보아야 내 것이 될 것임.
'JDBC' 카테고리의 다른 글
데이터 수정 (0) | 2021.04.30 |
---|---|
데이터 수정을 위한 쿼리 준비 (0) | 2021.04.30 |
데이터 입력을 위한 쿼리 준비 (0) | 2021.04.30 |
SQL을 잘 해야하는 이유 (0) | 2021.04.30 |
레코드의 모든 컬럼 출력하기 (1) | 2021.04.29 |