자바는 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("수정실패");
사용법,예제
앞에서 사용했던 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