자료형
String
"Integer" "apple" 문자열로 인식을 하지만 안에 있는 애가 무슨 타입인지 모른다.
driver = "oracle.jdbc.driver.OracleDriver";
이런식으로 문자열로 가져왔기 때문에 무슨타입인지 알 수가 없다.
그러므로 타입을 Class로 잡는다 → 원하면 Object화 시킬 수 있다.
Class.forName(driver);
class - 예약어 / Class 클래스 타입
Connection을 잡고 다 쓰면 반드시 close 해줘야한다.
finally {
try {
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
SelectMain.java
insert(1개만 삽입가능)
update
delete
lock이 되어있으므로 → commit해줘야함.
→ 개수 리턴해준다. ex) 몇개의 행이 만들어졌습니다. 업데이트됐습니다.
insert → 1번에 1번밖에 못 한다.
100개 데이터 넣으려고 100번하면 서버 다운된다.
프로그램짜서 집어넣야한다. (덤프파일)
select는 개수가 나오는게 아니라 테이블 전체의 결과물이 나온다.
→ ResultSet 인터페이스로 들어온다.
select하면 데이터 안에 있는 모든 것을 ResultSet에 담아와서 return 된다.
select하면 반드시 ResultSet 달고온다 생각하면 된다.
String sql = "select * from dbtest";
try {
pstmt = con.prepareStatement(sql);//생성
rs = pstmt.executeQuery();//실행
select만 Query이다.
rs.size() / rs.length() 없다.
rs.next() - 현재 위치에 레코드(한 줄)가 있으면 true / 없으면 false
- 다음 레코드로 이동
rs.getString("name")
rs.getString(1) 1번 위치의 값을 꺼내와라 → 항목 많으니 이렇게 하면 좋지는 않음
rs.getInt("age") / rs.getInt(2)
rs.getDouble("height") / rs.getDouble(3)
날짜를 꺼내올 때
rs.getDate("logtime")
rs.getString("logtime")// (연산을 하는 것이 아닌 화면에 찍어만 낼 때)
while(rs.next()) {
System.out.println(rs.getString("name") + "\t"
+ rs.getInt("age") + "\t"
+ rs.getDouble("height") + "\t"
+ rs.getString("logtime"));
}//while
finally {
try {
//생성한 순서 반대로 close 해주기!!
if(rs!= null) rs.close();
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
SelectMain.java
package dbtest.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SelectMain {
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@localhost:1521:xe";
private String username = "C##JAVA";
private String password = "1234";
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
public SelectMain() {
try {
Class.forName(driver);//생성
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public void getConnection() {
try {
con = DriverManager.getConnection(url, username, password);
System.out.println("connection");
} catch (SQLException e) {
e.printStackTrace();
}
}
public void selectArticle() {
getConnection();//접속
String sql = "select * from dbtest";
try {
pstmt = con.prepareStatement(sql);//생성
rs = pstmt.executeQuery();//실행
while(rs.next()) {
System.out.println(rs.getString("name") + "\t"
+ rs.getInt("age") + "\t"
+ rs.getDouble("height") + "\t"
+ rs.getString("logtime"));
}//while
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
//생성한 순서 반대로 !!
if(rs!= null) rs.close();
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new SelectMain().selectArticle();
}
}
connection
홍길동 27 185.3 2024-07-24 16:25:00
코난 14 15.3 2024-07-24 16:25:27
commit을 시켜줘야만 데이터가 반영이 된다.
insert / update / delete는 반드시 commit !!
connection
홍길동 27 185.3 2024-07-24 16:25:00
코난 14 15.3 2024-07-24 16:25:27
또치 50 138.6 2024-07-25 10:20:23
코코 8 100.6 2024-07-25 10:20:35
Java project : memeber
Package : member.main
Class : IndexMain.java - main()
→ html. css. js 로 바뀜.
Package : member.service
Interface : Member.java
public void execute();
Class : WriteService.java
LoginService.java
Package : member.bean
Class : MemberDTO.java
Package : member.dao
Class : MemberDAO.java (Data Access Object)
→얘네는 하나도 안 바뀜.
Folder : lib
File : ojdbc11.jar
lombok.jar
Build Path까지 해줘서 참조값 준다.
데이터 : 이름(name), 아이디(id), 비밀번호(pwd), 핸드폰(phone)
테이블 : member
컬럼 : 이름 - 15자리
아이디 - 30자리
비밀번호 - 50자리
핸드폰 - 20자리
Folder : sql
File : member.sql
member.sql (제약조건 걸어주기) - 이렇게 써놔야 나중에 나도 편하고 다른 사람도 편하다.
id는 primary key로 설정하여 중복이 안되게 함과 동시에 null 값이 들어가지 못 하게 한다.
phone도 unique이므로 중복이 안되게 한다.
나머지 전부 not null이라는 제약조건을 걸어 null값이 들어가지 못 하게 하였다.
-- ORACLE
CREATE TABLE member(
name VARCHAR2(15) not null,
id VARCHAR2(30) primary key, -- 중복허용(무결성 제약조건), not null
pwd VARCHAR2(50) not null,
phone VARCHAR2(20) unique);
MemberDTO.java - lombok을 이용해서 간편하게 getter / setter를 설정한다.
package member.bean;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class MemberDTO {
private String name;
private String id;
private String pwd;
private String phone;
}
자동으로 설정이 되는 것을 확인할 수 있다.
IndexMain.java - menu()
package member.main;
import java.util.Scanner;
import member.service.DeleteService;
import member.service.LoginService;
import member.service.Member;
import member.service.UpdateService;
import member.service.WriteService;
public class IndexMain {
public void menu() {
Scanner scan = new Scanner(System.in);
int num;
Member member = null;
Member member라는 리모콘을 만든다.
while(true) {
System.out.println();
System.out.println("**********************");
System.out.println(" 1. 회원가입");
System.out.println(" 2. 로그인");
System.out.println(" 3. 회원정보수정");
System.out.println(" 4. 회원탈퇴");
System.out.println(" 5. 끝");
System.out.println("**********************");
System.out.print(" 번호 입력 : ");
num = scan.nextInt();
if(num == 5)
break;
if(num == 1)
member = new WriteService();
else if(num == 2)
member = new LoginService();
else if(num == 3)
member = new UpdateService();
else if(num == 4)
member = new DeleteService();
member.execute();
}//while
리모콘을 통해 각각의 클래스를 new해주고
인터페이스에 구현된 execute()를 이용해 다른 클래스들을 호출해준다.
}//menu()
public static void main(String[] args) {
IndexMain indexMain = new IndexMain();
indexMain.menu();
System.out.println("프로그램을 종료합니다.");
}
}
main에서는 menu()함수만 호출한다. 나머지 기능은 다른 클래스에서 하도록한다.
WriteService.java - 회원가입
package member.service;
import java.util.Scanner;
import member.bean.MemberDTO;
public class WriteService implements Member{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
MemberDTO memberDTO = new MemberDTO();
System.out.println("이름 입력 : ");
memberDTO.setName(scan.next());
System.out.println("아이디 입력 : ");
memberDTO.setId(scan.next());
System.out.println("비밀번호 입력 : ");
memberDTO.setPwd(scan.next());
System.out.println("핸드폰입력(010-1234-5678) : ");
memberDTO.setPhone(scan.next());
}
}
MemberDAO memberDAO = new MemberDAO();
new해서 계속 생성하면 안되고 한 번 만든 거를 갖다가 써야한다.
싱글톤 처리해야된다.
WriteService에 밑에 코드를 추가해줘야한다.
//DB - 싱글톤
MemberDAO memberDAO = MemberDAO.getInstance();
MemberDAO.java
private static MemberDAO instance;
static으로 했으므로 메모리에 한 번만 저장된다.
public static MemberDAO getInstance() {
if(instance == null) {
synchronized (MemberDAO.class) {
instance = new MemberDAO();
}
}
return instance;
}
MemberDAO를 여러번 불러도 위에 코드때문에 메모리에 1번밖에 안 잡힌다. - Singleton
[다른방법] - 이거 더 추천 ★
private static MemberDAO instance = new MemberDAO();
stactic이므로 한 번밖에 수행 안 한다.
public static MemberDAO getInstance() {
/*
if(instance == null) {
synchronized (MemberDAO.class) {
instance = new MemberDAO();
}
}
*/
return instance;
}
instance만 보내주면 된다!!!! - 잔머리 굴리기
WriteService.java
//입력
int su = memberDAO.write(memberDTO);
System.out.println(su + "개의 행이 만들어졌습니다.");
MemberDAO.java
public int write(MemberDTO memberDTO) {
int su = 0;
return su;
}
WriteService.java (DB - 싱글톤 생성한 데까지 코드)
package member.service;
import java.util.Scanner;
import member.bean.MemberDTO;
import member.dao.MemberDAO;
public class WriteService implements Member{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
MemberDTO memberDTO = new MemberDTO();
System.out.print("이름 입력 : ");
memberDTO.setName(scan.next());
System.out.print("아이디 입력 : ");
memberDTO.setId(scan.next());
System.out.print("비밀번호 입력 : ");
memberDTO.setPwd(scan.next());
System.out.print("핸드폰입력(010-1234-5678) : ");
memberDTO.setPhone(scan.next());
//DB - 싱글톤
MemberDAO memberDAO = MemberDAO.getInstance();
//입력
int su = memberDAO.write(memberDTO);
System.out.println(su + "개의 행이 만들어졌습니다.");
}
}
WriteService.java
package member.service;
import java.util.Scanner;
import member.bean.MemberDTO;
import member.dao.MemberDAO;
public class WriteService implements Member{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
//DB - 싱글톤
MemberDAO memberDAO = MemberDAO.getInstance();
System.out.print("이름 입력 : ");
String name = scan.next();
System.out.print("아이디 입력 : ");
String id = scan.next();
System.out.print("비밀번호 입력 : ");
String pwd = scan.next();
System.out.print("핸드폰입력(010-1234-5678) : ");
String phone = scan.next();
MemberDTO memberDTO = new MemberDTO();
memberDTO.setName(name);
memberDTO.setId(id);
memberDTO.setPwd(pwd);
memberDTO.setPhone(phone);
//입력
int su = memberDAO.write(memberDTO);
System.out.println(su + "개의 행이 만들어졌습니다.");
}
}
입력받은 값을 memberDTO에 다 넣어준다.
memberDTO를 매개변수로 하여 memberDAO의 write메소드를 부른다.
MemberDAO.java - write()
public int write(MemberDTO memberDTO) {
int su = 0;
getConnection();
String sql = "insert into member values(?,?,?,?)";
try {
pstmt = con.prepareStatement(sql);
//?에 데이터 매핑
pstmt.setString(1, memberDTO.getName());
pstmt.setString(2, memberDTO.getId());
pstmt.setString(3, memberDTO.getPwd());
pstmt.setString(4, memberDTO.getPhone());
su = pstmt.executeUpdate();
memberDTO에 받아온 name, id, pwd, phone을 sql문에 매핑하여 데이터를 삽입해준다.
}catch (SQLException e) {
e.printStackTrace();
}finally {
//close 할 때는 거꾸로 닫아준다.
try {
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return su;
}
실행한 sql문의 개수를 반환해준다.
몇개의 행이 반환했는지를 출력해준다.
데이터 값이 들어간 것을 확인할 수 있다.
@Data로 하게 되면 다 잡히게 된다.
하지만 우리는 getter / setter 방식을 이용 !
쓰레기값까지 다 지워졌다.
제약조건 걸기 !
member.sql
-- ORACLE
CREATE TABLE member(
name VARCHAR2(15) not null,
id VARCHAR2(30) primary key, -- 중복허용(무결성 제약조건), not null
pwd VARCHAR2(50) not null,
phone VARCHAR2(20) unique);
[제약조건 위반]
1. 아이디, 비밀번호 중복
2. 핸드폰 중복
id는 primart key로 설정하였으며 핸드폰은 unique로 설정했기 때문에 중복되면
제약조건에 위반되어 error가 뜨는 것을 확인할 수 있다.
[아이디 중복 체크]
//중복 체크
isExistId 메소드 만들기
리턴된 값이 true이면 "사용 중인 아이디입니다."라고 출력하고 다시 입력 받는다.
false이면 "사용 가능한 아이디"라고 출력하고 비밀번호 입력받으러 간다.
WriteService.java - 로그인
String id = null;
while(true) {
System.out.print("아이디 입력 : ");
id = scan.next();
boolean exist = memberDAO.isExistId(id);
if(exist) {
System.out.println("사용 중인 아이디입니다.");
}
else {
System.out.println("사용 가능한 아이디");
break;
}
}//while
System.out.print("비밀번호 입력 : ");
String pwd = scan.next();
System.out.print("핸드폰입력(010-1234-5678) : ");
String phone = scan.next();
- 아이디를 입력받고 memberDAO.isExistId(id)를 호출하여 해당 아이디가 이미 존재하는지 확인한다.
- 아이디가 중복되면 "사용 중인 아이디입니다."를 출력하고, 중복되지 않으면 "사용 가능한 아이디"를 출력하며 루프를 종료한다.
MemberDAO.java - isExistId()
public boolean isExistId(String id){
boolean exist = false;
getConnection();
String sql = "select id from member where id = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
exist = true;
}else
exist = false;
isExistId 메서드는 String 타입의 id를 매개변수로 받고 boolean 값을 반환한다.
매개변수로 받은 id를 sql문에 매핑하여 id가 있는지 확인을 하고
있으면 true를 반환하고 없으면 false를 반환한다.
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
//생성한 순서 반대로 !!
if(rs!= null) rs.close();
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return exist;
}
WriteService.java
String id = null;
while(true) {
System.out.print("아이디 입력 : ");
id = scan.next();
boolean exist = memberDAO.isExistId(id);
if(exist) {
System.out.println("사용 중인 아이디입니다.");
}
else {
System.out.println("사용 가능한 아이디");
break;
}
}//while
입력받은 값이 true면 "사용 중인 아이디입니다."를 출력하고 다시 아이디를 입력할 수 있도록 한다.
입력받은 값이 false면 "사용 가능한 아이디입니다."를 출력하고 while문을 빠져나간다.
System.out.print("비밀번호 입력 : ");
String pwd = scan.next();
System.out.print("핸드폰입력(010-1234-5678) : ");
String phone = scan.next();
MemberDTO memberDTO = new MemberDTO();
memberDTO.setName(name);
memberDTO.setId(id);
memberDTO.setPwd(pwd);
memberDTO.setPhone(phone);
//입력
int su = memberDAO.write(memberDTO);
System.out.println(su + "개의 행이 만들어졌습니다.");
}
}
빠져나와서 나머지 비밀번호와 핸드폰도 입력을 하고 입력받은 값을 memberDTO에 넣어서
memberDAO에 있는 write() 메소드를 부른다.
사진 설명을 입력하세요.
WriteService.java
package member.service;
import java.util.Scanner;
import member.bean.MemberDTO;
import member.dao.MemberDAO;
public class WriteService implements Member{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
//DB - 싱글톤
MemberDAO memberDAO = MemberDAO.getInstance();
System.out.print("이름 입력 : ");
String name = scan.next();
String id = null;
while(true) {
System.out.print("아이디 입력 : ");
id = scan.next();
boolean exist = memberDAO.isExistId(id);
if(exist) {
System.out.println("사용 중인 아이디입니다.");
}
else {
System.out.println("사용 가능한 아이디");
break;
}
}//while
위에 MemberDAO의 isExistId를 통해 exist에 true 또는 false 값을 받아오게 된다.
그 값에따라 다르게 실행되도록 if문을 걸어준다.
System.out.print("비밀번호 입력 : ");
String pwd = scan.next();
System.out.print("핸드폰입력(010-1234-5678) : ");
String phone = scan.next();
MemberDTO memberDTO = new MemberDTO();
memberDTO.setName(name);
memberDTO.setId(id);
memberDTO.setPwd(pwd);
memberDTO.setPhone(phone);
//입력
int su = memberDAO.write(memberDTO);
System.out.println(su + "개의 행이 만들어졌습니다.");
}
}
사용가능한 아이디일 때 비로소야 입력받은 값을 memberDTO 안에 하나씩 넣어주고
memeberDTO를 매개변수로 하여 memberDAO의 write 메소드가 불려진다.
write 메소드 안에서 insert가 일어나고 데이터가 들어가게 되는 것이다.
[결과]
로그인
아이디 입력 : hong
비밀번호 입력 : 113
아이디 또는 비밀번호가 맞지 않습니다.
-------------------------------------------------
아이디 입력 : hong
비밀번호 입력 : 111
홍길동님 로그인
LoginService.java - 로그인
package member.service;
import java.util.Scanner;
import member.dao.MemberDAO;
public class LoginService implements Member{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
System.out.print("아이디 입력 : ");
String id = scan.next();
System.out.print("비밀번호 입력 : ");
String pwd = scan.next();
로그인할 아이디와 비밀번호를 입력받는다.
//DB - 싱글톤
MemberDAO memberDAO = MemberDAO.getInstance();
String name = memberDAO.login(id, pwd);
memberDAO의 login메소드에 id와 pw를 매개변수로 넘겨준다.
그리고 누가 로그인했는지도 출력하기 위해서 나중에 받아올 값을 name으로 설정해놓는다.
MemberDAO.java - login()
public String login(String id, String pwd) {
String name = null;
getConnection();
String sql = "select * from member where id = ? and pwd = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
rs = pstmt.executeQuery();
LoginService에서 넘긴 매개변수 id와 pwd를 sql문에 매핑해준다.
String sql = "select * from member where id = ? and pwd = ?";
→ 입력한 id와 pwd가 둘 다 맞을시 select하여 레코드를 가져와서 rs에 넣는다.
if(rs.next()) {
name = rs.getString("name");
}else
name = null;
위에 sql문에서 레코드가 반환되어 true값이면 그 레코드의 name을 꺼낸다.
반환받은 값이 없으면 name에 null값을 넣는다.
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
//생성한 순서 반대로 !!
if(rs!= null) rs.close();
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return name;
}
name을 리턴해준다. → ~님이 로그인 했다는 문구를 출력하기 위해서 name을 리턴하는 것이다.
LoginService.java
if(name == null) {
System.out.println("아이디 또는 비밀번호가 맞지 않습니다.");
}else {
System.out.println(name + "님이 로그인");
}
}
}
반환받은 name의 값이 null이면 아이디 또는 비밀번호가 맞지 않습니다.를 출력하고
null이 아니면 반환받은 name 값을 통해 ~님이 로그인했음을 출력한다.
**********************
1. 회원가입
2. 로그인
3. 회원정보수정
4. 회원탈퇴
5. 끝
**********************
번호 입력 : 2
아이디 입력 : hong
비밀번호 입력 : 111
홍길동님이 로그인
**********************
1. 회원가입
2. 로그인
3. 회원정보수정
4. 회원탈퇴
5. 끝
**********************
번호 입력 : 2
아이디 입력 : hong
비밀번호 입력 : 122
아이디 또는 비밀번호가 맞지 않습니다.
[회원정보 수정]
아이디 검색 : angel
검색한 아이디가 없습니다.
아이디 검색 : hong
홍길동 hong 111
수정할 이름 입력 : 홍당무
수정할 비밀번호 입력 : 333
X개의 행을 수정하였습니다.
UpdateService.java
package member.service;
import java.util.Scanner;
import member.bean.MemberDTO;
import member.dao.MemberDAO;
public class UpdateService implements Member {
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
System.out.print("아이디 검색 : ");
String id = scan.next();
MemberDAO memberDAO = MemberDAO.getInstance();
MemberDTO memberDTO = memberDAO.getMember(id);
if(memberDTO == null) {
System.out.println("검색한 아이디가 없습니다.");
return;
}
System.out.println(memberDTO);
검색한 아이디가 있는지 없는지 먼저 확인한다. 확인 후 있으면 값을 출력하도록 할 것이다.
입력한 id를 memberDAO에 있는 getMember 메소드의 매개변수로 넘겨준다.
MemberDAO - MemberDTO getMember()
public MemberDTO getMember(String id) {
MemberDTO memberDTO = null;
getConnection();
String sql = "select * from member where id = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
매개변수로 받은 id를 sql문에 넣어 레코드를 가져온다.
if(rs.next()) {
memberDTO = new MemberDTO();
memberDTO.setName(rs.getString("name"));
memberDTO.setId(rs.getString("id"));
memberDTO.setPwd(rs.getString("pwd"));
memberDTO.setPhone(rs.getString("phone"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return memberDTO;
}
그리고 그 받은 레코드가 있으면 레코드에 있는 name, id, pwd, phone을 memberDTO에 하나씩 담아서
마지막에 한 번에 return 해준다.
받은 값이 있으면 받아서 memberDTO가 반환되는 것이고
없으면 null값이 반환되는 것이다.
memberDTO가 null값일 때는 검색한 아이디가 없다고 뜨고
그러지 않으면 밑에처럼 값을 출력해주는 코드를 통해 값들을 반환해준다.
UpdateService.java
System.out.println(memberDTO);
이 코드를 통해서 name, id, pwd, phone을 출력해준다.
@Override
public String toString() {
return name + "\t"
+ id + "\t"
+ pwd + "\t"
+ phone;
}
MemberDTO에 toString()을 오버라이딩 해줘서 이용하는게 편리하다.
이제 값을 수정해주는 부분이다.
System.out.print("수정할 이름 입력 : ");
String name = scan.next();
System.out.print("수정할 비밀번호 입력 : ");
String pwd = scan.next();
System.out.print("수정할 핸드폰 입력(010-1234-5678) : ");
String phone = scan.next();
//Map<String, String> map = new HashMap<>();
//map.put("name", name);
//map.put("pwd", pwd);
//map.put("phone", phone);
//map.put("id", id);
//int su = memberDAO.update(map);
int su = memberDAO.update(id, name, pwd, phone);
System.out.println(su + "개의 행이 수정되었습니다.");
}
}
수정할 이름, 비밀번호, 핸드폰 번호를 입력한다.
id, name, pwd, phone을 매개변수로 memberDAO의 update()메소드로 간다.
MemberDAO.java
public int update(String id, String name, String pwd) {
int su = 0;
getConnection();
String sql = "update member set name = ?, pwd = ? where id = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, pwd);
pstmt.setString(3, id);
su = pstmt.executeUpdate();
매개변수로 받은 값을 sql문에 매핑해줌으로써 값들이 update 된다.
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return su;
}
su = pstmt.executeUpdate();를 통해 개수를 받게 되고,
몇개를 업데이트 했는지 su값을 리턴해줘서 출력되게 한다.
[회원탈퇴]
아이디 입력 : hong
비밀번호 입력 : 1234
비밀번호가 맞지 않습니다.
아이디 입력 : hong
비밀번호 입력 : 111
x개의 행이 삭제되었습니다.
DeleteService.java - 회원탈퇴
package member.service;
import java.util.Scanner;
import member.dao.MemberDAO;
public class DeleteService implements Member {
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
MemberDAO memberDAO = MemberDAO.getInstance();
while(true) {
System.out.print("아이디 입력 : ");
String id = scan.next();
System.out.print("비밀번호 입력 : ");
String pwd = scan.next();
boolean cor = memberDAO.isCor(id, pwd);
아이디와 비밀번호를 입력받아서 매개변수로 memberDAO에 있는 isCor() 메소드로 보내준다.
입력한 아이디의 비밀번호가 맞아야만 탈퇴할 수 있게 할 것이기 때문이다.
MemberDAO - isCor() - 입력한 아이디의 비밀번호가 맞는지 확인
public boolean isCor(String id, String pwd) {
boolean cor = false;
getConnection();
String sql = "select pwd from member where id = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
if(pwd.equals(rs.getString("pwd")))
cor = true;
}else
cor = false;
입력받은 id를 기준으로 pwd의 값을 가져온다.
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
//생성한 순서 반대로 !!
if(rs!= null) rs.close();
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return cor;
}
가져온 pwd의 값과 내가 입력한 pwd가 같은지 확인하고 같으면 cor에 true를 반환하고
다르면 cor에 false를 반환한다.
DeleteService.java
if(cor) {
int su = memberDAO.delete(id);
System.out.println(su + "개의 행이 삭제되었습니다.");
break;
}else {
System.out.println("비밀번호가 맞지 않습니다.");
}
}
}
}
반환받은 cor의 값이 true이면 id값을 매개변수로 memberDAO의 delete()메소드를 부른다.
MemberDAO - delete()
public int delete(String id) {
int su = 0;
getConnection();
String sql = "delete member where id = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
su = pstmt.executeUpdate();
매개변수로 받은 id를 sql문에 매핑하여 해당하는 레코드를 삭제해준다.
}catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return su;
}
삭제된 개수를 su를 통해 반환해줌으로써 몇개의 행이 삭제되었는지 출력해준다.
'JAVA' 카테고리의 다른 글
DAY 15 - Thread / Synchronized (2024.07.23) (0) | 2024.08.09 |
---|---|
DAY 16 - LOMBOK / 시퀀스 객체 / JDBC / DB 연결 (2024.07.24) (0) | 2024.08.09 |
DAY 19 - Lambda (2024.07.29) (0) | 2024.08.07 |
DAY 20 - Network (2024.07.30) (0) | 2024.08.07 |
DAY 21 - Network Thread (2024.07.31) (0) | 2024.08.06 |