구리

TIL_210406_Statement, PreparedStatement 본문

DataBase

TIL_210406_Statement, PreparedStatement

guriguriguri 2021. 4. 8. 21:55

PreparedStatement Class

Statement 클래스와 다르게 객체 생성시 쿼리문을 함께 삽입하며 쿼리문 내부변수가 대입될 때는 

Statement가 아닌 PreparedStatement Class를 사용한다 

 

 

Statement, PreparedStatement 클래스 사용법 차이

<Statement>
Connection con = DriverManager.getConnection("url", "사용자 id", "사용자 pwd");
Statement stmt = con.createStatement();
String query = "select * from localoil";
ResultSet total = stmt.executeQuery(query);

<PreparedStatement>
 String query = "원하는 쿼리문";
PreparedStatement pstmt = con.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();

 

int executeUpdate()

업데이트된 문장수를 반환하며 자바에서 오라클 삽입/수정/삭제 쿼리 요청한 후 해당 메서드 호출하면 

오라클은 해당 쿼리 실행후 자동 commit ( 데이터 추가, 수정, 삭제시 사용)

ResultSet executeQuery()

select 쿼리문 실행시 결과를 반환한다 (데이터 검색시 사용)

 

 

※ 두가지 메서드는 모든 '쿼리문'을 문자열로 전달받기에 eclipse 내에서는 문법 오류가 발생하지 않지만

자바 실행시 오류 발생할 수도 있다

 

 

Statement 예제 

"delete from gas_station"; 을 자바에서 오라클로 실행요청할경우

String queryDelete = "delete from gas_station";
int n = stmt.executeUpdate(queryDalete); (명령어가 delete이므로 삭제된 문장수 반환)

if(n>0) {
    print("삭제성공!"); }
else {
    print("삭제실패!");
}


 

PreparedStatement 예제

String k ="Y";
String query = "select * from gas_station where=?";
(쿼리문 내부 자바 변수가 와야할 자리에 ? 처리)

PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setString(1,k);        // setString(몇번째 물음표, 원하는 변수) : ?자리에 변수 대입하여 쿼리 실행 

ResultSet rs = pstmt.executeQuery();

======================================================================

String s1 = "서울주유소";
String s2 = "서울 강남구";
String s3 = "s-oil";
String s4 = "02-555-1234";
String s5 = "N";
int n1 = 1764;
int n2 = 1500;


String qurey = "insert into gas_station vaules (?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(query);

pstmt.setString(1,s1);
pstmt.setString(2,s2);
pstmt.setString(3,s3);
pstmt.setString(4,s4);
pstmt.setString(5,s5);
pstmt.setInt(6,n1);
pstmt.setInt(7,n2);

int n = pstmt.executeUpdate();
if(n>0){
   print("삽입성공!");
}else{
   print("삽입실패");
}


 

SQL 관련 예제

1. best_sandwiches_list_chicago_price_address.xls 읽어서 

   오라클에 저장 (Rank, Cafe, Menu, Price, Address)

 

2. 이미지 파일명을 저장 (30, 34 => default.jpg)

   오라클에 저장 (이미지.jpg)

  오라클 : rank, cafe, menu, price, addr, img <== 필드명

 

3. 저장된 데이터를 html 로 출력 (10행 5열)

 

직접 짠 코딩과 설계도

package com.bjy.db;

public class CafeClass {
	private int rank = 0;
	private String cafe = "";
	private String menu = "";
	private float price = 0;
	private String address = "";
	private String img = "";
	
	public CafeClass() {
		
	}
	
	public CafeClass(String rank,String cafe,String menu,String price,String address) {
		this.rank = Integer.parseInt(rank);
		this.cafe = this.change(cafe);
		this.menu = this.change(menu);
		this.price = Float.parseFloat(price);
		this.address = this.change(address);
	}
	
	private String change(String s) {
		String n = s.replace("'", "");
		
		return n.replace("&", "and");
	}

	public int getRank() {
		return rank;
	}

	public String getCafe() {
		return cafe;
	}

	public String getMenu() {
		return menu;
	}

	public float getPrice() {
		return price;
	}

	public String getAddress() {
		return address;
	}

	public String getImg() {
		return img;
	}

	public void setImg(String img) {
		this.img = img;
	}
	
	

}
package com.bjy.db;

import java.util.ArrayList;

public class DataClass {

	public static ArrayList<CafeClass> cafes = new ArrayList<CafeClass>();
	
	public DataClass() {
		
	}

}
package com.bjy.files;

import java.io.File;
import java.io.IOException;

import com.bjy.db.CafeClass;
import com.bjy.db.DataClass;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class ExcelReaderClass {

	public ExcelReaderClass() {
		
	}

	public static void readExcel(String uri_excel) {
		DataClass.cafes.clear();
		Workbook wb = null;
		Sheet s = null;
		
		
		File f = new File(uri_excel);
		try {
			wb = Workbook.getWorkbook(f);
			s = wb.getSheet(0);
			Cell[] cells = new Cell[5];
			
			int i = 1;
			while(true) {
				try {
					cells[0] = s.getCell(0, i);
					cells[1] = s.getCell(1, i);
					cells[2] = s.getCell(2, i);
					cells[3] = s.getCell(3, i);
					cells[4] = s.getCell(4, i);
					
					DataClass.cafes.add(new CafeClass(cells[0].getContents(), cells[1].getContents(), cells[2].getContents(), cells[3].getContents(), cells[4].getContents()));
					
					i++;
				}catch(Exception e) {
					System.out.println("엑셀 파일 읽기 완료 ");
					break;
				}
			}
			
		} catch (Exception e) {
			System.out.println("엑셀 읽기 실패 : " + e.getMessage());
		}
		
		
	}
}
package com.bjy.files;

import java.io.File;

import com.bjy.db.DataClass;

public class ImagesReaderClass {

	public ImagesReaderClass() {
		
	}
	
	public static void readImages(String uri_image) {
		File f = new File(uri_image);
		String[] file_name = f.list();
		
		for(int i=0;i<file_name.length;i++) {
			DataClass.cafes.get(i).setImg(file_name[i]);
		}
	}

}
package com.bjy.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class JdbcClass {
	private Connection conn = null;
	private Statement stmt = null;
	private PreparedStatement pstmt = null;
	private ResultSet rs = null;
	
	private final String ORACLE_URI = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
	private final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
	private final String ORACLE_USER = "bjy";
	private final String ORACLE_PWD = "qorwjddus96";
	
	
	

	public JdbcClass() {
		
	}
	
	public void oracleConnect() {
		try {
			Class.forName(this.ORACLE_DRIVER);
			conn = DriverManager.getConnection(this.ORACLE_URI, this.ORACLE_USER, this.ORACLE_PWD);
			System.out.println("오라클 접속 성공 !");
			
		} catch (ClassNotFoundException e) {
			System.out.println("오라클 드라이버 로딩 실패 : " + e.getMessage());
		} catch (SQLException e) {
			System.out.println("오라클 접속 실패 : " + e.getMessage());
		}
	}
	
	public void insertDB() {
		String query = "insert into sandwiches_chicago(rank, cafe, menu, price, address, img) values (?,?,?,?,?,?)";
		ArrayList<CafeClass> cafes = DataClass.cafes;
		
		try {
			
			pstmt = this.conn.prepareStatement(query);
			
			for(int i=0;i<cafes.size();i++) {
				pstmt.setInt(1, cafes.get(i).getRank());
				pstmt.setString(2, cafes.get(i).getCafe());
				pstmt.setString(3, cafes.get(i).getMenu());
				pstmt.setFloat(4, cafes.get(i).getPrice());
				pstmt.setString(5, cafes.get(i).getAddress());
				pstmt.setString(6, cafes.get(i).getImg());
				
				int resultNo = this.pstmt.executeUpdate();
				System.out.println("데이터 삽입 성공! " + i);
			}
			
		}catch(SQLException e) {
			System.out.println("insertDB ERR : " + e.getMessage());
		}
		
	}
	
	public void countDB() {
		String query = "select count(*) from sandwiches_chicago";
		try {
			this.stmt = this.conn.createStatement();
			this.rs = this.stmt.executeQuery(query);
			
			rs.next();
			System.out.println("sandwiches_chicago 테이블 레코드 행 갯수 : " + rs.getString(1));
		} catch (SQLException e) {
			System.out.println("countDB() ERR : " + e.getMessage());
		}
		
	}
	
	public ResultSet selectDB() {
		String query = "select * from sandwiches_chicago";
		ResultSet rs = null;
		
		try {
			this.stmt = this.conn.createStatement();
			this.rs = this.stmt.executeQuery(query);
			rs = this.rs;
			
			return rs;
		}catch(SQLException e) {
			System.out.println("selectDB() ERR : " + e.getMessage());
		}
		return rs;
	}

}
package com.bjy.out;

import java.io.FileWriter;
import java.sql.ResultSet;
import java.sql.SQLException;

public class PrintClass {

	public PrintClass() {
		
	}
	
	public static String makeTags(ResultSet rs) {
		String tags = "";
		int row = 5;
		int column = 10;
		
		
		tags = tags + "<!doctype>";
		tags = tags + "<html>";
		tags = tags + "<head><title>sandwiches_in_Chicago</title></head>";
		tags = tags + "<body>";
		tags += "<table border=1>";
		
		for(int i=0;i<row;i++) {
			tags += "<tr>";
			for(int j=0;j<column;j++) {
				try {
					rs.next();
					tags += "<td>";
					tags += "<table border=1>";   // <table>이라고 하면 줄없이 테이블 생성 <table border=1>로 하면 각 열마다 줄 생성 
					tags += "<tr><th>" + rs.getInt(1) +". "  + rs.getString(2) + "</th></tr>"; // th는 제목
					tags += "<tr><td>" + rs.getString(3) + "</td></tr>";
					tags += "<tr><td><img src='./images/" + rs.getString(6) + "' width='100' height='100' /></td></tr>";
					tags += "<tr><td>$" + rs.getFloat(4) + "</td></tr>"; 
					tags += "<tr><td>" + rs.getString(5) + "</td></tr>";
					
					tags += "</table>";
					tags += "</td>";
					
				} catch (SQLException e) {
					System.out.println("HTML TAGS ERR : " + e.getMessage());
				}
			}
			
			tags += "</tr>";
		}
	
		tags += "</table>";
		tags = tags + "</body>"; // body 닫기
		tags = tags + "</html>";
	
		return tags;
	}
	
	public static void makeHTML(String tags, String uri_HTML) {
		
		FileWriter fw = null;
		
		try {
			fw = new FileWriter(uri_HTML);
			fw.write(tags);
			
		}catch(Exception e) {
			System.out.println("makeHTML() ERR : " + e.getMessage());
		}
	}

}
package com.bjy;

import java.sql.ResultSet;

import com.bjy.db.JdbcClass;
import com.bjy.files.ExcelReaderClass;
import com.bjy.files.ImagesReaderClass;
import com.bjy.out.PrintClass;

public class MainClass {

	public static void main(String[] args) {
		/** 엑셀 문서 읽어서 DataClass.cafes에 저장 **/
		String uri_excel = "c:/filetest/best_sandwiches_list_chicago_price_address.xls";
		ExcelReaderClass.readExcel(uri_excel);

		/** Images폴더의 파일명들 읽어서 DataClass.cafes의 멤버변수 img 변경 **/
		String uri_image = "c:/filetest/images";
		ImagesReaderClass.readImages(uri_image);


		/** 사용자 계정으로 오라클에 접속하는 메서드 실행 **/
		JdbcClass jdbc = new JdbcClass();
		jdbc.oracleConnect();
		
		/** DataClass.cafes의 멤버변수들을 db에 저장 후 db에 데이터 잘 저장되었는지 레코드 행 개수 확인 **/
		// 계속 실행하면 db에 데이터 계속 저장되기에 1번만 실행하고 확인 후 주석 처리 
//		jdbc.insertDB();
		jdbc.countDB();
		
		/** db 정보들 ResultSet 객체로 저장후 반환하여 html 태그 생성 **/
		ResultSet rs = jdbc.selectDB();
		String tags = PrintClass.makeTags(rs);
		
		/** 태그와 html uri 이용해  html 파일 생성**/
		String uri_HTML = "c:/filetest/sandwiches_practice.html";
		PrintClass.makeHTML(tags, uri_HTML);
		
		
		
	}

}
package com.bjy;

import java.sql.ResultSet;

import com.bjy.db.JdbcClass;
import com.bjy.files.ExcelReaderClass;
import com.bjy.files.ImagesReaderClass;
import com.bjy.out.PrintClass;

public class MainClass {

	public static void main(String[] args) {
		/** 엑셀 문서 읽어서 DataClass.cafes에 저장 **/
		String uri_excel = "c:/filetest/best_sandwiches_list_chicago_price_address.xls";
		ExcelReaderClass.readExcel(uri_excel);

		/** Images폴더의 파일명들 읽어서 DataClass.cafes의 멤버변수 img 변경 **/
		String uri_image = "c:/filetest/images";
		ImagesReaderClass.readImages(uri_image);


		/** 사용자 계정으로 오라클에 접속하는 메서드 실행 **/
		JdbcClass jdbc = new JdbcClass();
		jdbc.oracleConnect();
		
		/** DataClass.cafes의 멤버변수들을 db에 저장 후 db에 데이터 잘 저장되었는지 레코드 행 개수 확인 **/
		// 계속 실행하면 db에 데이터 계속 저장되기에 1번만 실행하고 확인 후 주석 처리 
//		jdbc.insertDB();
		jdbc.countDB();
		
		/** db 정보들 ResultSet 객체로 저장후 반환하여 html 태그 생성 **/
		ResultSet rs = jdbc.selectDB();
		String tags = PrintClass.makeTags(rs);
		
		/** 태그와 html uri 이용해  html 파일 생성**/
		String uri_HTML = "c:/filetest/sandwiches_practice.html";
		PrintClass.makeHTML(tags, uri_HTML);
		
		
		
	}

}