728x90
수업내용 정리 (Java)
1. Jdbc
- Java랑 MySQL을 연결하기 위해 Maven Repository에서 MySQL Connector/J 다운을 받았다.
- MySQL ㄱ
더보기
-- test table
Create table member(
ID varchar(20) PRIMARY KEY,
PW varchar(20) NOT NULL,
NAME varchar(20) NOT NULL,
AGE tinyint unsigned NOT NULL,
BIRTH date default (current_DATE)
);
select*FROM MEMBER;
-- test data
INSERT INTO MEMBER VALUES('A','1111','에이', 20, DEFAULT);
INSERT INTO MEMBER VALUES('B','2222','비비', 21, '2023-10-31');
INSERT INTO MEMBER VALUES('C','3333','씨씨', 22, DEFAULT);
INSERT INTO MEMBER VALUES('D','4444','디디', 30, DEFAULT);
INSERT INTO MEMBER VALUES('E','5555','이이', 32, DEFAULT);
- Java (참고) ㄱ
더보기
Connection con;
PreparedStatement pstmt;
ResultSet rs;
- Connection con: db 접속을 위한 객체 생성
- PreparedStatement pstmt: sql 문장과 db 전달
- ResultSet rs: select 결과 저장
public static void main(String[] args) {
JdbcConnectionTest conTest=new JdbcConnectionTest();
conTest.connect();
// select, insert, ...
conTest.select();
conTest.select(30, "에이");
conTest.insert("L", "101010", "엘", 34, "2010-10-10");
conTest.dbClose();
}
// conTest.connect();
public void connect() { /* java and db 연결 */
try {
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "icia", "1234");
System.out.println("db 접속 성공");
} catch (SQLException e) {
System.out.println("db 접속 실패");
e.printStackTrace();
}
}
- db 접속을 위해 만들어둔 con 객체에 getConnection 메소드를 통해 db 접속
- getConnection("db 주소", "id", "pw") 구조로 적는다.
- localhost: ip적는곳 / 현재 컴퓨터에 있는 db를 사용한다면 localhost를 통해 접근이 가능하다.
- db 접속에 실패할 수도 있으므로 try-catch문을 이용하여 작성해야 한다.
// conTest.dbClose();
private void dbClose() { /* java and db 연결 종료 */
try {
con.close();
System.out.println("db 종료 성공");
} catch (SQLException e) {
System.out.println("db 종료 실패");
e.printStackTrace();
}
}
- con 객체에 close 메소드를 통해 db 연결 해제
- 연결 해제에 실패할 때를 대비하여 try-catch문을 이용하여 작성한다.
// conTest.select();
private void select() {
String sql="select*from member";
try {
pstmt=con.prepareStatement(sql);
rs=pstmt.executeQuery(); // executeQuery는 select만
while(rs.next()) {
System.out.println("아이디: "+rs.getString("ID")); // ID 칼럼에 있는 값을 반환
System.out.println("비밀번호: "+rs.getString("PW"));
System.out.println("이름: "+rs.getString("NAME"));
System.out.println("나이: "+rs.getInt("AGE"));
System.out.println("생일: "+rs.getDate("BIRTH"));
System.out.println(" -----:");
}
} catch (SQLException e) {
System.out.println("select 예외 발생");
e.printStackTrace();
}
System.out.println("select 완료");
}
- String sql="~"; : sql에서 실행할 문장을 적는다.
- pstmt=con.prepareStatement(sql); : sql 문장을 db에 전달 파싱(분석) / 컴파일과 비슷하다고 생각해도 된다.
- rs=pstmt.executeQuery(); : db에서 select문을 실행한다.
- while문: 조건에 rs.next()를 넣어 rs의 다음 값이 있는지 확인하고 다음 값이 없으면 while문을 종료한다. sysout을 통해 rs에 담긴 값을 받아와 출력한다.
- 에러가 날 수 있으므로 try-catch문을 이용하여 작성한다.
// conTest.select(30, "에이");
private void select(int age, String name) {
String sql="select*from member where AGE>=? OR NAME=?";
try {
pstmt=con.prepareStatement(sql);
pstmt.setInt(1, age);
pstmt.setString(2, name);
rs=pstmt.executeQuery(); // executeQuery는 select만
while(rs.next()) {
System.out.println("아이디: "+rs.getString("ID")); // ID 칼럼에 있는 값을 반환
System.out.println("비밀번호: "+rs.getString("PW"));
System.out.println("이름: "+rs.getString("NAME"));
System.out.println("나이: "+rs.getInt("AGE"));
System.out.println("생일: "+rs.getDate("BIRTH"));
System.out.println(" -----:");
}
} catch (SQLException e) {
System.out.println("select 예외 발생");
e.printStackTrace();
}
System.out.println("select 완료");
}
- 전체적인 구조는 위와 같지만, 조건이 있기 때문에 조금 다르다.
- sql문을 작성할 때 매개변수를 바로 작성할 수 있으나 붙여주기 까다로우니 물음표(?)로 대체해주고 밑에서 pstmt.set~(n,m)을 이용하여 작성해준다.
- pstmt.set~(n,m): ~은 타입을 적고, n은 물음표(?)의 위치(왼쪽부터 순서대로 1~), m은 물음표(?)에 넣고 싶은 매개변수를 적는다.
// conTest.insert("L", "101010", "엘", 34, "2010-10-10");
private void insert(String id, String pw, String name, int age, String birth) {
String sql="insert into member(id, pw, name, age, birth) "
+ "values(?, ?, ?, ?, ?)";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pw);
pstmt.setString(3, name);
pstmt.setInt(4, age);
pstmt.setString(5, birth);
pstmt.executeUpdate(); // insert, updqte, delete 실행
} catch (SQLException e) {
System.out.println("insert 예외 발생");
e.printStackTrace();
}
}
- 매개변수로 받아온 값들을 물음표(?) 위치에 맞게 집어넣고, executeUpdqte(insert, update, delete 실행) 메소드를 통해 실행한다.
- 마찬가지로 오류가 날 수 있으니 try-catch문을 이용한다.
// 문제1 회원 G 삭제
conTest.delete("쥐");
// 문제2 회원 A의 나이를 50살로 변경
conTest.update("A", 50);
private void update(String id, int age) {
String sql="update member set age=? where id=?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, age);
pstmt.setString(2, id);
pstmt.executeUpdate(); // insert, updqte, delete 실행
} catch (SQLException e) {
System.out.println("insert 예외 발생");
e.printStackTrace();
}
}
private void delete(String id) {
String sql="delete from member where id=?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.executeUpdate(); // insert, updqte, delete 실행
} catch (SQLException e) {
System.out.println("insert 예외 발생");
e.printStackTrace();
}
}
- delete와 updqte 모두 insert를 할 때처럼 비슷하게 매개변수를 받고 물음표 위치에 따라 맞는 매개변수를 입력한다.
- executeUpdate를 사용하여 실행한다.
- 마찬가지로 오류가 날 수 있으므로 try-catch문을 이용한다.
1-2) 자주 쓸 메소드 (클래스로 빼두기) ㄱ
더보기
package common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcUtil {
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "icia", "1234");
return con;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void dbClose(ResultSet rs, PreparedStatement pstmt, Connection con) {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void txCommit(Connection con) {
try {
con.commit();
} catch (SQLException e) {
System.out.println("commit fail");
e.printStackTrace();
}
}
public static void txRollback(Connection con) {
try {
con.rollback();
} catch (SQLException e) {
System.out.println("rollback fail");
e.printStackTrace();
}
}
}
2. 문제
로그인할때 틀리면 계속 입력을 받아서 로그인에 성공하면 멈추도록 하기(boolean으로 반환받기)
회원 전체 출력하기
2-1) 메인 ㄱ
더보기
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 회원서비스 비지니스로직(업무코드)
MemberService mSer = new MemberService();
while(true) {
System.out.print(" 아이디 입력> ");
String id = sc.next();
System.out.print(" 비밀번호 입력> ");
String pw = sc.next();
boolean result = mSer.login(id, pw);
if(result) {
break;
}else {
System.out.println(" > id 또는 pw가 틀렸습니다.\n");
}
}
mSer.showMemberList(); // 회원 전체 출력
System.out.println(" > 프로그램 종료");
}
}
2-2) 서비스 ㄱ
더보기

로그인

회원 전체 출력
// 회원관리 서비스
public class MemberService {
Connection con;
PreparedStatement pstmt;
ResultSet rs;
public boolean login(String id, String pw) {
con=JdbcUtil.getConnection();
String sql = "select*from member where id=? and pw=?";
try {
pstmt=con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pw);
rs = pstmt.executeQuery();
if(rs.next()) {
System.out.println(" > "+id+"님 로그인 성공");
return true;
}
} catch (SQLException e) {
} finally {
JdbcUtil.dbClose(rs, pstmt, con);
}
return false;
}
public void showMemberList() {
con=JdbcUtil.getConnection();
String sql = "select*from member";
try {
pstmt=con.prepareStatement(sql);
rs = pstmt.executeQuery();
System.out.println("ID\tNAME");
System.out.println(" >-----+");
while(rs.next()) {
System.out.println(rs.getString("ID")+"\t"+rs.getString("NAME"));
System.out.println(" >-----+");
}
} catch (SQLException e) {
System.out.println(" > 정보 불러오기 실패");
e.printStackTrace();
} finally {
JdbcUtil.dbClose(rs, pstmt, con);
}
}
}
- try로 들어가든 catch로 들어가든 무조건 finally문을 실행하기 때문에 db 연결을 해제하는 메소드는 finally문에 넣었다.


질문한 내용이나 어려웠던 점 메모
- 영어가 너무 익숙하지 않다...
+ 빨리 프론트엔드도 배워보고싶다..!
728x90
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 31일차 (23/11/2) - Jdbc (1) | 2023.11.02 |
---|---|
수업일지 30일차 (23/11/1) - Jdbc (2) | 2023.11.01 |
수업일지 28일차 (23/10/30) - MySQL (1) | 2023.10.30 |
수업일지 27일차 (23/10/27) - MySQL (1) | 2023.10.27 |
수업일지 26일차 (23/10/26) - MySQL (1) | 2023.10.26 |