Java

SQL, java 게시판 연결 기초 코드 분석, 이해, 정리

JooKit 주킷 2020. 6. 17. 19:54
목차 접기
728x90
반응형

 

 

window -> cmd -> c:\xampp\mysql\bin\mysql.exe -u root -p    -> enter

Welcome ~~~~   이 나오지 않으면 아무리 eclipse를 실행해도 연결되지 않은 거라

eclipse와 SQL을 사용할 수가 없다.   

★ MariaDB 연결 여부를 확인하기 위한 용도(exception .. 에러를 굳이 확인하지 않아도 연결 여부 확인 방법)

 

 

1. class DbConnection 을 만들고 SQL와 연결하는 메서드, 코드를 작성한 후 꼭 해당 메서드를 호출해야 연결이 된다.

연결하는 코드를 작성해놓고 해당 메서드를 호출하지 않으면 절대 SQL과 연결되지 않는다. 

 

2. DriverManager.getConnection(url, user, password);

DriverManager : 카카오택시 비유 

--> 카카오는 Driver가 아니라 Driver를 관리하는 역할. 

 

3. System.err.printf("[SQL 예외] : %s\n", e.getMessage())  -> try/catch (SQLException e)에서 

오류난 원인을 명확하게 명시해주는, 가져다주는 메서드(오류 원인에 따라서 오류메세지가 다르다)

 e.printStackTrace();  --> 오류 메세지를 최대한 자세하게 보여준다.   필요하지 않을 경우 주석처리.

 

4.  JDBC 는 DriverManager 이다.  JDBC는 카카오 택시이다. 

 

5. Connection connection 은 DB와의 연결이다. DB와의 직통 회선. 

 

6. dbConnection은 사용하지 않을 때는 close() 해주어야 한다.

 

7. 보험가입할 때, 신청서를 작성해서 준다.  그 신청서가 statement 이다. 

 

8. Statement stmt = connection.createStatement();

    stmt.execute(sql, Statement.RETURN_GENERATED_KIYS);  --> 빈 신청서를 받아서 작성하고 실행하는 것이다.  작성한 것을 넘긴다.

★ 이 신청서는 당연히 DB와의 연결(connection)한테 받아야 한다.

Option :    SQL의 AUTO_INCREMENT 번호 자동 증가. 관련 

 

9.  ResultSet rs = statement.getGeneratedKeys(); 

ResultSet : 보고서 ->  SQL에서 보이는 결과. 표. SELECT 한 화면. 테이블을 조회한 결과를 가져온다. 

rs는 SQL의 결과를 저장한다.

 

10. int id = -1;   -1은 실패했다는 의미. rs는 책이다.   rs.next() 를 통해서 다음 책장으로 넘어간다. 

    다음 게시물의 번호를 가져온다. 

★ ResultSet 은 next()를 통해서 결과를 가져올 수 있다.   다만 한번에 1개의 데이터만 가져올 수 있다.

 

11. 쿼리 문법 오류가 있을 시, 이클립스에서 작성한 쿼리문을 그대로 복사해서 SQL에서 직접 실행해보고 문법을 고친 후 고친 자료를 그대로 복사해서 이클립스에 복붙.

 

[ 2020-06-17 수업 1부 영상 정리 자료 ]  ↑

 

--------------------------------------------------------------------------------

12. 게시물 수정 ( 반영된, 영향을 받은 게시물의 개수를 반환한다)

update의 경우,   executeupate(); 라는 메서드가 따로 있다.

int affectedRows = 0;   --> 영향을 받은 개수.

Statement statement = connection.createStatement();

afftectedRows = statement.executeupdate(sql); -> 기본적으로 반환한다. 

 

13.   게시물 삭제 ( 반영된, 영향을 받은 게시물의 개수를 반환한다)

delete 할 때도, affectedRows = statement.executeupdate(sql); 

-->  수정과 똑같이 update를 사용한다. delete라는 메서드는 따로 없는 듯. 

delete 메서드 자체에 delete 내용이 없어도 SQL에서 게시물이 삭제되는 이유는? 

--> 쿼리문에 DELETE 라고 작성해주었기 때문에 그대로 처리 된 듯. 당연한 것.

 

14. 최신 게시물 3개 가져오기 

SELETE * FROM article ORDER BY id DESC LIMIT 3(3개라는 제약)  ( 내림차순 : 처음부터 큰 숫자를 가져온다 )

★이클립스에 쿼리를 작성할 때, 먼저 SQL에 복붙해서 실행이 잘 되는지 확인하고 코드를 작성하면 번거로움을 줄일 수 있다. 

 

SELETE * FROM article ORDER BY id ASC LIMIT 3(3개라는 제약) ( 오름차순 : 위에서 아래로 점점 숫자가 커진다. )

 

★row : 열 ,      column : 행 

 

rows 들이 Integer, String 1개의 타입으로만 이루어진 것이 아니라 여러 타입으로 이루어져 있으므로 

List<Map<String, Object>> selectRows(String sql) {

} 메서드를 만든다.     Object는 모든 타입을 담을 수 있지만 꺼낼때는 모두 형변환을 해주어야 한다.

key는 String으로 이루어져 있다.

그리고 SELECT(데이터를 가져올 때는) execute가 아닌 executeQuery() 라는 메서드를 사용한다.

executeQuery()는 SELECT용이다.  --> ★ 이 친구도 ResultSet을 반환한다.  : 보고서 

★ResultSet 은 무조건 1개의(1페이지의) 값만 가져온다. 중요!

 

[ 불러오는 방법, 타입, type ]

System.out.println(rs.getInt(1);   --> 1페이지의 1열?의 값을 Int로 불러오겠다.

System.out.println(rs.getInt(2); --> 오류 발생 !   이유 : 2번째 열은 regDate로 DATETIME이라 int로 받아올 수 없다.

DATETIME ->   rs.getTimestamp(2)   사용! 

 

15. Query  : SELECT id AS n FROM article ORDER BY id ASC LIMIT 3 

의미 :  원래의 칼럼 이름id를 n으로 바꿔서 SELETE(조회, 검색, 불러온다) !

★ 칼럼 이름 변경 

 

16.  ResultSetMetaData metaData = rs.getMetaData();

-->  metaData를 잘 이용하면 칼럼 이름이 바뀌어도, 칼럼 선택 수가 1개이던 모두 선택이던 

key, key 값을 알아서 if문을 쓰지 않고도 원하는 결과를 얻을 수가 있다. 스마트하게! 

 

17. int columnSize = metaData.getColumnCount();    --> 이 코드는 현재 칼럼 개수를 가져온다. 

칼럼 개수 등은 SELECT를 어떻게 하느냐에 따라 매번 달라질 수 있다. 내가 만들어 놓은 칼럼들이 항상 

고정되어서 조회되고 관리되는게 아니다. 

 

18. 

for (int columnIndex = 0; columnIndex < columnSize; columnIndex++) {

          String columnName = metaData.getColumnName(columnIndex + 1);

                Object value = rs.getObject(columnName);

                if ( value instanceof long) {

                     int numValue =(int)(long)value;   --> 원래 long타입이기 때문에 먼저 long-> int변경

                    row.put(columnName, numValue);

 

                }

               else if ( value instanceof Timestamp ) {

                    String dateValue = value.toString();

                     dateVaule = dateValue.substring(0, dateValue.length() - 2);

                    row.put(columnName, dateValue);

 

                }

                else {

                    row.put(columnName, columnName);            --> 어짜피 String이기 때문에 따로 형변환 없이.

                }

          // map에 값을 입력 map.put(columnName, columnName으로 getString)

   }

              ★ 데이터를 받아오는 입구에서 한 큐에 형변환을 해결해버린다.

       그러지 않으면 다른 메서드에서 사용할 때!  항상 형변환을 해주어야 하는 큰 번거로움이 따른다.!! 

     

 

19.   Query :    As -> 별명 의미.   

 

20. SELECT COUNT(*) AS nn FROM article -->   전체 게시물 개수를 보여준다.   COUNT(*)만 입력하면 문법 반영되지 않기 때문에 AS nn 으로 별명을 붙여서 Query가 알맞게 반영될 수 있도록 해준다. 

 

21.  MAX(id)   -> 가장 큰 id를 불러온다.     

 

22. mysql은 참이라는게 없다 ( boolean ) 

-->  참이라면 0,  거짓이라면 1 반환.

 

 

 

if : 만약에 페이지가 한개도 없다고하면 빈박스라도 리턴하겠다. 라는 의미의 코드. 

 

23. TRUNCATE board;      -->  board table 의 모든 row(열)를 삭제하겠다.   // column(행)

 

* CHAR 의 최대는 255 이다.

CHAR(255) 가 최대. 

 

 

[ 참고 영어단어 ]

connect : 연결하다.

suitable : 적합한, 적절한 

execute : 실행하다. 

generated : 발생시키다, 만들어내다.

denied : 사실이 아니라고 말하다, 부인하다.

statement : 성명서, 진술서, 서술 ( SQL 쿼리 작성 신청서) 

 

728x90
반응형
LIST

'Java' 카테고리의 다른 글

workspace 경로 확인하는 법  (0) 2020.06.28
이클립스 클래스 분할 관리(분리, 각 파일 생성), SQL  (0) 2020.06.18
SQL, JDBC  (0) 2020.06.16
JDBC  (0) 2020.06.15
Object type 비교  (0) 2020.06.03