230126 SQL/JAVA

kangjuju·2023년 1월 26일
0

Acorn

목록 보기
9/15

JAVA에서의 SQL commit

자바는 SQL에 관해 기본적으로 auto commit이다.
transaction이 자동으로 시작하고 끝난다는것.

<자료 추가. 자바는 기본으로 auto commit>
String isql = "insert into sangdata values(6,'지갑',10,40000)";
stmt.executeUpdate(isql)

하지만 transaction을 자동으로 처리하면 잘못된 데이터가 DB에 저장되어 버릴수도 있기때문에 수동으로 처리하는것이 바람직하다.

conn.setAutoCommit(false); <auto commit 해제>
String isql = "insert into sangdata values(8,'책가방',11,42400)";
stmt.executeUpdate(isql); <transaction 시작>
conn.rollback();
conn.commit();  <transaction >
conn.setAutoCommit(true);  <데드락방지를 위해 다시켬>

기본적인 DML언어는 Connection 인터페이스에서 다룬다.

Connection -> Statement -> ResultSet 순으로 쿼리작성과 연결,실행,결과접근이라고 보면된다.

<자료 수정>
String usql = "update sangdata set sang = '물티슈', su=7 where code = 1";
int re = stmt.executeUpdate(usql);  <insert는 성공하면 1, 실패하면 0  반환한다.>
if(re>0) System.out.println("수정 성공");
else System.out.println("수정실패");

Prepared Statement

  • SQL문장이 미리 컴파일되고, 실행 시간동안 인수 값을 위한 공간을 확보할 수 있다는 점에서 Statement 객체와 다르다.
  • Statement 객체의 SQL은 실행될 때, 매번 서버에서 분석해야하는 반면
    PreparedStatement 객체는 한 번 분석되면 재사용이 용이하다.
  • 각각 인수에 대해 위치홀더(placeholder)를 사용하여 SQL문장을 정의할 수 있게 해준다.
    위치 홀더는 ? 로 표현된다.
  • 동일한 SQL문을 특정 값만 바꾸어서 여러번 실행해야 할 때, 인수가 많아서 SQL 문을 정리해야 될 필요가 있을 때 사용하면 유용하다.

사용법,예제

앞에서 사용했던 Statement stmt는 sql문 작성 후 뒤에 받을 정보를 문자열 더하기 연산으로 완성시켜 실행했다. 이는 SQL Injection 공격에 취약하다.

<[해킹] 이러한 문법은 SQL인젝션 공격에 취약함>
sql = "select * from sangdata where code =" + bun;  <!>
pstmt = conn.prepareStatement(sql); 
rs = pstmt.executeQuery();  

Prepared Statement의 용도는 많지만, 이러한 취약점을 대응 할 수 있는 "?"연산자를 사용할 수 있기도 하다.

sql = "select * from sangdata where code = ?";  <prepare기능 [?]연산자>
pstmt = conn.prepareStatement(sql); 
pstmt.setString(1,bun);
rs = pstmt.executeQuery();

pstmt.setString 에서 첫번째 ?에 bun을 대입하라는 문법.

?연산자로 sql 테이블 삽입,삭제,갱신도 해보았다.

<java-insert>

String isql = "insert into sangdata values(?,?,?,?)";
pstmt = conn.prepareStatement(isql);
pstmt.setString(1, "10");
pstmt.setString(2, "베이컨");
pstmt.setInt(3, 21);   //정수형은 setInt
pstmt.setString(4, "4000");
int re = pstmt.executeUpdate(isql);
if(re == 1) {
	System.out.println("추가 성공");
}else {
	System.out.println("추가 실패");
}
<java-update>

String usql = "update sangdata set sang=? , su=?,dan=? where code = ?";
pstmt = conn.prepareStatement(usql);
pstmt.setString(1,"샐러드");
pstmt.setString(2,"33");
pstmt.setString(3,"5000");
pstmt.setString(4,"10");

int re = pstmt.executeUpdate();
if(re == 1) {
	System.out.println("수정 성공");
}else {
	System.out.println("수정 실패");
}
<java-delete>

String dsql = "delete from sangdata where code = ?";
pstmt = conn.prepareStatement(dsql);
pstmt.setString(1,"10");
int re = pstmt.executeUpdate();
if(re == 1) {
	System.out.println("삭제 성공");
}else {
	System.out.println("삭제 실패");
}

reference : https://noirstar.tistory.com/264
velog.ioa/@ragnarok_code/DataBase-Statement%EC%99%80-Prepared-Statement-%EC%B0%A8%EC%9D%B4%EC%A0%90

0개의 댓글