1. 자바 클래스인 JDBCTest와 MySQL이 연결되기 위해서는 둘이 연결되는 다리가 필요하다. 그것이 Connection 클래스이다.
2. 자바에서 작성된 main()메소드 안에 있는 sql 명령문을 작성한 다리를 통해 MySQL로 전송을 해야 하는데 그 택배차 역할을 하는 것이 PreparedStatement이다.
3. insert나 update등 반환할 것이 없는 것은 상관이 없지만 select 처럼 MySQL에서 반환된 결과를 자바 쪽으로 보내기 위해서는 ResultSet 클래스가 필요하다.
3. 실제 구현
자바와 MySQL 연결(다리 짓기)Connection(다리 짓기)- DB에게 명령문을 하나만 보낼 것이 아니고 많은 수행을 할 것이기 때문에 그 때마다 다리를 짓기 위해 Connection을 하는 것은 비효율적이다. 그래서 싱글톤 패턴을 사용한다. - 싱글톤 패턴이란 단 하나의 객체만 만들어서 사용하도록 설계된 패턴이다. - static으로 Connection 객체를 만들어서 이 객체만 사용해서 자바와 MySQL을 연결하는 것이다. - 먼저, Class.forName("com.mysql.cj.jdbc.Driver); 을 이용해 아까 추가해준 설계도 드라이버를 로딩한다. - 그 다음 다리를 지어서 가고자 하는 목적지를 정해준다. url : "jdbc:mysql://(DB가 있는 ip주소):(포트번호)/데이터베이스명" user : MySQL 유저 이름 password : MySQL 유저에 맞는 비밀번호 - 그 다음 Connection 객체에 conn = DriverManager.getConnection(url, user, password); 를 해줌으로 다리를 만들어 자바와 MySQL를 연결해준다.
명령문 수행 및 데이터 반환(택배차를 만들어 보내고 받아오기)택배차- 자바와 MySQL을 연결하는 다리(conn)을 만들었다면 conn을 받아오고 우리가 수행하고 싶은 sql문을 string 형태로 작성해 놓는다. - 그 다음 sql문을 싣고 갈 택배차를 만들어야 한다. 그 때 사용하는 것이 PreparedStatement 객체이다. - PreparedStatement ps = conn.prepareStatement(sql);을 이용해 택배차를 만들어준다. - 이제 두가지로 나눠지게 되는데 rs.excuteUpdate(); 또는 rs.excuteQuery(); 이다.
- excuteUpdate(); 는 시스템에 변화가 생기는 쿼리문을 수행하는 메소드이다.(insert, update, delete) - 변화된 행의 개수 반환 - excuteQuery(); 는 변화 없는 쿼리문 수행(select) - 검색된 결과 리턴(ResultSet)
- excuteQuery(); 는 DB에서 나온 결과를 반환해서 ResultSet으로 돌려준다. - 이제 ResultSet으로 받은 결과를 while문을 이용해 rs.next()를 실행한다. - rs.next()는 검색된 결과에서 행을 하나 이동시키며 이동된 곳에 행이 존재한다면 true, 아니면 false를 반환한다. - DB에서 받아온 테이블을 한 행씩 돌게 되는데 그 때 각 맞는 자료형으로 rs.get~~로 변수에 받아오면 된다. - rs.get~~(" " or 숫자); get~~ 매개변수 안에는 테이블에 저장되어 있는 각 컬럼의 이름을 쓰거나 숫자를 쓰면 데이터를 가지고 올 수 있다.
사용자가 작성한 것으로 sql문 작성- 다른 것들은 다 같지만 만약 사용자가 작성한 문자나 숫자를 sql문에 작성하고 싶다면 sql문 들어갈 곳에 ?로 표시를 하고 rs.setString(숫자, 데이터); 를 이용해서 넣으면 된다. - 숫자는 ?표 처음부터 차례대로를 의미한다.
4. 정리
1. Java에서 SQL문을 문자열 타입으로 작성 2. 설치된 Driver를 이용해서 Connection 객체 생성 3. Connection 객체를 통해 PreparedStatement 객체 생성(SQL문을 넘겨주며) 4. 만들어진 PrepareStatement 객체를 통해 SQL문 수행 5. select문이라면 검색 결과가 있으므로 ResultSet 객체로 받기 6. 적절한 횟수의 rs.next()를 통해 받아오고자 하는 데이터가 위치한 행 선택 7. rs.get~~~()로 각 컬럼의 데이터 받아오기