JAVA + JDBC

김채영·2024년 6월 13일

JDBC

  • Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트하거나, 데이터베이스에 저장된 데이터를 Java에 사용할 수 있도록 하는 자바 API

적용 순서

  1. JDBC드라이버 로드 : JDBC드라이버 클래스를 메모리에 로드함.

    //MySQL의 경우
    Class.forName("com.mysql.cj.jdbc.Driver");
    
  2. 데이터베이스 연결 : DriverManager을 사용해 데이터베이스에 연결하지만, 연결할 땐 url과 사용자 아이디, 비밀번호를 필요로함.

    String url= ""jdbc:mysql://localhost:3306/스키마이름";
    String userId="root";
    String userPwd = "pwd";
    Connection connection = DriverManager.getConnection(url, userId, userPwd);
    
  3. SQL문 생성 : Statement 혹은 PreparedStatement 객체 생성하여 SQL 준비

    Statement statement = connection.createStatement();
    String query = "SELECT * FROM users";
    ResultSet resultSet = statement.executeQuery(query);
    
  4. SQL문 실행 : executeQuery(select), executeUpdate(insert, update, delete)메서드를 사용하여 SQL문 실행

    ResultSet resultSet = statement.executeQuery(query);  // SELECT 문
    int result = statement.executeUpdate(updateQuery);  // INSERT, UPDATE, DELETE 문
    

    SELECT문은 데이터베이스에 입력된 값을 가지고 오기 때문에 int형태가 아닌 ResultSet으로 가지고 오는 것이고, 나머지는 값들이 데이터베이스에 성공적으로 들어갔다면 변경된 컬럼갯수에 따라 값이 넘어오지만 실패했다면 0으로 넘어와 int형으로 받아야 한다.

  5. 결과처리

    SELECT

    while(resultSet.next()) {
    //반복문을 통해 resultSet에 selet한 값이 다음에도 있는지 확인
    //그 다음에 없을 경우, 반복문 탈출
                    Member m = new Member(rs.getInt("member_no")
                            ,rs.getString("member_id")
                            ,rs.getString("member_pwd")
                            ,rs.getString("member_name")
                            ,rs.getString("member_email")
                            ,rs.getString("member_phone")
                            ,rs.getString("member_gender")
                            ,rs.getTimestamp("reg_date").toLocalDateTime()
                            ,rs.getTimestamp("mod_date").toLocalDateTime());
                    resultList.add(m);
                }

    INSERT, DELETE, UPDATE

    //int형으로 받아와서 숫자로 비교
    if(result > 0) {
                System.out.println("성공");
    }else {
                System.out.println("실패");
    }
  6. 자원해제 : 사용한 객체들을 닫아 해제한다.

    resultSet.close();
    statement.close();
    connection.close();

return 값;

public int insertMember(Member m) {
        Connection conn = null;
        Statement stmt = null;
        int result = 0;
        try {
            Class.forName("org.mariadb.jdbc.Driver");
            String url ="jdbc:mariadb://127.0.0.1:3306/jdbc_test";
            String user = "scott";
            String userPwd = "tiger";

            conn = DriverManager.getConnection(url, user, userPwd);

            stmt = conn.createStatement();
            String sql = "INSERT INTO `member` (`member_id`, `member_pwd`, `member_name`,"
                    + " `member_email`, `member_phone`, `member_gender`) "
                    + "VALUES('"+m.getMemberId()+"', '"+m.getMemberPwd()+"', '"+m.getMemberName()+"',"
                    + "'"+m.getMemberEmail()+"', '"+m.getMemberPhone()+"', '"+m.getMemberGender()+"')";
            result = stmt.executeUpdate(sql);



        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                stmt.close();
                conn.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }

위와 같이 int형으로 리턴하는 이유는 INSERT문은 설명했던 것과 같이 sql문으로 인해 변경된 컬럼의 갯수이기 때문에 return result(int형);인 것이다.

    public List<Member> selectMemberAll(){
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        List<Member> resultList = new ArrayList<Member>();

        try {
            Class.forName("org.mariadb.jdbc.Driver");
            String url ="jdbc:mariadb://127.0.0.1:3306/jdbc_test";
            String user = "scott";
            String userPwd = "tiger";

            conn = DriverManager.getConnection(url, user, userPwd);

            stmt = conn.createStatement();
            String sql = "SELECT * FROM member";
            rs = stmt.executeQuery(sql);

            while(rs.next()) {
                Member m = new Member(rs.getInt("member_no")
                        ,rs.getString("member_id")
                        ,rs.getString("member_pwd")
                        ,rs.getString("member_name")
                        ,rs.getString("member_email")
                        ,rs.getString("member_phone")
                        ,rs.getString("member_gender")
                        ,rs.getTimestamp("reg_date").toLocalDateTime()
                        ,rs.getTimestamp("mod_date").toLocalDateTime());
                resultList.add(m);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                rs.close();
                stmt.close();
                conn.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        return resultList;
    }

SELECT문은 내가 찾고 싶은 정보를 가지고 왔기때문에 그 다양한 갯수의 정보를 여러 개 출력해야하기 때문에 List<>에 담아서 return 자체를 list로 한다.

profile
백엔드 개발⭐

0개의 댓글