Model getter/setter toString 포함
public class Member {
// 필드부 => 변수
// --> DB 테이블의 컬럼명과 매칭시켜서 정의
private int userNo;
private String userId;
private String userPw;
private String userName;
private String gender;
private int age;
private String email;
private String address;
private String phone;
private String hobby;
private Date enrollDate
시작
1. 호출용 Run 메소드
new MemberMenu().mainMenu();
View class 작성
View : 사용자가 보게 될 화면 (시각적인 요소들)
입력 및 출력을 담당
필드부 :
private Scanner sc = new Scanner(System.in);
private MemberController mc = new MemberController();
입력을 위한 Scanner 생성과
사용자 요청을 처리하기 위한
Controller 객체 생성
메소드부 :
ppublic void mainMenu() {
while(true) {
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("6. 회원 이름으로 키워드 검색");
System.out.println("9. 프로그램 종료");
System.out.print(">> 메뉴 번호: ");
int menu = sc.nextInt();
sc.nextLine();
switch(menu) {
case 1:
addMenu();
break;
case 2:
mc.selectList();
break;
case 3:
searchById();
break;
case 4:
updateMenu();
break;
case 5:
deleteMember();
break;
case 6:
searchByName();
break;
case 9:
System.out.println("프로그램 종료합니다...");
return;
}
}
}
입력 1번을 입력을 하면
addMenu() 메소드로 이동을 한다.
public void addMenu() {
System.out.print("아이디 : ");
String userId = sc.nextLine();
System.out.print("비밀번호 : ");
String userPw = sc.nextLine();
System.out.print("이름 : ");
String name = sc.nextLine();
System.out.print("성별 (M/F) : ");
String gender = sc.nextLine().toUpperCase();
// 회원 추가 요청 --> Controller에게 요청
mc.insertMember(userId, userPw, name, gender);
}
유저 아이디, 비밀번호, 이름, 성별을 입력을 받으면
Controller에 있는 insertMember() 메소드로 매개변수 전달
public void insertMember(String userId, String userPw, String name, String gender) {
Member m = new Member(userId, userPw, name, gender);
int result = new MemberService().insertMember(m);
if (result > 0) {
new MemberMenu().displaySuccess("회원 추가 성공!");
} else {
new MemberMenu().displayFailed("회원 추가 실패!");
}
}
1. Member 클래스의 매개변수 생성자를 통해서
아이디, 비밀번호, 이름, 성별 매개변수를 전달
2.int 형 변수 result에 MemberService 생성자를 통해서
insertMember() 메서드를 초기화 시켜준다
Member 클래스의 객체변수 m을
insertMember() 매개변수로 넣어준다
public Member(String userId, String userPw, String userName, String gender2) {
this.userId = userId;
this.userPw = userPw;
this.userName = userName;
this.gender = gender2;
}
3. 해당 int형 변수는
해당 작업이 정상적으로 완료가 되면 1을
실패 시 0 혹은 -1을 반환하게 된다.
1을 반환 시 if문 조건은 참이 되므로
MemberMenu메뉴에 있는
displaySuccess에 문자열을 전달하게 된다
public void displaySuccess(String message) {
System.out.println("서비스 요청 성공 : " + message);
}
0 혹은 -1을 반환 받게 될 경우
new MemberMenu().displayFailed("회원 추가 실패!");
public void displayFailed(String message) {
System.out.println("서비스 요청 실패 : " + message);
}
JDBCTemplate 클래스 :
매번 반복적으로 사용한 코드들을 메소드 호출로 정의하기 위한 클래스이다
(공용 템플릿)
객체를 매번 생성하지 않고 메소드를 호출할 수 있도록.
모든 메소드를 Static 메소드로 정의한다.
- 싱클톤 패턴 : 메모리영역에 한 번만 올려두고 매번 재사용하는 패턴이다
1. getConnection 메소드
public static Connection getConnection(){}
반환타입을 Connection을 준다.
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
,"C##JDBC"
,"JDBC");
conn.setAutoCommit(false);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
return conn;
}
}
Class.forName()메서드를 사용하여
런타임에 클래스를 동적으로 저장한다
OracleDriver가 클래스가 로드되면
이 클래스는 자체적으로 DriverManager에 등록이 된다
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
,"C##JDBC"
,"JDBC");
conn = DriverManager.getConnection(URL,사용자명계정,비밀번호)
DriverManager 드라이버 목록을 유지하며 목록을 사용하여 데이터베이스 연결
conn.setAutoCommit(false);
기본적으로 자동관리이므로 수동관리를 위하여 꺼둔다
} catch(ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void commit(Connection conn){
try {
if(conn != null && !conn.isClosed()) {
conn.commit();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
if(conn != null && !conn,isClosed)
Connection 참조변수 conn이 null이 아니고 conn이 닫혀있지 않다면
conn을 commit 해준다. 주로 DML 작업 시 사용된다.
public static void rollback(Connection conn){
try {
//Connection 객체가 생성되어 있고 (null이 아니고) 닫혀있지 않을 떄
if(conn != null && !conn.isClosed()) {
conn.rollback();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection conn) {
try {
//Connection 객체가 생성되어 있고 (null이 아니고) 닫혀있지 않을 떄
if(conn != null && !conn.isClosed()) {
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement stmt) {
try {
if(stmt != null && !stmt.isClosed()) {
stmt.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
/** ResultSet 객체를 close 처리해주는 메소드
*/
public static void close(ResultSet rset) {
try {
if(rset != null && !rset.isClosed()) {
rset.close();
}
}catch(SQLException e) {
} e.printStackTrace();
}
}
자원해제를 위한
메소드 생성
MemberService 클래스 :
MemberService는 기존 DAO 클래스에서 처리를 해주던
DB접속과 트랜잭션 처리를 해준다
[1] Connection 객체 생성
- jdbc driver 등록
- Connection 객체 생성
[2] DML문 실행 시 트랜잭션 처리
- commit
- rollback
[3] Connection 객체 반납
- close
첫번째로
Service 클래스 작업은
기존 DAO 클래스에서 해주던 작업을 대신 처리해준다
public int insertMember(Member m){
Connection conn = JDBCTemplate.getConnection();
int result = new MemberDao().insertMember(conn,m);
if(result > 0) {
JDBCTemplate.commit(conn);
}else {
JDBCTemplate.rollback(conn);
}
JDBCTemplate.close(conn);
return result;
}
1) Connection 객체 생성
Connection conn = JDBCTemplate.getConnection();
2) DAO 클래스에 전달 받은 데이터(Member m)와
Connection 객체를 전달하여 DB 처리 결과를 받기
int result = new MemberDao().insertMember(conn,m);
3) DML(INSET) 실행 후 트랜잭션 처리
if(result > 0) {
JDBCTemplate.commit(conn);
}else {
JDBCTemplate.rollback(conn);
}
4) Connection 객체 반납
JDBCTemplate.close(conn);
return result;
MemberDao 클래스
:
public int insertMember(Connection conn, Member m) {
String sql = "INSERT INTO MEMBER VALUES (SEQ_USERNO.NEXTVAL,"
+ "?, ?, ?, ?, ?, ?, ?, ?, ?,SYSDATE)";
PreparedStatement pstmt = null;
int result = 0;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, m.getUserId());
pstmt.setString(2, m.getUserPw());
pstmt.setString(3, m.getUserName());
pstmt.setString(4, m.getGender());
pstmt.setInt(5, m.getAge());
pstmt.setString(6, m.getEmail());
pstmt.setString(7, m.getAddress());
pstmt.setString(8, m.getPhone());
pstmt.setString(9, m.getHobby());
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
1) sql 구문 생성 :
String sql = "INSERT INTO MEMBER VALUES (SEQ_USERNO.NEXTVAL,"
+ "?, ?, ?, ?, ?, ?, ?, ?, ?,SYSDATE)";
PreparedStatement 객체를 사용함으로 Statement 메소드의 setString메소드를 활용하므로
?를 sql 구문에 삽입
2) preparedStatement 객체 생성과 반환해줄 int 형 result try문 외부에 선언
PreparedStatement pstmt = null;
int result = 0;
pstmt = null;로 선언
result = 0으로 선언을 한다 .
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, m.getUserId());
pstmt.setString(2, m.getUserPw());
pstmt.setString(3, m.getUserName());
pstmt.setString(4, m.getGender());
pstmt.setInt(5, m.getAge());
pstmt.setString(6, m.getEmail());
pstmt.setString(7, m.getAddress());
pstmt.setString(8, m.getPhone());
pstmt.setString(9, m.getHobby());
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
해당 메소드에서
ResultSet을 사용하지 않는 이유
ResultSet 클래스는 주로 SELECT 쿼리의 결과를 처리할 때 사용이 된다
UPDATE, INSERT, DELETE와 같은 데이터 수정 작업에서는 ResultSet이 필요하지 않다
1) pstmt = conn.prepareStatement() 에 sql 구문을 삽입
2) 순서에 맞게 setXXX 타입 적용
3) result = pstmt.executeUpdate() 메소드 사용
executeUpdate() 데이터를 추가하므로 executeUpdate(); 를 사용한다.
'ORACLE SQL' 카테고리의 다른 글
SQL 아침 복습 자료 문제 풀이_2 (0) | 2024.08.01 |
---|---|
SQL 아침 복습 자료 문제 풀이 (1) | 2024.08.01 |
ORACLE SQL DCL/TCL , view (0) | 2024.07.31 |
ORACLE SQL JAVA 적용 시키기 (0) | 2024.07.30 |
ORACLE SQL DDL 복습 내용 정리 (0) | 2024.07.30 |