이번 게시글에서는 늘 사용하는 연결과정을 분리하여 코드를 단축하고 MemberDto 혹은 HashMap을 사용하여 회원정보를 관리해볼 것이다.
insert update delete는 이 3가지 작업은 작업과정이 비슷하다.
보통은 사용할 변수와 메소드를 정의하는 부분, 실행할 sql 문과 바인딩하는 부분만 다르다.
주로 수정하는 범위에 주목하여 학습해보자.
MainClass06 (DBConnect에 DB 연결과정 분리해놓기)
package test.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import test.util.DBConnect;
public class MainClass06 {
public static void main(String[] args) {
//member_seq 이라는 시퀀스를 이용해서 아래의 회원정보를 추가 하고자 한다.
String name="원숭이";
String addr="상도동";
Connection conn=null;
PreparedStatement pstmt=null;
try {
//DBConnect 객체를 이용해서 Connection 객체의 참조값을 얻어온다.
conn=new DBConnect().getConn();
//실행할 sql 문
String sql="INSERT INTO member"
+ " (num, name, addr)"
+ " VALUES(member_seq.NEXTVAL, ?, ?)";
//PreparedStatement 객체 얻어내기
pstmt=conn.prepareStatement(sql);
//? 바인딩 할게 있으면 바인딩 한다.
pstmt.setString(1, name);
pstmt.setString(2, addr);
//실행
pstmt.executeUpdate();
System.out.println("회원정보를 저장했습니다.");
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
}catch(Exception e) {}
}
}
}
이 작업이 기존의 DML작업과 다른점은 DBConnect에 DB 연결과정을 분리했다는 점이다.
DBConnect에서 .getConn()에 분리한부분을 실행하는 메소드를 저장해놓고
MainClass06에서 conn=new DBConnect().getConn(); 을 사용하여 메소드를 실행했다.
예시에서 num 칼럼은 member_seq 이라는 시퀀스를 이용해서 작성했다.
MainClass07 (MemberDto 사용하여 DB 작업하기)
package test.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import test.dto.MemberDto;
import test.util.DBConnect;
public class MainClass07 {
public static void main(String[] args) {
//member 테이블에 추가할 회원의 정보
String name="주뎅이";
String addr="봉천동";
//회원 한명의 정보를 MemberDto 객체에 담고
MemberDto dto=new MemberDto();
dto.setName(name);
dto.setAddr(addr);
//메소드를 호출하면서 MemberDto 객체를 전달한다.
insert(dto);
}
//회원 한명의 정보를 추가하는 메소드
private static void insert(MemberDto dto) {
//MemberDto 객체에 담긴 회원 정보를 DB에 저장하는 작업을 해 보세요.(시퀀스 사용하기)
Connection conn=null;
PreparedStatement pstmt=null;
try {
//DBConnect 객체를 이용해서 Connection 객체의 참조값을 얻어온다.
conn=new DBConnect().getConn();
//실행할 sql 문
String sql="INSERT INTO member"
+ " (num, name, addr)"
+ " VALUES(member_seq.NEXTVAL, ?, ?)";
//PreparedStatement 객체 얻어내기
pstmt=conn.prepareStatement(sql);
//? 바인딩 할게 있으면 바인딩 한다.
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
//실행
pstmt.executeUpdate();
System.out.println("회원정보를 저장했습니다.");
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
}catch(Exception e) {}
}
}
}
2022.08.01 - [java] - Step12_UtilClass (ArrayList 활용 객체 배열, Member, MemberDto)
MemberDto는 중략하였다. 작성 방법은 필드랑 생성자만 작성하고 양식을 가져오면 된다. 자세한 방식은 위의 링크에 MemberDto 만드는 방법을 참고하면 된다.
MainClass07에서 MemberDto 객체를 생성하고 만들어둔 setter getter 메소드들을 활용해서 작업했다.
MainClass08 (HashMap 객체에 담아 DB 작업하기)
package test.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;
import test.util.DBConnect;
public class MainClass08 {
public static void main(String[] args) {
String name="덩어리";
String addr="상도동";
//추가할 회원 정보를 Map 객체에 담고
Map<String, String> mem=new HashMap<>();
mem.put("name", name);
mem.put("addr", addr);
//insert 메소드에 전달해서 DB 에 저장되는 기능을 완성해 보세요.
insert(mem);
}
//인자로 전달 받은 Map 객체에 있는 회원 정보를 DB에 저장하는 메소드
public static void insert(Map<String, String> map) {
//MemberDto 객체에 담긴 회원 정보를 DB에 저장하는 작업을 해 보세요.(시퀀스 사용하기)
Connection conn=null;
PreparedStatement pstmt=null;
try {
//DBConnect 객체를 이용해서 Connection 객체의 참조값을 얻어온다.
conn=new DBConnect().getConn();
//실행할 sql 문
String sql="INSERT INTO member"
+ " (num, name, addr)"
+ " VALUES(member_seq.NEXTVAL, ?, ?)";
//PreparedStatement 객체 얻어내기
pstmt=conn.prepareStatement(sql);
//? 바인딩 할게 있으면 바인딩 한다.
pstmt.setString(1, map.get("name"));
pstmt.setString(2, map.get("addr"));
//실행
pstmt.executeUpdate();
System.out.println("회원정보를 저장했습니다.");
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
}catch(Exception e) {}
}
}
}
2022.08.01 - [java] - Step12_UtilClass (HashMap, HashSet)
MainClass07에서 MemberDto를 사용하여 DML작업을 했다면 MainClass08에서는 HashMap을 사용하였다.
HashMap 사용법은 위의 링크를 참고하면 좋고 HashMap에서 주로 사용하는 put, get 메소드를 예시에서도 사용하였는데 사용법에 유의해야 한다.
MainClass09 (UPDATE 작업하기, 회원정보 일부 수정)
package test.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import test.dto.MemberDto;
import test.util.DBConnect;
public class MainClass09 {
public static void main(String[] args) {
//수정할 회원의 정보
int num=1;
String name="호빵";
String addr="아현동";
//아래의 update() 메소드를 활용해서 회원 정보를 수정할 수 있도록 해 보세요.
MemberDto dto=new MemberDto(num, name, addr);
update(dto);
}
public static void update(MemberDto dto) {
Connection conn=null;
PreparedStatement pstmt=null;
try {
//DBConnect 객체를 이용해서 Connection 객체의 참조값을 얻어온다.
conn=new DBConnect().getConn();
//실행할 sql 문
String sql="UPDATE member"
+ " SET name=?, addr=?"
+ " WHERE num=?";
//PreparedStatement 객체 얻어내기
pstmt=conn.prepareStatement(sql);
//? 바인딩 할게 있으면 바인딩 한다.
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
pstmt.setInt(3, dto.getNum());
//실행
pstmt.executeUpdate();
System.out.println("회원정보를 저장했습니다.");
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
}catch(Exception e) {}
}
}
}
MemberDto를 사용하여 해당 위치(예시에서는 num=1)의 행의 정보들을 수정하였다.
insert update delete는 이 3가지 작업은 작업과정이 비슷하다. 보통은 사용할 변수와 메소드를 정의하는 부분, 실행할 sql 문과 바인딩하는 부분만 다르다.
MainClass10 (DELETE 작업하기)
package test.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import test.util.DBConnect;
public class MainClass10 {
public static void main(String[] args) {
//삭제할 회원의 번호
int num=1;
//메소드 호출하면서 삭제할 회원의 번호 전달하기
delete(num);
}
//인자로 전달된 번호에 해당하는 회원의 정보를 삭제하는 메소드
public static void delete(int num) {
Connection conn=null;
PreparedStatement pstmt=null;
try {
//DBConnect 객체를 이용해서 Connection 객체의 참조값을 얻어온다.
conn=new DBConnect().getConn();
//실행할 sql 문
String sql="DELETE FROM member"
+ " WHERE num=?";
//PreparedStatement 객체 얻어내기
pstmt=conn.prepareStatement(sql);
//? 바인딩 할게 있으면 바인딩 한다.
pstmt.setInt(1, num);
//실행
pstmt.executeUpdate();
System.out.println("회원정보를 저장했습니다.");
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
}catch(Exception e) {}
}
}
}
MainClass09의 내용을 수정하여 작업하였다. 해당 위치의 행을 삭제하는 코드를 작성하였다.
MainClass11 (Dto와 SELECT, return 위치)
package test.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import test.dto.MemberDto;
import test.util.DBConnect;
public class MainClass11 {
public static void main(String[] args) {
int num=1;
//지역 변수 num 에 담긴 내용을 메소드의 인자로 전달해서 회원 한명의 정보를 얻어낸다.
MemberDto dto=getData(num);
if(dto == null) {
System.out.println(num+" 번 회원은 존재 하지 않습니다.");
}else {
System.out.println(num+" 번 회원의 이름은 "+dto.getName()+
" 이고 주소는 "+dto.getAddr()+" 입니다.");
}
}
//인자로 전달되는 번호에 해당되는 회원 한명의 정보를 리턴하는 메소드
public static MemberDto getData(int num){
//필요한 객체를 담을 지역 변수를 미리 만든다.
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
MemberDto dto=null;
try {
conn=new DBConnect().getConn();
//실행할 sql문 구성하기
String sql="SELECT name, addr"
+ " FROM member"
+ " WHERE num=?";
pstmt=conn.prepareStatement(sql);
// ? 에 바인딩 할 내용이 있으면 한다.
pstmt.setInt(1, num);
// select 문 수행하고 결과를 ResultSet 으로 얻어내기
rs=pstmt.executeQuery();
/*
* primary key 로 select 를 하게 되면 select 된 row 는 최대 1개 이므로
* cursor 를 반복문 돌면서 여러번 내릴 필요가 없다.
* 즉 rs.next() 는 한번만 수행되면 된다.
*/
if(rs.next()) {
//커서가 위치한 곳에서 select 된 칼럼 정보를 얻어낸다.
String name=rs.getString("name");
String addr=rs.getString("addr");
//select 된 정보를 MemberDto 객체를 생성해서 담는다.
dto=new MemberDto();
dto.setNum(num);
dto.setName(name);
dto.setAddr(addr);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(rs!=null)rs.close();
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
}catch(Exception e) {}
}
//select 된 row 가 없다면 dto 는 null 이다.
return dto;
}
}
MemberDto를 활용하여 SELECT 작업을 수행하는 코드를 작성했다.
만약 null이 return 된다면 회원의 정보가 없다는 뜻이 된다.
return의 위치에 유의하여 코드를 작성해야한다.
'java' 카테고리의 다른 글
Step17_JBDC (작업성공여부, MemberDao) (0) | 2022.08.08 |
---|---|
Step17_JBDC (DML 응용 예제, JFrame 응용 예제) (0) | 2022.08.05 |
Step17_JBDC 예제 (0) | 2022.08.05 |
Step17_JBDC (ojdbc8.jar, DB연동하기, DML사용) (0) | 2022.08.05 |
심화 예제 (Quiz Step13~16) (0) | 2022.08.04 |