Javaチームプロジェクト

46028 ワード

JAVA-DBConnection(JDBC)

● JDBC는 MySQL로 하는것이 아니라 이클립스로 작성
● JAVA에서 db에 접근할 수 있도록 해주는 API를 JDBC라고 한다.
● Java DataBase Connectivity
     ○ 자바에서 데이터베이스에 접속할 수 있도록 해주는 자바 API
● 자바 프로그램이 데이터베이스와 연결되어 데이터를 주고 받을 수 있게 해주는 
  프로그래밍 인터페이스다.
● JDBC의 역할
	○ 통역자 역할 : 응용프로그램과 DBMS간의 통신을 중간에 번역해주는 역할
● java.sql Package 필요하다.
	○ java.sql.Driver
    	■ DB와 연결하는 Driver class를 만들 때 반드시 implements해야 하는
          interface로 JDBC 드라이버의 중심이 되는 interface다.
          
   	○ java.sql.Connection
    	■ 특정 데이터베이스와 연결정보를 가지는 interface입니다.
        ■ DriverManager로 부터 Connection 객체를 가져옵니다.
        
    ○ java.sql.ResultSet
    	■ SELECT구문 실행 결과를 조회할 수 있는 방법을 정의한 interface
        
    ○ java.sql.PreparedStatement
    	■ Statement의 하위 interface입니다.
        ■ SQL문을 미리 컴파일 하여 실행 속도를 높입니다.
        
    ○ java.sql.CallableStatement
    	■ PreparedStatement의 하위 interface입니다.
        ■ DBMS의 Stored procedure을 호출합니다.
        
  • Javaで文字列タイプを使用してSQL文
  • を記述
  • がインストールされたDriverを使用して、接続オブジェクト
  • を作成します.
  • ConnectionオブジェクトによるPreparedStatementオブジェクトの作成(SQL文をスキップ)
  • で作成されたPrepared Statementオブジェクトを使用してSQL文
  • を実行します.
  • SELECT文は検索結果を有するため、ResultSetオブジェクトとして
  • を受信する.
  • 適切な回数のrs.next()で受信するデータがある行
  • を選択する.
  • rs.get~~~()各列のデータを受信
  • JDBC API

     ● Java DataBase Connectivity의 약자로 JDBC는 자바 언어로 데이터베이스 프로그래밍을 하기 위한 라이브러리이다.
     
     ● JDBC는 DBMS에 종속되지 않는 관련 API를 제공한다. JDBC API는 JDK에서 제공하며 JDBC 프로그래밍을 
       위해서는 JDBC드라이버가 필요하다! JDBC 드라이버는 각 DBMS 회사에서 제공하는 라이브러리 압축파일이다. 
       우리는 MySQL 데이터베이스관리시스템을 사용하지만 오라클을 사용한다면 오라클용 JDBC 드라이버가 필요하다.
    *라이브러리 위치	
    	● C:\Program Files (x86)\MySQL\Connector J 8.0 
        

    の手配を


    まずjavaとmysqlは異なるプログラムです.
    Javaがsqlにアクセスするにはjava構築パスを作成する必要があります.
    外部jarファイルを利用してjavaに接続するapiです.
    通常のjarファイルは次のパスにあります.
    C:\Program Files (x86)\MySQL\Connector J 8.0
    mysql-connector-java-8.0.27.jarファイルのインポート
    ファイルを参照するには、「プロジェクト」>「右クリック」>「プロパティ」>「java build path」>「外部JARs」>「jarファイルの追加」を選択し、適用および閉じる
    上記の手順を完了すると、私たちが入れたjarファイルを含む参照ライブラリが私たちのプロジェクトに作成されます.

    設定コードの作成


    dbconnectionのたびに接続コードを記述し、接続し、クエリー文でデータをcrud操作するのは毎回面倒で、私たちのプロジェクトがデータベースが必要なプロジェクトであれば、一度だけ接続する可能性は低いです.
    したがって、オブジェクトをクラスとして作成して使用すると、必要に応じてオブジェクト化をインポートすることがより効率的になります.
    したがって、他のクラスまたはパッケージで参照するためにクラスとして作成します.
    必要に応じてクラスのタイプを決定します.
    ここではまずpublicを用いてclassを生成する.
    public class DBconn{
    	
    }
    次のjavaのsql組み込み型Connectionを使用して変数を作成します.
    次のオブジェクトをプライベートオブジェクトに設定して、他のクラスで使用しないようにし、メソッドを使用してアクセスするためにメソッドを個別に作成します.
    他のパッケージやクラスで使用するために、共通およびグローバルで使用される静的にします.
    public class DBconn{
    	private static Connection conn;
        public static Connection getConnection(){
        	
        }
    }
    次はClassforName()を呼び出し、Driver自身を初期化してDriveManagerに登録します.つまり、開発者と管理されていない静的オブジェクトは、DriverManagerに自分で登録できます.
    パラメータは渡さず、呼び出しのみですが、ここでは対応するjdbcドライバを文字列として記述します.
    また、作成したドライブをtrycatch文として作成し、オブジェクトが参照されていないときにエラーを返す必要があります.
    自動完成で便利です.
    cntl + shift + z
    public class DBconn{
    	private static Connection conn;
        public static Connection getConnection(){
        	try{
            	Class.forName("com.mysql.cj.jdbc.Driver");
                System.out.println("드라이버 로딩성공!");
            }catch(ClassNotFoundException e){
            	System.out.println("실패");
            }
        }
    }
    ドライブが正常にロードされた場合、dbmsにアクセスするコードはMysqlとsqlのアイデンティティパスワードで作成されます.
    driverManagerの組み込み関数getConnectionを使用すると、dbmsのパス、アイデンティティ、パスワードを渡してデータベースにアクセスできます.
    また、trycatch文として接続が作成され、catch文が接続され、SQLExceptionエラーが接続によって返されます.
    次に、getConnection関数を以前に作成したConnectionオブジェクトに挿入します.
    オブジェクトがnullであるかどうかを判断し、接続文を実行するか、データベース接続を含むconnを返すかを決定します.
    import java.sql.Connection;
    
    public class DBconn {
    // DB관련 jar 파일을 build하여 import 시킨 다음
    //	DB와 연결해야 한다ㅣ. 
    //	connection 관련 객체를 담는 static 변수를 private로 담는다. 
    	private static Connection conn;
    //	해당 변수를 실행 시 dbconnection이 되도록 한다.
    	public static Connection getConnection() {
    		if(conn == null) {
    //			conn 객체에 접근하지 않는 경우 아래의 코드를 실행한다.
    			try {
    //				데이터베이스에 접근하는 드라이브를 실행
    				Class.forName("com.mysql.cj.jdbc.Driver");
    				System.out.println("드라이버 로딩성공!");
    				
    				String url = "jdbc:mysql://localhost:3306/web0315";
    				String user = "아이디";
    				String password = "비밀번호";
    // 드라이브메니저의 내장메소드를 이용해 우리가 사용할 dbms정보를 넘겨주고 있다.
    				conn = DriverManager.getConnection(url, user, password);
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}catch(SQLException sqle) {
    				System.out.println("실패");
    			}
    		}
    		return conn;
    	}
    }
    ここに着いたら、データベースを使用する準備ができています.
    使用方法は次のとおりです.
    sql文には、変数、Connectionオブジェクトの初期化、PreparedStatementの初期化が含まれます.
    用意する.
    使用するsql文を作成し、connに作成したDBクラスのメソッドを含めます.
    接続オブジェクトとしてPreparedStatementを使用するconnのPreparedStatementメソッドを使用してsql文を含む
    ここまですれば準備ができている.
    今は使い方次第です.
    私たちはexecuteQueryメソッドを使用してselectを使用し、他のsql文を使用する場合はexecuteUpdateメソッドを使用します.
    この方法を使用した場合は、変数としてresultSetに入れ、持ってきた情報を出力すればよい.
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class DBTest {
    	public static void main(String[] args) {
    		String sql = "";
    		Connection conn;
    		PreparedStatement ps;
    		
    		try {
    			sql = "select * from user";
    			conn = DBconn.getConnection();
    			ps = conn.prepareStatement(sql);
    			
    			ResultSet rs = ps.executeQuery();
    			String [] getdata = {"useridx", "userid",
    					"userpw","username","userage","userphone","useraddr"};
    			while(rs.next()) {
    				String result = "";
    				for (int i = 0; i < getdata.length; i++) {
    					result += rs.getString(i+1) + " / ";					
    				}
    				System.out.println(result);
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    クエリー文で他の変数を使用する場合は?の草案を作る
    ?文字列接続を使用して変数名を作成する必要がある場合、またはsql文に直接「」を含める必要がある場合はsetStringを使用します.executeを使用するように、prepareStatementメソッド付きpsオブジェクト名に貼り付けます.
    // 첫번째 ? 에 strdata 넣어줘
    ps.setString(1, strdata);
    ps.executeUpdate();        

    JDBCによるデータベース連動


    ① JDBC 드라이버 로드
    		
    Class.forName("com.mysql.Jdbc.Driver"); 
    → Class.forName() 메서드를 호출하여, mysql에서 제공하는 Driver 클래스를 
      JVM method area에 로딩시킨다. 
    
    
    ② 데이터베이스 연결
    String jdbc_url = "jdbc:mysql://localhost:3306/datebase?serverTimezone=UTC";
    Connection con = DriverManager.getConnection(URL, "user", "password");
    → 두 번째 줄의 의미는 localhost:3306 (로컬 환경에서 MySQL의 포트번호가 3306이기 때문이다) 
      그리고 database는 스키마 이름을 지정하면 된다. 이제 Connection 객체를 만들어 사용하게 되는데 
      방법은 DriverManager 클래스의 static 메서드인 getConnection() 메서드를 호출해서, 
      mysql에 연결하기 위한 커넥션 정보(url, user, password)를 입력한다.
      getConnection() 메서드 수행 결과로 Connection 객체를 반환하는데, 이 객체를 통해 쿼리를 
      날리는 statement를 작성할 수 있다. SELECT 쿼리에서는 createStatement() , 
      INSERT에서는 prepareStatement()를 호출한다.
      
    
      ※ 스키마란 - 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것
    
    ③ SQL을 위한 객체생성
    	Statement stmt = con.createStatement();
    ④ SQL 문장 실행
    	String sql = "select * from student";
    	ResultSet result = stmt.executeQuery(sql); 
    → select 문장은 테이블 형태의 결과를 반환한다. 그러므로 select 문장을 
      실행하기 위해 Statement의 메소드 executeQuery()를 사용한다. 
      메소드 executeQuery()는 질의 결과로 테이블 형태의 결과를 반환하는데, 
      이 반환형이 인터페이스 ResultSet이다. 객체 Statement의 메소드 executeUpdate()는 create 
      또는 drop, insert, delete, update와 같이 테이블의 내용을 변경하는 문장에 사용한다.
    ⑤照会結果の処理
    	while(result .next()){       
        String name = result .getString(1);
        String owner = result .getString(2);
        String date = result .getString(3);
    }
    → ResultSet 인터페이스에는 질의 결과의 현재 행(row)을 가리키는 커서(cursor)라는 개념이 있으며, 
      이 커서를 다음 행으로 이동시키는 메소드가 next()이다. 
      

    ▲たとえば、上記の結果テーブルの構造があると仮定すると、最初は最初の行を指し、その行が存在する場合はtrueを返し、存在しない場合はfalseを返す.
    ● ResultSet의 메소드 getString()과 getInt() 
    	○ ResultSet의 커서가 있는 행에서 컬럼 자료를 참조하기 위해 ResultSet이 
          제공하는 메소드 getString()을 이용한다. 
        ○ getString()의 인자는 컬럼 이름을 문자열로 쓰거나 또는 컬럼 번호를 이용할 수 있다.
          컬럼 값의 자료유형에 따라 메소드 getString()뿐만 아니라 
          getInt(), getDouble(), getDate() 등 다양한 컬럼 반환 메소드를 제공한다.
          
    ●SELECT照会例
    	import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
     
    public class Example1 {
     
       public static void main(String[] args) {
          // TODO Auto-generated method stub
          
          String jdbc_driver = "com.mysql.cj.jdbc.Driver";
          String jdbc_url = "jdbc:mysql://localhost:3306/board?serverTimezone=UTC";
          try {
              
             Class.forName(jdbc_driver).newInstance();
             Connection con = DriverManager.getConnection(jdbc_url, "root", "root");
             Statement st = con.createStatement();
             
             String sql = "SELECT * FROM member";
             ResultSet rs = st.executeQuery(sql);
     
             while(rs.next()){       
                 String name = rs.getString(1);
                 String owner = rs.getString(2);
                 String date = rs.getString(3);
     
                 System.out.println(name + " " + owner + " " + date);
             }
     
          
             rs.close();
             st.close();
             con.close();    
             
          } catch (Exception e) {
             e.printStackTrace();
          } 
       }
    }
     ● INSERT 쿼리 예제
    	import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
     
    public class InsertTest {
        public static void main(String[] args) {
            // pet 테이블에는 이름/소유자/종/성별/출생일 칼럼이 있습니다.
            insert("봄이", "victolee", "페르시안", "m", "2010-08-21", null);
        }
     
        public static void insert(String name, String owner, String species,
                                  String gender, String birth, String death){
            Connection conn = null;
            PreparedStatement pstmt = null;
     
            try{
                // 1. 드라이버 로딩
                Class.forName("com.mysql.jdbc.Driver");
     
                // 2. 연결하기
                String url = "jdbc:mysql://localhost/dev";
                conn = DriverManager.getConnection(url, "dev", "dev");
     
     
                // 3. SQL 쿼리 준비
                // 추가하려는 데이터의 값은 전달된 인자를 통해 동적으로 할당되는 값이다.
                // 즉 어떤 값이 전달될지 모르므로 Select 할 때와 달리
                // stmt = conn.createStatement(); 를 작성하지 않고
                // pstmt = conn.prepareStatement(sql); 로 작성하여 데이터를 추가할 것임을 알립니다.
                // 물론 sql 쿼리 내에서 + 연산자로 한 줄로 작성할 수 있지만 가독성이 너무 떨어지게 되므로
                // 이 방법을 권합니다.
                String sql = "INSERT INTO pet VALUES (?,?,?,?,?,?)";
                pstmt = conn.prepareStatement(sql);
     
     
                // 4. 데이터 binding
                pstmt.setString(1, name);
                pstmt.setString(2, owner);
                pstmt.setString(3, species);
                pstmt.setString(4, gender);
                pstmt.setString(5, birth);
                pstmt.setString(6, death);
     
     
                // 5. 쿼리 실행 및 결과 처리
                // SELECT와 달리 INSERT는 반환되는 데이터들이 없으므로
                // ResultSet 객체가 필요 없고, 바로 pstmt.executeUpdate()메서드를 호출하면 됩니다.
                // INSERT, UPDATE, DELETE 쿼리는 이와 같이 메서드를 호출하며
                // SELECT에서는 stmt.executeQuery(sql); 메서드를 사용했었습니다.
                // @return     int - 몇 개의 row가 영향을 미쳤는지를 반환
                int count = pstmt.executeUpdate();
                if( count == 0 ){
                    System.out.println("데이터 입력 실패");
                }
                else{
                    System.out.println("데이터 입력 성공");
                }
            }
     
            catch( ClassNotFoundException e){
                System.out.println("드라이버 로딩 실패");
            }
     
            catch( SQLException e){
                System.out.println("에러 " + e);
            }
     
            finally{
                try{
                    if( conn != null && !conn.isClosed()){
                        conn.close();
                    }
                    if( pstmt != null && !pstmt.isClosed()){
                        pstmt.close();
                    }
                }
                catch( SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
  • Insertクエリを実行する場合も、まず接続オブジェクトを取得する必要があります.
  • INSERTは通常、値を動的に割り当てます.したがって、createState()は呼び出されません.prepareState()メソッドは、クエリーを準備する文を表します.
    次にPreparedStatement,pstmtを返します.setString()メソッドで値を動的に割り当てることができます.値を指定した場合、pstmt.INSERTクエリを実行するには、executeUpdate()メソッドを実行します.戻り値は、影響するローの数です.
  • の最後の部分

  • クエリでは、動的割当てが必要な値がある場合はPreparedStatementオブジェクトを使用し、動的割当てが必要でない場合はStatementオブジェクトを使用します.
  • クエリ結果が
  • の場合、executeQuery()メソッドを呼び出してResultSetオブジェクトに含め、クエリ結果がない場合、executeUpdate()メソッドを呼び出して結果値をint型変数に割り当てます.