Department of Computer Software MyongJi University 데이터베이스 프로그래밍 Department of Computer Software MyongJi University 정보통신진흥원 데이터베이스 프로그래밍 강의교안 참조
데이터베이스 연결
JDBC와 데이터베이스 연결 JDBC 를 이용하여 데이터베이스에 연결하는 방법 DriverManager DataSource URL을 이용하여 특정 드라이버를 로딩하여 사용 DataSource JDBC 2.0 Optional Package 에서 등장한 방법 어플리케이션에 투명한 개발 가능(연결 상세사항을 캡슐화) ConnectionPoolDataSource XADataSource
드라이버 Driver 클래스 Driver 클래스 예 모든 드라이버는 java.sql.Driver를 implement한 Driver 클래스를 제공해야 한다. DriverManager 클래스에 등록되며 관리된다. Driver 클래스 예 Oracle : oracle.jdbc.driver.OracleDriver MySQL : org.gjt.mm.mysql.Driver Mini-SQL : com.imaginary.sql.msql.MsqlDriver ODBC : sun.jdbc.odbc.JdbcOdbcDriver
DriverManager(1) DriverManager 클래스 데이터베이스 드라이버(MySQL, Oracle 등)를 관리. Connection을 요구하는 URL을 처리할 수 있는 드라이버를 찾아서 Connection을 얻어준다.
DriverManager(2) DriverManager 클래스 중요 메소드 public static void registerDriver (Driver driver) throws SQLException 사용 가능한 드라이버 세트에 드라이버를 등록하고, 드라이버가 로딩될 때 무조건 호출된다. public static Connection getConnection (String url, String user, String pw) throws SQLExcpetion 클라이언트가 Connection 을 구할 때 호출한다. DriverManager 는 드라이버 세트에서 사용되는 해당 드라이버를 찾은 후에 그 드라이버의 Connection 객체를 리턴한다.
DriverManager와 데이터베이스 연결(1) 1) JDBC 드라이버 로딩 Class.forName(“JDBC 드라이버명”); 또는 DriverManager.registerDriver(“JDBC 드라이버명”); 2) JDBC 드라이버를 이용한 데이터베이스 연결 Connection con = DriverManager.getConnection (“JDBC URL”,” 사용자 계정”, “비밀번호”); JDBC URL = jdbc:<subprotocol>:<subname>
DriverManager와 데이터베이스연결(2) 예 : 오라클의 경우 1) JDBC 드라이버 로딩 Class.forName(“oracle.jdbc.driver.OracleDriver”); 또는 DriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver()); 2) JDBC 드라이버를 이용한 데이터베이스 연결 thin 드라이버의 경우 Connection con = DriverManager.getConnection (“jdbc:oracle:thin:@serverName:1521:SID”,” 사용자 계정”, “비밀번호”); serverName : 예) db.sd.ac.kr SID : 예) ora9
SQL 처리
Statement 객체로 SQL 명령문 실행(1) 생성 전진과 읽기만 가능한 ResultSet 생성 Statement stmt = con.createStatement(); 스크롤과 수정 가능한 ResultSet 생성 createStatment 내에 옵션 지정 스크롤 옵션 TYPE_FORWARD_ONLY(디폴트) TYPE_SCROLL_INSENSITIVE TYPE_SCROLL_SENSITIVE 동시성 옵션(다른 트랜잭션의 수정에 영향을 받는지 여부) CONCUR_READ_ONLY CONCUR_UPDATABLE :
Statement 객체로 SQL 명령문 실행(2) ResultSet executeQuery(String sql) SQL 문 중 select문만 가능 select를 통해 추출한 값들을 Resultset형태로 리턴 예 Statement stmt = con.createStatement(); String sql = “select * from enroll”; ResultSet rs = stmt.executeQuery(sql); Int executeUpdate(String sql) SQL 문 중 select문 이외의 SQL 명령문 명령문이 영향을 끼친 row 개수(변경 개수)를 리턴 String sql = “insert into enroll (s_id,c_id,c_id_no,e_year,e_semester) values (‘123’,’C400’,3,2004,1)”; Int res = stmt.executeUpdate(sql);
Statement 객체로 SQL 명령문 실행(3) 실행(Cont’d) boolean execute(String sql) 모든 종류의 SQL문 첫번째 결과가 ResultSet이면 true, 결과가 없거나 변경 개수이면 false 리턴 실행 후, 결과에 따라 다음 명령문 추가 실행 ResultSet getResultSet() Int getUpdateCount() 예 if (stmt.execute(query) == false) { int num = stmt.getUpdateCount(); System.out.println(num + “ rows affected”); } else { ResultSet rs = stmt.getResultSet(); /* print rs */ }
ResultSet 객체로 데이터 가져오기(1) 데이터 베이스 질의에 의해 얻어진 데이터의 로우(row)를 대표하는 오브젝트 주요 메소드 결과값의 컬럼에 해당하는 정보를 얻기 위해 일련의 메소드 제공 데이터를 한번에 하나씩 처리하므로 next()로 결과값의 다음 행 지정
ResultSet 객체로 데이터 가져오기(2) 명시된 데이터 타입으로 컬럼 데이터 가져오기 xxx getXxx(String columnName) 예: resultSet.getInt(“StoreID”) xxx getXxx(int columnPosition) 이 때, columnPosition값은 0이 아니라 1로 시작 예 : resultSet.getInt(1);
ResultSet 객체로 데이터 가져오기(3) 널(NULL)값 처리하기 널 값은 주어진 컬럼에 대한 어떤 데이터도 정의되어 있지 않다는 것을 나타냄 컬럼 데이터가 널 값인 경우에 getXXX() 메소드를 호출할 때 리턴 값 오브젝트를 리턴하는 메소드 : java null 숫자를 리턴하는 메소드 : 0 getBoolean() : false 널 값 처리 방법 (널 값 유무 확인) JDBC 메소드 사용 : wasNull() 메소드 호출 SQL문 사용 : 조건 절에서 널 값 유무 확인
ResultSet 객체로 데이터 가져오기(4) 자바 데이터 타입과 SQL 데이터 타입의 맵핑 SQL 타입 자바 타입 BIT boolean DATE java.sql.Date TINYINT byte TIME java.sql.Time SMALLINT short TIMESTAMP java.sql.Timestamp INTEGER int BINARY byte[] BIGINT long VARBINARY REAL float LONGVARBINARY FLOAT double BLOB java.sql.Blob DOUBLE CLOB java.sql.Clob NUMERIC java.math.BigDecimal ARRAY java.sql.Array CHAR java.math. BigDecimal REF java.sql.Ref VARCHAR java.lang.String STRUCT java.sql.Struct LOGVARCHAR
ResultSet 객체로 데이터 가져오기(5) next() 메소드 처음 호출하는 경우 : 커서를 처음 행에 위치 처음 호출하는 것이 아닌 경우 : ResultSet을 한번에 한 행씩 전진 이동 스크롤 가능한 ResultSet의 경우는 next()이외에도 다양한 이동 방법이 존재 previous(), first(), last(), absolute(), relative() moveToInsertRow(), moveToCurrentRow()
트랜잭션 JDBC에서의 트랜잭션 데이터베이스 처리의 논리적 단위로 함께 실행되는 하나이상의 Statement JDBC에서는 어떤 방식으로 Connection 객체를 생성하더라도 AutoCommit 모드를 on 시킴 AutoCommit 모드(디폴트) 각 SQL 문장이 트랜잭션으로 간주됨 각 트랜잭션은 실행된 후 바로 커밋됨 2개 이상의 statement를 하나의 트랜잭션으로 그룹시키는 방법 AutoCommit모드를 off로 셋팅한 후 사용 예) Connection conn = DriverManger.getConnection(); Conn.setAutoCommit(false); … If (<executed-transaction---successfully>) conn.commit(); else conn.rollback();
JDBC Example (1) import java.sql.*; import oracle.jdbc.driver.*; class JDBCVersion { public static void main (String args[]) throws SQLException // Load the Oracle JDBC driver DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:oraclets","scott","tiger"); // // Create Oracle DatabaseMetaData object DatabaseMetaData meta = conn.getMetaData(); // gets driver info: System.out.println("JDBC driver version is " + meta.getDriverVersion()); }
JDBC Example (2) import java.sql.*; import java.io.*; class SQLExample { public static void main(String[] args) throws SQLException, IOException System.out.println("Hello World!"); Connection myConn = null; Statement stmt = null, mySQL = null; DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
myConn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:oraclets","scott","tiger"); stmt = myConn.createStatement(); ResultSet myResultSet = stmt.executeQuery("select ename from emp"); while ( myResultSet.next() ) System.out.println(myResultSet.getString(1)); stmt.close(); myConn.close(); }