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 |
댓글