728x90

 

수업내용 정리 (Java)

 

1. Jdbc

 

  • 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);

 

 

더보기
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