hyeongwoo's blog

JDBC 본문

DATABASE

JDBC

toribro 2024. 3. 8. 19:03

JDBC란 자바에서 데이터베이스에 접근할 수 있게 해주는 Programming API이다.

 

위의 드라이버 뿐만아니라 여러가지 드라이버가 더 있다.

MySQL Connector/J Driver 5.1  Type 4  MySQL 5.1 
Java DB 10.5.3.0  Type 4  Java DB 10.5.3.0 
Oracle 11  Type 2 및 Type 4  Oracle 11 
PostgreSQL 8.4  Type 4  PostgreSQL 8.4 
DB2 9.7  Type 2  DB2 9.7 
Sun, DataDirect 4.0  Type 4  Sybase ASE 15 
Sun, DataDirect 4.0  Type 4  DB2 9.7 
Sun, DataDirect 4.0  Type 4  Microsoft SQL Server 2008 
Sun, DataDirect 4.0  Type 4  MySQL 5.1 

 

자바에서는 어떤 DBMS 시스템도 JDBC 드라이버만 있으면 연결이 가능하다.  이유는 자바의  DriverManger클래스에 드라이버에 등록된 DBMS별로 커넥션 객체를 생성 해서 Connection 인터페이스에 연결주기 때문이다. 

 

JDBC 연결하는 방법을 알아보자

  • 개발환경은 이클립스로 한다

1.JDBC 환경 설정이다.

  • 일단  연결할 DBMS jar 파일이 필요하다. 
  • 여기서는 postgresql로 하겠다.

 

postgressql jar파일을 준비한다. 

파일을 다운 받을수있는 링크이다.https://jdbc.postgresql.org/download/

 

Download | pgJDBC

Download Binary JAR file downloads of the JDBC driver are available here and the current version with Maven Repository. Because Java is platform neutral, it is a simple process of just downloading the appropriate JAR file and dropping it into your classpat

jdbc.postgresql.org

 

이클립스 기준으로 

  프로젝트 우클릭->build_path->Add External JARS-> 다운받은 jar파일 추가

 

JDBC의 연결과정을 알아본다.

  1. JDBC Driver등록 :  해당 DBMS가 제공하는 클래스를 등록한다.
    • Class.forName("org.postgresql.Driver");  -> psql드라이버 등록
  2. Connection객체 생성 : DriverManager클래스에서 제공하는 getConnection() 메소드로 Connection 객체를 생성하여 Connection 인터페이스에 연결해준다. getConnection() 메소드에는 DBMS연결 정보가 들어간다.
    • Connection conn=DriverManager.getConnection(" jdbc:postgresql://localhost:5432/데이터베이스명","username","password");

 

JDBCTemplate클래스에 driver 등록메소드와 트랜젝션 처리 메소드, close() 메소드들을 포함시켰다.

public class JDBCTemplate{
	
    //연결 메소드
	public static Connection getConnection(){
            Connection conn=null;
            String url=" jdbc:postgresql://localhost:5432/데이터베이스명";
            try{
                Class.forName("org.postgresql.Driver");
                conn=DriverManager.getConnection(url,"username","password");

            }catch (FileNotFoundException e) {

            }catch (IOException e) {

            }catch (ClassNotFoundException e) {

            }catch (SQLException e) {

            }
            return conn;
     }
     
     //커밋 메소드
     public static void commit (Connection con){
    	 try {
	    	 if(con!=null&&!con.isClosed()) {
	    		con.commit();
	     }
		 }catch (SQLException e) {}
      }
    
    //롤백메소드
     public static  void rollback(Connection con) {
		 try {
    		  if(con!=null&&!con.isClosed()) {
    			  con.rollback();
              }
		}catch (SQLException e) {
			e.printStackTrace();
		}
	 }
    
    
    
    //close()메소드
    public static void close(Statement stmt) {
		
		try {
			 if(stmt!=null&&stmt.isClosed()) {
			    stmt.close();
			}
		}catch (SQLException e) {}
	}
	
	public static void close(ResultSet re) {
		
		try {
			if(re!=null&&!re.isClosed()) {
				re.close();
			}
			
		 } catch (SQLException e) {}
		
	}
	
	public static void close(Connection con) {
		
	    try {
			if(con!=null&&!con.isClosed()) {
				con.close();
			}
		} catch (SQLException e) {}
	}
        
}

 

JDBC의 연결과정이 끝났으면 자바에서 쿼리문을 데이터베이스로 전송해 데이터베이스에서 데이터를 가져오거나 수정한다.

자바에서 데이터베이스로 쿼리문을 전송할때 Statement 인터페이스와 PrepareStatement 인터페이스 2가지를 사용할 수 있다.

Statement 인터페이스

  • 주로 정적인 쿼리문을 전송할때 사용한다.
  • 커넥션 객체가 createStatement()메소드를 이용해 Statement객체를 반환한다.
  • DQL(SELECT)일때는 createQuery()로 쿼리문 실행결과를 ResultSet 객체로 반환하고 DML(INSERT,UPDATE,DELETE)문일때는 executeUpdate()로 쿼리문실행여부를  int형으로 반환한다.

PreparedStatment 인터페이스

  • 동적인 쿼리문을 전송할때 사용한다.
  • SQL문에 필요한 인수값을 ?로 지정해 실행시간에 값을 지정하게한다.
  • Statement인터페이스는 쿼리문을 서버에서 매번 분석해야하는 반면 PreparedStateMent는 컴파일 시점에 SQL문을 미리 지정해놓고 재사용이 가능하다.
  • Statement인터페이스와 마찬가지로 DQL(SELECT)일때는  executeQuery()로 쿼리문 실행결과를 ResultSet 객체로 반환하고 DML(INSERT,UPDATE,DELETE)문일때는  executeUpdate()로 쿼리문실행여부를 int형으로 반환한다.

 

쿼리문을 실행시킨후 데이터베이스의 결과값을 받을때는 DQL은 ResultSet으로 쿼리문의 결과값을 받고 next()를 이용해 쿼리문의 값을 가져와 저장한다.

DML은 쿼리실행결과를 int형으로 받고 쿼리가 성공적으로 실행되면 commit을 해주고 실패하면 rollback을 해주는 트랜젝션 처리를 해준다. 1이면 성공 0이면 실패이다.

public class TestDao{

	public int TestStateMent(){
           Connection conn = JDBCTemplate.getConnection();
           String sql= "UPDATE TEST SET NAME=홍길동 WHERE NAME = 임꺽정" ;

           try{
               Statement stmt =conn.createStatement();
               int result=stmt.executeUpdate(sql)

            }catch (SQLException e) {

            }finally {
                JDBCTemplate.close(pstmt);
                JDBCTemplate.close(conn);
            }

            return result;
    }
    
    
    public int TestPreparedStateMentUpdate(){
           Connection conn = JDBCTemplate.getConnection();
           String sql= "UPDATE TEST SET NAME=? WHERE NAME = ?";

           try{
               PreparedStatement pstmt =conn.PreparedStatement(sql);
               pstmt.setString(1,"홍길동");
               pstmt.setSTring(2,"임꺽정");
               int result=stmt.executeUpdate()

               if(result>0){ //성공
                    JDBCTemplate.commit();
               }else{//실패
                    JDBCTemplate.rollback();
               }

            }catch (SQLException e) {

            }finally {
                JDBCTemplate.close(pstmt);
                JDBCTemplate.close(conn);
            }
            return result;
    }
    
    
       public int TestPreparedStateMent(){
           Connection conn = JDBCTemplate.getConnection();
           PreparedStatement pstmt=null;
           ResultSet rst=null;
           int age=0;

           String sql= "SELECT AGE FROM TEST WHERE NAME=?";

           try{
               pstmt =conn.PreparedStatement(sql);
               pstmt.setString(1,"홍길동");
               rst=stmt.executeQuery();

               if(rst.next()){
                  age=rst.getInt("AGE");
               }
               System.out.println(age);


            }catch (SQLException e) {

            }finally {
                JDBCTemplate.close(rst);
                JDBCTemplate.close(pstmt);
                JDBCTemplate.close(conn);
            }

            return age;
    }
    
    
    
    


}

 

. 다 사용한 JDBC용 객체는 반드시 자원을 반납해준다. =>JDBC관련된 객체 생성 역순으로 close()를 진행해준다.

 

 

 

 

 

 

 

 

'DATABASE' 카테고리의 다른 글

관계형 데이터베이스  (0) 2024.03.07
데이터베이스 관리시스템(DBMS)  (0) 2024.03.07
데이터베이스  (0) 2024.03.07