DB 연동
create table member_test(
id varchar2(20) primary key,
pwd varchar2(20),
name varchar2(20),
age number
);
insert into member_test values ('aaa', 'aaa', '홍길동', 20);
insert into member_test values ('bbb', 'bbb', '김개똥', 30);
insert into member_test values ('ccc', 'ccc', '고길똥', 40);
commit;
sqldeveloper 에서 연동용 member_test 테이블 하나 미리 생성해둠
프로젝트 생성
package ex01;
public class MemberDTO {
// DB 의 컬럼과 동일한 자료형으로 DTO 생성
private String id, pwd, name;
private int age;
// setter/getter 추가
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
DTO 에는 DB 의 컬럼 자료와 같은 자료형, 컬럼 명으로 변수를 생성
DB 다운로드 경로에 jdbc 폴더 하위에 ojdbc8.jar 라이브러리를 프로젝트에 추가해줘야 한다
ojdbc8 추가 후 module-info.java 파일에 sql 기능을 추가로 명시해줘야 작동한다
★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
DB 연동 순서
프로젝트 라이브러리에 jdbc 를 추가 (위 동영상 참고) > module-info 에 라이브러리 추가 문구 작성 > 오라클 명령어를 사용할 수 있게 드라이버를 연동 ( Class.forName("oracle.jdbc.driver.OracleDriver") > Connection 객체를 통해 DB 연결 > PreparedStatement 객체를 통해 명령어를 DB 에 전송 > ResultSet 객체를 통해 명령어 수행 결과를 저장하여 출력
★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
package ex01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Scanner;
class DB_con{
// 연결을 시켜주는 Connetion 객체 ( 연결된 정보를 가지고 있음 )
private Connection con;
// 명령어를 전송하는 역할을 하는 PreparedStatement 객체
private PreparedStatement ps;
// 명령어 수행 결과 데이터를 저장하는 ResultSet 객체
private ResultSet rs;
public DB_con() {
try {
// jdbc 라이브러리 등록이 완료되었다면 아래 코드를 통해 오라클 드라이버의 기능을 사용할 수 있다
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("오라클 기능 사용가능(드라이버 로드)");
// 18 버전 이전 : xe, 19 버전 이상 : orcl
String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // 오라클 DB 정보 ( 아이피:포트번호:버전 )
String id = "c##youngho3358"; // DB 아이디
String pwd = "1234"; // DB 비밀번호
// 예외처리가 필요하므로 아래 catch 에서 exception 하나로 예외를 모두 처리
// con 은 연결만 담당
con = DriverManager.getConnection(url, id, pwd);
System.out.println("db 연결 성공 : " + con);
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<MemberDTO> select() {
// 명령어를 문자열 형태로 담아서 사용
String sql = "select * from member_test";
// DTO 객체를 ArrayList 형태로 저장 ( 사용자들을 배열 형태로 저장 )
ArrayList<MemberDTO> arr = new ArrayList<>();
try {
// ps 는 명령어를 전달하는 객체 ( 연결된 정보를 토대로 명령어를 전달 )
ps = con.prepareStatement(sql);
// ps 로 명령어를 전송하여 출력된 내용을 ResultSet 객체로 저장
rs = ps.executeQuery();
// System.out.println(rs.next());
// 각 데이터를 자료형에 맞게끔 저장
// rs 는 iterator 와 같은 방법으로 작동
// ResultSet 의 메소드 getString() 의 괄호 안의 값은
// 출력하고자 하는 컬럼의 이름이 들어가야 한다.
while(rs.next()) {
// DTO 에 출력되는 값들을 저장
MemberDTO dto = new MemberDTO();
dto.setId(rs.getString("id"));
dto.setPwd(rs.getString("pwd"));
dto.setName(rs.getString("name"));
dto.setAge(rs.getInt("age"));
// ArrayList 로 DTO 정보(DB로 받아온 정보)들을 배열로 저장
arr.add(dto);
/*
System.out.println(rs.getString("id"));
System.out.println(rs.getString("pwd"));
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
System.out.println("-------------------------");
*/
}
/*
System.out.println(rs.next());
System.out.println(rs.getString("id"));
System.out.println(rs.getString("pwd"));
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
System.out.println(rs.next());
System.out.println(rs.getString("id"));
System.out.println(rs.getString("pwd"));
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
System.out.println(rs.next());
*/
} catch (Exception e) {
e.printStackTrace();
}
return arr;
}
// 유저가 입력한 userId 를 전달받아 검색
public MemberDTO selectOne(String userId) {
// userId 값으로 검색하는 부분을 쿼리문으로 작성할때 문자열을 작음따옴표로 감싸줘야 함!!!!!!!
String sql = "select * from member_test where id='" + userId + "'";
// System.out.println(sql);
MemberDTO dto = null;
try {
// 쿼리문을 DB로 전송
ps = con.prepareStatement(sql);
// 쿼리문이 작동된 결과 값을 저장
rs = ps.executeQuery();
// 검색된 결과 값이 있으면 DTO 객체에 해당 내용을 저장
// 만약 검색될 결과 값이 없으면 DTO 객체는 null 값을 가진다
if(rs.next()) {
dto = new MemberDTO();
dto.setId(rs.getString("id"));
dto.setPwd(rs.getString("pwd"));
dto.setName(rs.getString("name"));
dto.setAge(rs.getInt("age"));
/*
System.out.println(rs.getString("id"));
System.out.println(rs.getString("pwd"));
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
*/
}
} catch (SQLException e) {
e.printStackTrace();
}
return dto;
}
public int delete(String delId) {
// ? 자리에 나중에 값을 채워넣겠다는 뜻
String sql = "delete from member_test where id=?";
int result = 0;
try {
ps = con.prepareStatement(sql);
// 1 번째 물음표에 sql 을 대입한다는 뜻
ps.setString(1, delId);
// 쿼리문 동작 후 반환 값이 ResultSet 형태로 받을 필요가 없으니 executeUpdate() 메소드 사용하여
// 리턴 값인 int 변수로 전달 받는다.
// 쿼리문을 실행 시 정상 작동한다면 = 1 을 리턴
// 쿼리문을 실행 시 오류가 발생한다면 = 0 을 리턴
result = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public int insert(MemberDTO dto) {
String sql = "insert into member_test values(?,?,?,?)";
int result = 0;
try {
ps = con.prepareStatement(sql);
// 첫번째 물음표에 dto.getId 값 입력
ps.setString(1, dto.getId());
// 두번째 물음표에 dto.getPwd 값 입력
ps.setString(2, dto.getPwd());
// 세번째 물음표에 dto.getName 값 입력
ps.setString(3, dto.getName());
// 네번째 물음표에 dto.getAge 값 입력
ps.setInt(4, dto.getAge());
// insert 쿼리문을 사용할때 ps.executeUpdate(); 의 결과 값은
// 성공 : 1, 실패 시 오류 문구가 출력된다 그래서 catch 로 넘어가게 되므로
// 아이디 생성 실패 시 result 값은 최초 초기화 값인 0 이 리턴된다.
result = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
public class MainClass {
public static void main(String[] args) {
DB_con db = new DB_con();
Scanner input = new Scanner(System.in);
int num;
while(true) {
System.out.println("1. 모든 목록보기");
System.out.println("2. 특정 사용자 보기");
System.out.println("3. 데이터 추가");
System.out.println("4. 데이터 삭제");
System.out.print(">>> : ");
num = input.nextInt();
switch(num) {
case 1:
// ArrayList 로 담아온 정보를 반복문을 통해 출력
ArrayList<MemberDTO> arr = db.select();
System.out.println("--main--");
for(MemberDTO dto : arr) {
System.out.println("id : " + dto.getId());
System.out.println("pwd : " + dto.getPwd());
System.out.println("name : " + dto.getName());
System.out.println("age : " + dto.getAge());
System.out.println("-------------------");
}
break;
case 2:
System.out.print("검색 id 입력 : ");
String userId = input.next();
// 입력받은 userId 값을 db 클래스의 selectOne 메소드로 넘겨줌
// 메소드에서 실행되어 받아온 값을 DTO 형식으로 반환받아서 변수에 저장
// id 가 존재한다면 dto 에 값이 정상적으로 들어갔을 것이며, 만약
// id 가 존재하지 않는다면 dto 는 객체 생성 초기 값인 null 이 설정되어 있을 것이다.
MemberDTO dto = db.selectOne(userId);
if(dto == null) {
// 만약 사용자가 존재하지 않아 dto 값이 null 로 반환되었다면
System.out.println("존재하지 않는 id입니다!!!");
}else {
// 사용자가 존재해 dto 값이 쿼리문 결과 값으로 저장되었다면
System.out.println("---- 검색 결과 ----");
System.out.println("id : " + dto.getId());
System.out.println("pwd : " + dto.getPwd());
System.out.println("name : " + dto.getName());
System.out.println("age : " + dto.getAge());
}
break;
case 3:
MemberDTO d = new MemberDTO();
// id 가 동일한 데이터가 db 에 존재하는지 확인
while(true) {
System.out.print("가입할 id 입력 : ");
d.setId(input.next());
MemberDTO dd = db.selectOne(d.getId());
if (dd==null) {
break;
}
System.out.println("존재하는 id... 다시 입력...");
}
System.out.print("가입할 pwd 입력 : ");
d.setPwd(input.next());
System.out.print("가입할 name 입력 : ");
d.setName(input.next());
System.out.print("가입할 age 입력 : ");
d.setAge(input.nextInt());
int res = db.insert(d);
if(res == 1) {
System.out.println("회원가입 성공!!!!");
}else {
System.out.println("존재하는 id는 안됨!!!");
}
break;
case 4:
System.out.print("삭제 id 입력 : ");
String delId = input.next();
int re = db.delete(delId);
if(re==1) {
// 아이디가 존재해 쿼리문이 정상적으로 작동했다면...
System.out.println("삭제 성공!!!");
}else {
// 아이디가 존재하지 않아 쿼리문이 정상적으로 작동하지 않았다면...
System.out.println("존재하지 않는 아이디... 삭제 불가!!!");
}
break;
}
}
}
}
728x90
'국비지원_핀테크' 카테고리의 다른 글
19일차_ [DB] Local망 내에서 oracle DB 접근하기 (0) | 2024.02.29 |
---|---|
19일차_ [java] oracle DB 연동 실습 (0) | 2024.02.29 |
18일차_ [DB] 정렬, inner join, group by (1) | 2024.02.28 |
17일차_ [DB] Oracle DB 설치, sqldeveloper 설치 및 DB 생성, 기본 문법 (1) | 2024.02.27 |
16일차_ [java] Socket 과 Thread 를 활용한 실시간 채팅 프로그램 (0) | 2024.02.26 |