![article thumbnail image](https://blog.kakaocdn.net/dn/3MadI/btrM36mKBWp/26JU4kGxK2Xkg8MVzZkzx0/img.png)
■ JDBC
- 자바 DB간의 연동을 해주는 API -> Interface(규약)
비휘발성 데이터
1. 메모장, 한글, 워드, 엑셀
2. FireBase 서버를 통한 저장
3. Database를 통해 컴퓨터에 저장
==> 3번 활용
순서
1. 데이터 베이스 연결 (Oracle,MariaDB,MySQL등)
Oracle -> Connection사용
MySQL -> getCon사용
하지만 인터페이스(Connection)로 통일 시킨다.
- DB연결에 필요한것
1) Oracle -> 라이브러리, 드라이버(패키지안에 있는 클래스 필요)
2) user ID,PW 필요(HR/HR), url필요
3) SQL문 준비 ,결과값 처리하기
4) 사용한 기능 닫기
* Oracle ojdbc6.jar파일 import
--> 프로젝트 우클릭 / Build path / Configure Build Path
-> libraries -> Add External JARs
*DB연결
1) JDBC Driver 로딩
*DriverManger 클래스.
-> JDBC Driver를 통해서 Connection 만드는 역할
--> Class.forName("oracle.jdbc.driver.OracleDriver"); 메소드를 통해서 생성.
--> 드라이버를 구현하는 작업.
--> ClassNotFoundException 에러 --> 프로젝트 ojdbc6.jar
2) 통로 연결(Connection)
-> Connection 인터페이스
SQL문장 정의, 실행시킬수 있는 Statement 객체 생성해주기 위한 인터페이스.
-> Connection 객체를 사용.
3) Statement 인터페이스/PreparedStatement 인터페이스.
Statement인터페이스 : Connection 객체를 통해서 구현되는 일종의 메소드 집합.
--> Statement 객체 생성하고 SQL 질의문 실행할때 사용.
executeQuery() 메소드 호출 -> Select문
--> 단순 질의문 질의 할때 사용.
// 한번 실행 될때마다 새로 분석이 필요함. --> 실행속도 느림.
//실행될때마다 매번 서버에서 분석 --> 실행속도 빠름. 재사용성 용이.
4) PreparedStatement 인터페이스.
1. 동일한 질의문 반복적으로 수행, 값만 바꾸어서 여러번 실행할 경우.
2. 데이터들이 많아서 질의문 정리할 필요가 있을때
"위치홀더" : '?' 인자로 사용 --> 일종의 토큰
--> SQL 문장이 실행되기 이전에 실제 값으로 대체.
3. ResultSet 인터페이스.
SQL문(Select) 사용 성공 -> ResultSet 반환(리턴)
--> 테이블형태(행/열)
--> Cursor(커서)
제일 처음에는 첫번째 행 바로 앞에 가리키고 있다.
next() 메소드를 통해서 다음 위치로 넘어가게 해줍니다.
3) SQL(Query)문 전송
4) 연결 종료.
회원가입 insert문 만들기 예제)
실행 코드
package JDBC기초;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class ex01Insert {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PreparedStatement psmt = null;
Connection conn = null;
System.out.print("ID를 입력해 주세요 >> ");
String id = sc.next();
System.out.print("PW를 입력해 주세요 >> ");
String pw = sc.next();
System.out.print("이름를 입력해 주세요 >> ");
String name = sc.next();
// JDBC연결과정
// 1. 데이터베이스 연결
// 1-1) 드라이버 동적로딩
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
// -> 어떤 데이터베이스를 사용할건지
// oracle.jdbc.driver ---> ojdbc6.jar 패키지명
// OracleDriver --> 클래스명
// 동적로딩
// : 실행하는 순간 자료형이 결정되는 것(OracleDriver로 자료형으로 바뀜)
// static (정적인 저장공간) : 실행되는 순간 바로 로딩이 되는 것
// static 저장되는 것들은 다 글꼴이 기울임꼴
// 1-2) 데이터 베이스 연결에 필요한 준비물
// 데이터 베이스의 주소 : url
// 데이터 베이스 계정 : user
// 데이터 베이스 비밀번호 : password
String url = "jdbc:oracle:thin:@localhost:1521:xe";
// jdbc:oracle:thin -> thin 드라이버
// @localhost -> ip주소(내 컴퓨터 ip주소의 키워드)
// 1521 -> port번호
// xe-> oracle의 별칭
String user = "hr";
String password = "hr";
conn = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
// 2. Query문(SQL) 전송
// 2-1) SQL문장 준비하기
String sql = "insert into mem values(?,?,?)";
// ?(입력값) : 어떤 값을 입력할지 모르기때문에 ?로 처리
// 2-2) SQL문장 전송
psmt = conn.prepareStatement(sql);
// psmt라는 바구니가 비어있어 id, pw, name을 담아준다
// 2-3) ?인자 채워주기(사용자가 입력한 데이터로)
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, name);
// psmt.set자료형(몇번째 물음표, 어떤값);
int row = psmt.executeUpdate();
//row 데이터가 수정이나 추가가 되었을경우 row가 0보다 크고
// 변동이 없을 경우 0
// 3. 결과값을 이용한 작업 처리하기
if(row>0) {
// 영향을 받은 행이 있다면
System.out.println("데이터 추가 성공!");
}else {
System.out.println("데이터 추가 실패!");
}
} catch (ClassNotFoundException e) {
// Class.forName에서 오류가 났을때
System.out.println("드라이버 로딩 실패");
e.printStackTrace();
} catch (SQLException e) {
// connection 오류났을때
System.out.println("url,user,password 권한 오류");
e.printStackTrace();
} finally {
// 중간에 예외 상황이 발생 하더라고 무조건 한번은 실행시켜서
// 사용한 기능들을 닫아주는 구문
// 4. 닫기(데이터베이스 자원 반납)
// conn, psmt(사용한 역순으로 닫아주자 psmt -> conn
try {
// 지역변수로 오류생겨 전역변수로 바꾼다
// -> 후에 자원반납하다 생긴오류 잡기 위해 try catch문 작성
// psmt, conn이 사용이 되었는지 확인 후 판단 -> 사용했으면 null(x)
if(psmt != null)
psmt.close();
if(conn != null)
conn.close();
// if문 실행코드 한줄이면 {}생략가능
} catch (SQLException e) {
System.out.println("반납 시 오류");
e.printStackTrace();
}
}
}
}
delete문 만들기)
실행코드
package JDBC기초;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class ex02Delete {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Connection conn = null;
PreparedStatement psmt = null;
System.out.print("삭제하고 싶은 ID의 설정된 이름 >> ");
String name = sc.next();
// 사용자로부터 입력받은 이름이 해당하는 id,pw,name(1개의 행)
// 을 삭제하는 JDBC코드 작성해보기
// sql = "delete 테이블명 where name = 사용자가 입력"
// where은 Database의 조건절
try {
// 1. 드라이버 동적 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2. 데이터 베이스 연결에 필요한 준비물
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "hr";
String password = "hr";
conn = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
// 3. sql문 준비하기
String sql = "delete from mem where name = ? ";
psmt = conn.prepareStatement(sql);
// ? 인자 채우기
psmt.setString(1,name);
// 4. 결과값 받아오기, sql문 전송
// delete, insert, update... executeUpdate()
// 영향을 받은 행이 있는지(0>row), 없는지(0<=row) int row(자료형) 결과값
int row = psmt.executeUpdate();
if(row>0) {
System.out.println("데이터 삭제 성공");
}else {
System.out.println("데이터 삭제 실패");
}
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("권한 오류");
e.printStackTrace();
} finally {
try {
if(psmt!=null)
psmt.close();
if(conn!=null)
conn.close();
}catch (SQLException e) {
System.out.println("반납 시 오류");
e.printStackTrace();
}
}
}
}
select문
실행코드
package JDBC기초;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ex03Select {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
// ResultSet
// 동적 로딩
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "hr";
String password = "hr";
conn = DriverManager.getConnection(url, user, password);
// sql문 준비
String sql = "select * from mem";
psmt = conn.prepareStatement(sql);
// select문에 ? 인자가 없어서 따로 채우지 않는다
rs = psmt.executeQuery();
while (rs.next()) {
String id = rs.getString("id");
String pw = rs.getString("pw");
String name = rs.getString("name");
System.out.println(id + " " + pw + " " + name);
}
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 오류");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("권한 오류");
e.printStackTrace();
} finally {
// conn,psmt, rs
// 열어준 역순으로 닫아주기
try {
if (rs != null)
rs.close();
if (psmt != null)
psmt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
회원관리 프로그램 만들기 예제)
MemberVO.java
package 회원정보관리프로그램;
public class MemberVO {
// 필드 구성 --> 데이터 베이스 컬럼명 동일
private String id;
private String pw;
private String name;
// 생성자 만들기
public MemberVO(String id, String pw, String name) {
this.id = id;
this.pw = pw;
this.name = name;
}
public MemberVO(String id, String pw) {
this.id = id;
this.pw = pw;
}
// Getter / Setter
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
DAO.java
package 회원정보관리프로그램;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class DAO {
private Connection conn;
private PreparedStatement psmt;
private ResultSet rs;
private void getConnection() { // connection 해주는 메소드
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String db_id = "hr";
String db_pw = "hr";
conn = DriverManager.getConnection(url, db_id, db_pw);
if (conn != null) {
System.out.println("연결 성공");
} else {
System.out.println("연결 실패");
}
} catch (ClassNotFoundException e) {
System.out.println("드라이버 연결 실패");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("권한 부여 실패");
e.printStackTrace();
}
}
private void close() {
try {
if (rs != null) {
rs.close();
}
if (psmt != null) {
psmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 회원가입 메소드
public int insert(String id, String pw, String name) {
int cnt = 0; // 리턴받기위한 변수
try {
getConnection();
String sql = "INSERT INTO MEM values(?,?,?)";
psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, name);
cnt = psmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return cnt;
}
// 회원 조회
public ArrayList<MemberVO> select(){
ArrayList<MemberVO> list = new ArrayList<>();
try {
getConnection();
String sql = "select * from mem";
psmt = conn.prepareStatement(sql);
rs = psmt.executeQuery();
while (rs.next()) {
String id = rs.getString(1);
String pw = rs.getString(2);
String name = rs.getString(3);
MemberVO vo = new MemberVO(id, pw, name);
list.add(vo);
}
} catch(SQLException e) {
e.printStackTrace();
} finally {
close();
}
return list;
}
// 회원 정보 삭제
public int delete(String id) {
int cnt = 0;
try {
getConnection();
String sql = "delete from mem where id = ?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
cnt = psmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return cnt;
}
// 특정회원정보 조회
public MemberVO selectOne(String sid) {
MemberVO vo = null;
try {
getConnection();
String sql = "select * from mem where id = ?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, sid);
rs = psmt.executeQuery();
if(rs.next()) {
String id = rs.getString(1);
String pw = rs.getString(2);
String name = rs.getString(3);
vo = new MemberVO(id,pw,name);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return vo;
}
// 로그인
public MemberVO login(String id, String pw) {
MemberVO vo = null;
try {
getConnection();
String sql = "select * from mem where id = ? and pw = ?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
psmt.setString(2, pw);
rs = psmt.executeQuery();
if(rs.next()) {
id= rs.getString(1);
pw= rs.getString(2);
vo = new MemberVO(id,pw);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return vo;
}
}
+ 로그인 다른 코드화면
main.java
package 회원정보관리프로그램;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
DAO dao = new DAO();
System.out.println("======= 회원정보관리시스템 =======");
while (true) {
System.out.print("[1]로그인 [2]회원가입 [3]전체조회 " + "[4]특정회원조회 [5]회원정보삭제 [6]프로그램종료 >> ");
// [1]로그인 [2]회원가입 [3]전체조회 [4]특정회원조회 [5]회원정보삭제 [6]프로그램종료
int num = sc.nextInt();
if (num == 1) {
System.out.println("로그인");
System.out.print("ID : ");
String id = sc.next();
System.out.print("PW : ");
String pw = sc.next();
MemberVO vo = dao.login(id, pw);
if(vo!= null) {
System.out.println("로그인 완료");
}else {
System.out.println("로그인 실패");
}
} else if (num == 2) {
System.out.println("회원가입");
System.out.print("ID : ");
String id = sc.next();
System.out.print("PW : ");
String pw = sc.next();
System.out.print("Name : ");
String name = sc.next();
int cnt = dao.insert(id, pw, name);
if(cnt>0) {
System.out.println("회원가입완료");
}else {
System.out.println("가입실패");
}
} else if (num == 3) {
System.out.println("전체조회");
ArrayList<MemberVO> list = dao.select();
for(int i=0; i<list.size(); i++) {
System.out.print("id : " + list.get(i).getId()+"\t");
System.out.print("pw : " + list.get(i).getPw()+"\t");
System.out.print("name : " + list.get(i).getName()+"\t");
System.out.println();
}
} else if (num == 4) {
System.out.println("특정회원조회");
System.out.print("ID 입력 >> ");
String sid = sc.next();
MemberVO vo = dao.selectOne(sid);
if(vo != null) {
System.out.println("ID : " +vo.getId()+"/ PW : "+ vo.getPw()+"/ Name : "+vo.getName()+"/ ");
}else {
System.out.println("존재하지 않습니다");
}
} else if (num == 5) {
System.out.println("회원정보삭제");
System.out.print("삭제할 ID 입력 >> ");
String id = sc.next();
int cnt = dao.delete(id);
if(cnt>0) {
System.out.println("삭제 완료");
}else {
System.out.println("삭제 실패");
}
} else if (num == 6) {
System.out.println("프로그램종료");
break;
}
}
}
}
+ 로그인 다른코드
'Study > JAVA' 카테고리의 다른 글
JAVA기초 14일차 <MVC패턴, 상속, 추상화> (1) | 2022.09.26 |
---|---|
JAVA기초 13일차 <arraylist> (1) | 2022.09.24 |
JAVA기초 12일차 <객체지향2> (0) | 2022.09.24 |
JAVA기초 11일차 <객체지향> (1) | 2022.09.24 |
JAVA기초 10일차 <메서드> (0) | 2022.09.24 |