본문 바로가기
JAVA 공부

[MYSQL] 연결 후 출력까지!

by KyeongOUK 2020. 6. 16.

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
	public static void main(String[] args) {
		DBConnection dbConn = new DBConnection();
		// db연결객체 생성

		dbConn.connect();
		// db연결 시작
		System.out.println("== 게시물 생성 ===");
		int newId = dbConn.insert("INSERT INTO article SET regDate = NOW(), title = '제목', `body` = '내용'");
		System.out.printf("%d번 게시물 생성되었습니다.\n", newId);

		System.out.println("== 게시물 수정 ==");
		int affectedRows = dbConn.update("UPDATE article SET title = '수정된 제목 1' WHERE id = 1");
		// affectedRows는 게시물이 몇개 수정되었는지 알려주는것
		// WHERE id IN (1,2) 는 WHERE id = 1 OR id = 2를 뜻함 -> 2개수정됨
		System.out.printf("%d개의 게시물이 변경됨\n", affectedRows);

		List<Map<String, Object>> articlesRows = dbConn.selectRows("SELECT * FROM article");
		// SELECT * FROM article 는 1개의 묶음만 불러온다. 이묶음은 list rows는 복수
		// SELECT * FROM article LIMIT 2 하면 제한을 걸어 2개만 게시물을 불러온다
		// 작성된 게시글을 전~~~부 불러서 리스트로 표현한다
		System.out.println("== 게시물들 ==");
		System.out.println(articlesRows);

		Map<String, Object> articleRow = dbConn.selectRow("SELECT * FROM article LIMIT 1");
		//selectRow 위에는 Rows고 이번엔  한개. 위에 Map을 감싸던 list가 사라짐
		System.out.println("== 게시물 ==");
		System.out.println(articleRow);

		int lastId = dbConn.selectRowIntValue("SELECT MAX(id) FROM article");
		//MAC(id)는 생성된 게시물 중에서 가장 큰 수, 즉 최근계시물을 뜻한다
		System.out.println("== 최근 게시물 ID ==");
		System.out.println(lastId);

		String lastTitle = dbConn.selectRowStringValue("SELECT title FROM article ORDER BY id DESC LIMIT 1");	
		System.out.println("== 최근 게시물 제목 ==");
		System.out.println(lastTitle);

		boolean lastIdIsOdd = dbConn.selectRowBooleanValue("SELECT id % 2 != 0 FROM article ORDER BY id DESC LIMIT 1");
		System.out.println("== 최근 게시물 번호가 홀수인지 ==");
		System.out.println(lastIdIsOdd);

		dbConn.close();
		// db연결 끝!
	}
}

class DBConnection {
	Connection connection;

	public void connect() {
		String url = "jdbc:mysql://localhost:3306/site4?serverTimezone=UTC";
		String user = "sbsst";
		String password = "sbs123414";
		String driverName = "com.mysql.cj.jdbc.Driver";

		try {
			// ① 로드(카카오 택시에 `com.mysql.cj.jdbc.Driver` 라는 실제 택시 드라이버를 등록)
			// 하지만 개발자는 실제로 `com.mysql.cj.jdbc.Driver`를 다룰 일은 없다.
			// 내부적으로 JDBC가 알아서 다 해주기 때문에 우리는 JDBC의 DriverManager 를 통해서 DB와의 연결을 얻으면 된다.
			Class.forName(driverName);

			// ② 연결
			connection = DriverManager.getConnection(url, user, password);
		} catch (ClassNotFoundException e) {
			// `com.mysql.cj.jdbc.Driver` 라는 클래스가 라이브러리로 추가되지 않았다면 오류발생
			System.out.println("[로드 오류]\n" + e.getStackTrace());
		} catch (SQLException e) {
			// DB접속정보가 틀렸다면 오류발생
			System.out.println("[연결 오류]\n" + e.getStackTrace());
		}
	}

	public int selectRowIntValue(String sql) {
		Map<String, Object> row = selectRow(sql);

		for (String key : row.keySet()) {
			Object value = row.get(key);

			if (value instanceof String) {
				return Integer.parseInt((String) value);
			}
			if (value instanceof Long) {
				return (int) (long) value;
			} else {
				return (int) value;
			}
		}

		return -1;
	}

	public String selectRowStringValue(String sql) {
		Map<String, Object> row = selectRow(sql);

		for (String key : row.keySet()) {
			Object value = row.get(key);

			return value + "";
		}

		return "";
	}

	public boolean selectRowBooleanValue(String sql) {
		int rs = selectRowIntValue(sql);

		return rs == 1;
	}

	public Map<String, Object> selectRow(String sql) {
		List<Map<String, Object>> rows = selectRows(sql);

		if (rows.size() > 0) {
			return rows.get(0);
		}

		return new HashMap<>();
	}

	public List<Map<String, Object>> selectRows(String sql) {
//list는 리턴되는데,  Map, <String, Object> 으로 이루어진 리스트를 리턴함.  
		// SQL을 적는 문서파일
		Statement statement = null;
		ResultSet rs = null;

		List<Map<String, Object>> rows = new ArrayList<>();

		try {
			statement = connection.createStatement();
			rs = statement.executeQuery(sql);
			// ResultSet 의 MetaData를 가져온다.
			ResultSetMetaData metaData = rs.getMetaData();
			// ResultSet 의 Column의 갯수를 가져온다.
			int columnSize = metaData.getColumnCount();

			// rs의 내용을 돌려준다.
			while (rs.next()) {
				// 내부에서 map을 초기화
				Map<String, Object> row = new HashMap<>();

				for (int columnIndex = 0; columnIndex < columnSize; columnIndex++) {
					String columnName = metaData.getColumnName(columnIndex + 1);
					// map에 값을 입력 map.put(columnName, columnName으로 getString)
					row.put(columnName, rs.getObject(columnName));
				}
				// list에 저장
				rows.add(row);
			}
		} catch (SQLException e) {
			System.err.printf("[SELECT 쿼리 오류, %s]\n" + e.getStackTrace() + "\n", sql);
		}

		try {
			if (statement != null) {
				statement.close();
			}

			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			System.err.println("[SELECT 종료 오류]\n" + e.getStackTrace());
		}

		return rows;
	}

	public int update(String sql) {
		// UPDATE 명령으로 몇개의 데이터가 수정되었는지
		int affectedRows = 0;

		// SQL을 적는 문서파일
		Statement statement = null;

		try {
			statement = connection.createStatement();
			affectedRows = statement.executeUpdate(sql);
		} catch (SQLException e) {
			System.err.printf("[UPDATE 쿼리 오류, %s]\n" + e.getStackTrace() + "\n", sql);
		}

		try {
			if (statement != null) {
				statement.close();
			}
		} catch (SQLException e) {
			System.err.println("[UPDATE 종료 오류]\n" + e.getStackTrace());
		}

		return affectedRows;
	}

	public int insert(String sql) {
		int id = -1;

		// SQL을 적는 문서파일
		Statement statement = null;
		// SQL의 실행결과 보고서
		ResultSet rs = null;

		try {
			statement = connection.createStatement();
			statement.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
			rs = statement.getGeneratedKeys();
			if (rs.next()) {
				id = rs.getInt(1);
			}
		} catch (SQLException e) {
			System.err.printf("[INSERT 쿼리 오류, %s]\n" + e.getStackTrace() + "\n", sql);
		}

		try {
			if (statement != null) {
				statement.close();
			}

			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			System.err.println("[INSERT 종료 오류]\n" + e.getStackTrace());
		}

		return id;
	}

	public void close() {
		try {
			if (connection != null) {
				connection.close();
			}
		} catch (SQLException e) {
			System.err.println("[닫기 오류]\n" + e.getStackTrace());
		}
	}
}

'JAVA 공부' 카테고리의 다른 글

[JSP/Servlet] 자바-서블릿 설정하기..  (0) 2020.06.24
[자바 기초 ] 패키지/클래스 분리시키기  (0) 2020.06.18
[Mysql] DB쿼리 명령어(계정생성)  (0) 2020.06.16
JDBC / MySQL Driver  (0) 2020.06.15
짝3 게시판 MVC  (0) 2020.06.12

댓글