Java 16日目


15日目は先生と学生の病気のため、午前中の授業しか受けられず、内容がなかったので、15、16日目に学んだ内容を整理したいと思います.来週HTML/CSSレッスンを行うことになりましたが、最近はネットワーク+java+DBに接続する部分を勉強しています.DBとJavaを一緒に接続することは可能ですが、ネット+Javaはちょっと難しいようです.慣れていないせいか、複雑すぎます

PreparedStatementインタフェース

  • 接続オブジェクトのPreparedStatement()メソッドを使用して生成されます.このメソッドでは、パラメータとしてSQL文を含むStringオブジェクトが必要です.Statementオブジェクトとの違いは、SQL文を事前にコンパイルし、実行時にパラメータ値にスペースを残すことです.
  • ステータスオブジェクトのSQLの利点は、実行するたびにサーバ上で分析する必要があり、PreparedStatementオブジェクトは一度分析するだけで再利用できることです.
  • 同じSQL文を複数回実行する必要がある場合、変数が多すぎてSQL文をクリーンアップする必要がある場合に便利です.
  • 状態はセキュリティ上の弱点があるため、予め用意された状態を使用することを推奨する.
  • 欠点:コードが長くなります.
    statement 방법)
    String sql = "INSERT INTO tb_member(컬럼...) VALUES (값1, 값2,...)";
    stmt.executeUpdate(sql);
    
    
    PreparedStatement 사용 방법)
    String sql = "INSERT INTO tb_member(컬럼...) VALUES (?,?...)"; // 컬럼의 갯수만큼 ?를 사용해준다. 
    // ?는 변수 처리
    pstmt = conn.prepareStatement(sql); // 컴파일만 시킨다.
    pstmt.setString(1,1);
    pstmt.setString(2,2);
    ...
    pstmt.executeUpdate(); // 실행

    練習問題


    Q.ライブラリ作成プログラム

    DBconn.java

    /*
        DB 연결 메소드
     */
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class DBconn {
    
        public static  Connection conn;
    
        public static Connection getConnection() throws SQLException, ClassNotFoundException {
            String url = "jdbc:mysql://127.0.0.1/jcp?useSSL=false";
            String userid = "DB 이름";
            String userpw = "DB 비밀번호";
    
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, userid, userpw);
            return conn;
        }
    
        public  static void dbclose(){
            try {
                conn.close();
                conn = null;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    VocaDTO.java

    public class VocaDTO {
        private int idx;
        private String eng;
        private String kor;
        private int level;
        private String rdate;
    
        public VocaDTO() {
        }
    
        public VocaDTO(int idx, String eng, String kor, int level, String rdate) {
            this.idx = idx;
            this.eng = eng;
            this.kor = kor;
            this.level = level;
            this.rdate = rdate;
        }
    
        public int getIdx() {
            return idx;
        }
    
        public void setIdx(int idx) {
            this.idx = idx;
        }
    
        public String getEng() {
            return eng;
        }
    
        public void setEng(String eng) {
            this.eng = eng;
        }
    
        public String getKor() {
            return kor;
        }
    
        public void setKor(String kor) {
            this.kor = kor;
        }
    
        public int getLevel() {
            return level;
        }
    
        public void setLevel(int level) {
            this.level = level;
        }
    
        public String getRdate() {
            return rdate;
        }
    
        public void setRdate(String rdate) {
            this.rdate = rdate;
        }
    
        @Override
        public String toString() {
            return "idx : " + idx + " eng : " + eng + " kor : " + kor + " level : " + level + " rdate : " + rdate;
        }
    }

    VocaDAO.java

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.Scanner;
    
    public class VocaDAO {
        Connection conn;
        Scanner sc;
        StringBuilder sql;
        PreparedStatement pstmt;
        ResultSet rs; // 참조변수
    
        public void insert() {
            sc = new Scanner(System.in);
            System.out.print("추가할 단어를 입력하세요 >> ");
            String eng = sc.next();
            System.out.print("단어의 뜻을 입력하세요 >> ");
            String kor = sc.next();
            System.out.print("레벨을 입력하세요 >> ");
            int level = sc.nextInt();
            try {
                conn = DBconn.getConnection();
                sql = new StringBuilder();
                sql.append("INSERT INTO tb_word(w_eng, w_kor, w_level) VALUES (?,?,?)");
                pstmt = conn.prepareStatement(sql.toString());
                pstmt.setString(1, eng);
                pstmt.setString(2, kor);
                pstmt.setInt(3, level);
                int result = pstmt.executeUpdate();
                if (result >= 1) System.out.println("단어 등록 성공!");
                else System.out.println("단어 등록 실패! ");
    
                DBconn.dbclose();
                pstmt.close();
                pstmt = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        public void list() {
            try {
                conn = DBconn.getConnection(); // DB 연결
                sql = new StringBuilder(); // 문자열을 저장할 Builder 만들기
                sql.append("SELECT w_eng , w_kor , w_level, w_datetime FROM tb_word ORDER BY w_eng asc");
                pstmt = conn.prepareStatement(sql.toString()); // sql 구문을 넣어 컴파일하여 conn 안에 prepareStatement 실행
                rs = pstmt.executeQuery(); // resultSet 반환
                while (rs.next()) { // next를 하면 한 줄 아래로 내려감
                    String eng = rs.getString("w_eng"); // 커서가 첫번째 데이터를 가르키게 된다. 거기서 rs.getString에서 w_eng 컬럼을
                    // 가져오게 된다. eng에 가져온 데이터를 저장하게 된다.
                    String kor = rs.getString("w_kor");
                    int level = rs.getInt("w_level");
                    String datetime = rs.getString("w_datetime");
                    System.out.println(eng + " : " + kor + " (" + level + ", " + datetime + ")");
                }
                DBconn.dbclose(); // 참조변수 없애기
                pstmt.close();
                pstmt = null;
                rs.close();
                rs = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void search() {
            sc = new Scanner(System.in);
            System.out.print("검색할 단어를 입력하세요 >> ");
            String word = sc.next();
            try {
                boolean isFind = false;
                conn = DBconn.getConnection(); // DB 연결
                sql = new StringBuilder();
                sql.append("SELECT w_eng, w_kor, w_level, w_datetime from tb_word where w_kor =?"); // w_kor에 대한 전체 내용 출력
                pstmt = conn.prepareStatement(sql.toString()); // 컴파일시켜서 pstmt를 만들어서
                pstmt.setString(1, word); // ?에 들어갈 단어를 입력
                rs = pstmt.executeQuery(); // rs로 출력
    
    //            if(!rs.next()){ // 이렇게 하면 하나만 출력하게 된다.
    //                System.out.println("찾는 단어가 없습니다.");
    //            }else {
    //                String eng = rs.getString("w_eng"); // 커서가 첫번째 데이터를 가르키게 된다. 거기서 rs.getString에서 w_eng 컬럼을
    //                // 가져오게 된다. eng에 가져온 데이터를 저장하게 된다.
    //                String kor = rs.getString("w_kor");
    //                int level = rs.getInt("w_level");
    //                String datetime = rs.getString("w_datetime");
    //                System.out.println(eng + " : " + kor + " (" + level + ", " + datetime + ")");
    //            }
    
                // rs.next를 하게 되면 커서가 다음으로 넘어가게 된다.
                while (rs.next()) { // 이렇게 하면 여러개가 출력되고
                    isFind = true;
                    String eng = rs.getString("w_eng");
                    String kor = rs.getString("w_kor");
                    int level = rs.getInt("w_level");
                    String datetime = rs.getString("w_datetime");
                    System.out.println(eng + " : " + kor + " (" + level + ", " + datetime + ")");
                }
                if (!isFind) System.out.println("찾는 단어가 없습니다.");
    
                DBconn.dbclose(); // 참조변수 없애기
                pstmt.close();
                pstmt = null;
                rs.close();
                rs = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void edit() {
            sc = new Scanner(System.in);
            System.out.print("수정할 단어를 입력하세요 >> ");
            String eng = sc.next();
            System.out.print("단어의 뜻을 입력하세요 >> ");
            String kor = sc.next();
            System.out.print("레벨을 입력하세요 >> ");
            int level = sc.nextInt();
            try {
                conn = DBconn.getConnection();
                sql = new StringBuilder();
                sql.append("UPDATE tb_word SET w_kor = ? , w_level =? where w_eng = ?");
                pstmt = conn.prepareStatement(sql.toString());
                pstmt.setString(1, kor);
                pstmt.setInt(2, level);
                pstmt.setString(3, eng);
                int result = pstmt.executeUpdate();
                if (result >= 1) System.out.println("단어 수정 성공!");
                else System.out.println("단어 수정 실패! ");
    
                DBconn.dbclose();
                pstmt.close();
                pstmt = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void delete() {
            sc = new Scanner(System.in);
            System.out.print("삭제할 단어를 입력하세요 >> ");
            String word = sc.next();
            try {
                conn = DBconn.getConnection(); // DB 연결
                sql = new StringBuilder();
                sql.append("DELETE FROM tb_word WHERE w_eng = ?");
                pstmt = conn.prepareStatement(sql.toString());
                pstmt.setString(1, word);
                int result = pstmt.executeUpdate();
                if(result >= 1) System.out.println("단어 삭제 성공! ");
                else System.out.println("단어 삭제 실패!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public void random(){
            sc = new Scanner(System.in);
            System.out.println("단어 맞추기 게임을 시작합니다");
            int sum = 0;
            try {
                conn = DBconn.getConnection(); // DB 연결
                sql = new StringBuilder(); // 문자열을 저장할 Builder 만들기
                sql.append("SELECT w_eng , w_kor , w_level, w_datetime FROM tb_word order by rand() limit 10");
                pstmt = conn.prepareStatement(sql.toString());
    
                while (true) {
                    rs = pstmt.executeQuery();
                    rs.next();
                    String eng = rs.getString("w_eng");
                    String kor = rs.getString("w_kor");
                    System.out.print(eng + "의 뜻을 입력하세요 >> ");
                    String word = sc.next();
                    if(kor.equals(word)){
                        System.out.println("맞았습니다. ");
                        sum += 1;
                        System.out.println("최종 점수 : " + sum);
                    } else System.out.println("틀렸습니다.");
    
                    if(sum == 10){
                        System.out.println("10점 모두 맞혔습니다. ");
                        System.out.println("게임을 종료하겠습니다😁");
                        break;
                    }
                }
                DBconn.dbclose(); // 참조변수 없애기
                pstmt.close();
                pstmt = null;
                rs.close();
                rs = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    conn.close():接続を解除したオブジェクト
  • DB共有データ
  • 接続は限られている*他の人のために使用する接続オブジェクト
  • に戻る.
  • DBリソース:接続の作成→ステータスの作成→結果セット
  • の生成
  • DBリソース返却は逆順で行います.
  • 接続が切断されると、StatentとResultSetも自動的に切断されます.
  • Main.java

    import java.util.Scanner;
    
    public class Main1 {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            VocaDTO vocaDTO;
            VocaDAO vocaDAO = new VocaDAO(); // 객체 생성
    
            while(true){
                System.out.println("🎁    단어장    🎁");
                System.out.println("1. 등록   2.출력    3.검색    4.수정     5.삭제    6. 단어 맞추기 게임   7.프로그램 종료");
                int input = sc.nextInt();
                if(input == 7){
                    System.out.println("프로그램을 종료합니다.");
                    break;
                }
                switch (input){
                    case 1:
                        vocaDAO.insert();
                        break;
                    case 2:
                        vocaDAO.list();
                        break;
                    case 3:
                        vocaDAO.search();
                        break;
                    case 4:
                        vocaDAO.edit();
                        break;
                    case 5:
                        vocaDAO.delete();
                        break;
                    case 6:
                        vocaDAO.random();
                        break;
                }
            }
        }
    }
    このように単語本プログラムとスペルゲームの練習問題をしました.
    今からJava+ネットワークを勉強しましょう!

    ネットワーク

  • Net+Work合成語
  • コンピュータは、通信技術によりネットワークのように接続する通信使用形態
  • を利用する.

    ネットワーク

  • コンピュータに接続し、TCP/IPプロトコルを使用して情報をやり取りするネットワーク
  • IP(Internet Protocol)

  • インターネットに接続する全てのデバイスを識別するための、コンピュータ又は通信デバイスから他のデバイスに物理的に接続された特定の位置(チャネル)
  • を有するデバイスに付与された一意のアドレスポート(Port)である.
    IPv 4(標準)、IPv 6
  • 32ビットで、4つの8ビットフィールドで区切られた10進数で構成されています.
  • エイビーを知る
  • NAVERで「マイIP」
  • を検索
  • ウィンドウcmd→ipconfig
    macbookで「ipconfig getifiaddren 0」と入力すると、以下のように自分のIPアドレスをチェックできます.

  • ソケット

  • は、2台のホスト間で
  • に接続する.
  • リモートデバイスに接続する、データ転送(送信、受信)、ポートを指定し、
  • を待つ.
  • 通信方法を指定する
  • .
    ソケットの通信ストリーム

    サーバ(サーバ)

  • クライアントソケットの接続要求を待ち、接続要求が発生した場合、通信を実現するためにクライアントソケットを作成します.
    1)socket()関数を使用したソケットの作成
    2)bind()関数を使用してipとポート番号を設定します.
    3)listen()関数を使用して、クライアントのアクセス要求の受信キューを作成し、どのくらいのクライアントを待つかを決定します.
    4)accept()関数を使用してクライアントとの接続を待つ
  • .

    クライアント

  • 実際にデータ送受信が発生したのはクライアントソケットである.
    1)ソケットを最初に開くにはsocket()関数を使用します.
    2)connect()関数を使用するサーバで設定したipとポート番号との通信を試みる
    3)通信を試みる場合,サーバはaccept()関数を用いてクライアントのソケット記述子を返す.
    4)クライアントとサーバが読み取り()、書き込み()、通信を行う
    (この手順を繰り返します)