2019. 4. 9. 17:40ㆍJAVA
-------------------------------------java와 sql 연결하기-------------------------------------
1. 자바와 sql을 연결할려면 jdbc driver(jdbc api)를 설치해야한다.
(오라클을 설치하면 자동적으로 같이 설치된다.)
2. 연결할 자바 프로젝트에 Build Path -> config Build Path -> Add External JARs 로 아래경로의 jar을 추가한다.
※. C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar
/////////////////////////////////insert into
JDBC 코딩 절차
1. JDBC 드라이버 메모리에 로딩
Class.ForName("완전한 클래스이름");
* Class.forName() 메소드응 지정된 클래스이름의 클래스 (설계도)를
JVM 메모리의 설계도 영역에 로딩시킨다.
* 드라이버 레지스트리에 Oracle JDBC Driver를 등록시키는 정적코드 블록이
자동으로 실행된다.
// JDBC 드라이버 로딩
Class.forName("oracfle.jdbc.OracleDriver");
1). OracleDriver.class 파일이 설계도 영역에 로딩된다.
2). OracleDriver.class의 정적코드 블록이 자동으로 실행된다.
3). JVM의 드라이버레지스트리에 오라클 JDBC 드라이버를 등록한다.
2. Database와 연결을 유지하는 Conection객체 획득하기
String url = "jdbc:oracle:thin:@localhost:1521:xe";
//-드라이버의이름-:-드라이버의 위치-
String user = "hr";
String password = "zxcv1234";
Connection connection = DriverManager.getConnection(url, user, password);
* url : 연결할 Database를 식별하기 위한 url
"jdbc:oracle:thin" -> 드라이버 레지스트리에 등록된 Oracle JDBC Driver의 명칭
"localhost" -> Database가 설치된 PC
"1521" -> Database가 점유하고 있는 포트번호
"xe" -> Database의 식별자
* DriverManager는 드라이버 레지스트리를 관리하는 기능을 지원하는 클래스다.
* DriverManager의 getConnection() 메소드를 사용하면 지정된 URL이 가르키는 Database와
연결을 유지하는 Connection객체가 획득된다.
3. 실행할 SQL을 Database로 전송/실행하는 PrepareStatement 객체 획득하기
// 3. 실행할 쿼리 정의
String sql = "insert into user_contacts"
+"(user_no, user_name, user_phone, user_create_date)"
+"values"
+"(?, ?, ?, sysdate)"; // 값이 무엇이 들어갈지 몰라 ?를 쓰고 값에만 ?를 쓸수있다.
// 4. 쿼리를 데이터베이스로 전송하는 PreparedStatement객체 획득하기
PreparedStatement pstmt = connection.prepareStatement(sql);
// 5. PreparedStatment의 setXXX (인덱스, 값) 메소드를 사용해서 ?와 치환될 값 설정하기
pstmt.setInt(1, 100);
pstmt.setString(2, "홍길동");
pstmt.setString(3, "010-1111-1111");
* PreperedStatment는 쿼리와 값을 데이터베이스로 전송한다.
* PreperedStatment가 사용하는 쿼리에 ?가 있으면 setXXX(순서, 값)를 사용해서
?와 치환될 값을 설정해야 한다.
예시) 보기
4. 쿼리 실행하기
// 6. 쿼리 실행
int rowCount = pstmt.executeUpdate();
System.out.println(rowCount + "개의 행이 추가되었습니다.");
* int executeUpdate() 메소드는 INSER, UPDATE, DELETE 구문을 실행할 때 사용한다.
* executeUpdate() 메소드가 반환하는 값은 추가된 행의 갯수, 삭제된 행의 갯수
혹은 변경된 행의 갯수다.
5. 자원(Connection, PreparedStatement) 해제하기
// 7. 자원해제
pstmt.close();
connection.close();
// 꼭 해제해줘야함
JAVA와 SQL 연결하여 쿼리실행 - 전체 코딩
Scanner 입출력을 만든다음 아래처럼 설정하면 입력값이 들어간다.
Scanner sc = new Scanner(System.in);
System.out.println("주소록 등록 프로그램");
System.out.print("순번 입력 > ");
int no = sc.nextInt();
System.out.print("이름 입력 > ");
String name = sc.next();
System.out.print("연락처 입력 > ");
String phone = sc.next();
////////////////////////////////////////delete
delete는 insert into와 거의 같지만 String sql 문의 sql문이 다르다.
또한 삭제이기 때문에 .setString 및 .setInt를 안써도 된다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class DeleteDemo {
public static void main(String[] args) throws Exception {
String sql ="delete from user_contacts where user_name = ?";
Class.forName("oracle.jdbc.OracleDriver");
// 또한 DriverManager도 한번에 다 작성이 가능하다.
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "zxcv1234");
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "김유신");
int rowCount = pstmt.executeUpdate();
System.out.println(rowCount + "개의 행이 삭제되었습니다.");
pstmt.close();
connection.close();
}
}
///////////////////////////////////////update
update 또한 insert into와 다 똑같고 String sql만 다르게 작성하면 된다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;
public class UpdateDemo {
public static void main(String[] args) throws Exception {
String sql = "update user_contacts "
+ "set "
+ "user_name = ?, "
+ "user_phone = ? "
+ "where user_no = ? ";
Scanner sc = new Scanner(System.in);
System.out.print("수정할 사용자 번호 입력 > ");
int no = sc.nextInt();
System.out.print("수정할 사용자 이름 입력 > ");
String name = sc.next();
System.out.print("수정할 사용자 연락처 입력 > ");
String phone = sc.next();
Class.forName("oracle.jdbc.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "zxcv1234");
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, phone);
pstmt.setInt(3, no);
int rowCount = pstmt.executeUpdate();
System.out.println(rowCount + "개의 행이 변경되었습니다.");
pstmt.close();
connection.close();
}
}
///////////////////////////////select
select문을 java에서 실행할경우 특징
- 기존 insert, delete, update대 사용된 executeUpdate()를 select경우 executeQuery()로 쓴다.
- ResultSet 메소드를 사용해서 커서를 이동하는데 next() 를 이용하여 이동한다.
또한 커서위치에서만 데이터를 조회할 수 있다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class SelectDemo {
public static void main(String[] args) throws Exception {
String sql = "select * from user_contacts";
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "zxcv1234");
PreparedStatement pstmt = conn.prepareStatement(sql);
// 기존 insert, delete, update대 사용된 executeUpdate()를 select경우 executeQuery()로 쓴다.
ResultSet rs = pstmt.executeQuery();
//ResultSet 메소드를 사용해서 커서를 이동하는데 next() 를 이용하여 이동한다.
// 또한 커서위치에서만 데이터를 조회할 수 있다.
// 데이터가 있으면 true 없으면 false로 나옴
// System.out.println(rs.next()); //true
// System.out.println(rs.next()); //true
// System.out.println(rs.next()); //true
// System.out.println(rs.next()); //false
// 데이터가 있을경우 계속 출력
while(rs.next()) {
int no = rs.getInt("user_no");
String name = rs.getString("user_name");
String phone = rs.getString("user_phone");
System.out.println(no+", "+name+", "+phone);
}
rs.close();
pstmt.close();
conn.close();
}
}