본문 바로가기

JAVA/Oracle

Oracle/JAVA 연동 예제 : 상품관리 프로그램 작성

반응형

** 상품관리 프로그램을 작성하고자 한다.



목차

1. 데이터베이스 구성 및 연습

2. 프로그램에 의해서 상품추가 가능하도록 하기

3. 모든 상품의 정보를 보여주는 프로그램 작성

4. 사용자로부터 가격을 입력받아 입력받은 가격과 같거나 더 높은 금액의 상품의 정보를 모두 출력하는 프로그램 작성




1. 상품의 정보를 저장하기 위한 데이터베이스 구성하자


상품번호

상품명

가격

상세설명

상품이미지


**테이블 생성 sql 명령어

create table 테이블명(속성명1 자료형1, 속성명2 자료형2, ....);

// 한글로도 가능하지만 권장하지 않는다. 하지만 오늘은 테스트 해보기로


// 상품번호의 경우 순차적으로 입력할때마다 자동으로 지정될때는 int 사용한다

// 오라클에서 정수든 실수든 number로 표현

// 이미지는 경로이름을 넣는 것이 일반적

create table 상품(상품번호 varchar2(20), 상품명 varchar2(20), 가격 number, 상세설명 varchar2(100), 상품이미지 varchar2(30));



** 식별자


예를 들어 데이터가 들어갈때는

A100 사과 1000 맛있는 사과 apple.jpg

A101 사과 1000 꾸우울 사과 apple.jpg

// 속성값이 같은 것도 있지만 다른 것이 있을 때

// 다른 레코드와 구별하기 위한 무엇인가 필요 == '식별자' 라고함 or '주식별자'

여기서는 상품번호로 식별자를 정함

그래서 primary key 를 속성값 뒤에 붙여줌

create table 상품(상품번호 varchar2(20) primary key, 상품명 varchar2(20), 가격 number, 상세설명 varchar2(100), 상품이미지 varchar2(30));


** ed 상품 명령어 // 오타날수도 있으니 편집기 이용

위에 문장 입력 및 저장


** @ 상품 // 상품에 있는 내용을 실행해 주세요


** 테이블의 구조 확인하는 sql 명령어

desc 테이블명;

desc 상품;


** 생성된 테이블에 자료를 추가하기 위한 sql 명령어

insert into 테이블명 values(값1,값2,값3, .....);

이때 값의 순서는 테이블구조 순서와 동일 해야 함

또, 문자나 문자열을 홋따옴표로 ' ' 묶는다.


A100/ 사과/ 1000/ 맛있는 사과/ apple.jpg


insert into 상품 values('A100', '사과',1000,'맛있는 사과','apple.jpg');


실행결과 : 1개의 행이 만들어졌습니다. 라고 나옴


// 하나 더 레코드 만듬

insert into 상품 values('A101', '메론',5000,'꾸우울 메론','melon.jpg');


** 데이터를 추가, 수정, 삭제 명령을 수행 한 후

반영 ==> commit;

취소 ==> rollback; // 다 없어짐 (조심해야함)

다른 사람도 볼 수 있도록 commit; 명령어 사용


** 테이블에 추가된 데이터가 잘 들어갔나 확인 해보고자 한다

(= 자료검색)

속성 골라서 보고 싶을때

select 속성명1, 속성명2 .. from 테이블명;

속성 다 보고 싶을때

select * from 테이블명;


모든상품의 상품명, 가격을 검색하고 싶으면?

select 상품명, 가격 from 테이블명;


** 컬럼 폭 맞춰보기(출력되는 화면이 마음에 안들어서)

지금만 쓰는게 아니니까 파일을 만들어서 저장하기로함

ed ff -> 메모장 열음

입력하는거

column 상품번호 format a5;

column 상품명 format a10;

column 가격 format 9,999;

column 상세설명 format a10;

column 상품이미지 format a10;

@ ff

select * from 상품;


**주식별자가 중복될때 발생하는 오류★★★★★


'개체무결성'

에러내용

java.sql.SQLException: ORA-00001: 무결성 제약 조건(SCOTT.SYS_C004049)에 위배됩니다


**조건에 맞는 자료를 검색

select 컬럼명1, 컬럼명2, ... from 테이블명 where 조건식;

select * from 테이블명 where 조건식;


예) 상품명이 '오렌지'인 상품의 가격을 검색하시오

select 가격 from 상품 where 상품명  = '오렌지';

select 가격 from 상품 where 상품명  != '오렌지'; //아닌

select 가격 from 상품 where 상품명  <> '오렌지'; //작거나크거나


연습문제)

가격이 2000원 이상인 제품의 상품명, 가격, 상품이미지를 검색하시오.


검색방법 2가지

1. ==> select 상품명, 가격, 상품이미지 from 상품 where 가격 >= 2000;

2. ==> select 상품명, 가격, 상품이미지

2 from 상품

3 where 가격 >= 2000

4 ;


비교연산자

( > < >= <= != = )

논리연산자

(&& || 가 아닌 and or)




2. 프로그램에 의해서 상품추가 가능하도록 해보기


// 사용자로부터 상품번호, 상품명, 가격, 상세설명, 상품이미지를 입력받아 데이터베이스에 레코드를 추가하는 프로그램 작성

// 


import java.util.*;

import java.sql.*;


class  InsertGoods{

public static void main(String[] args){


Scanner sc = new Scanner(System.in);

String num, name, desc, img;

int price;


System.out.print("상품번호: ");

num = sc.next();

System.out.print("상품명 : ");

name = sc.next();

System.out.print("가격 : ");

price = sc.nextInt();

sc.nextLine();

System.out.print("상세설명 : ");

desc = sc.nextLine(); // 설명이 길기 때문에 Line으로 받고 받기전 버퍼내용 지우기 함

System.out.print("상품이미지 : ");

img = sc.next();


//DB에 연결에서 sql 명령어 실행하면 됨


try{

// 질의문 만들기

//String sql = "insert into 상품 values('100','사과',1000,'꿀사과','apple.jpg')"; 이것을 일일이 더하기로 변수처리하기 복잡함

String sql = "insert into 상품 values(?,?,?,?,?)"; // 변수처리해야할 값을 물음표로 대신 할 수 있음

//sql 명령어는 사용자가 입력한 값(변수)을 가지고 sql 명령어를 만드는 것이 일반적

// 이때 변수의 값을 설정하기가 + 더하기로 해도 되지만 번거롭고 가독성이 안좋기 때문에 ? 물음표로 대신 할 수 있다.


//1. jdbc 드라이버를 메모리로 로드한다

Class.forName("oracle.jdbc.driver.OracleDriver");


//2. DB 서버 연결

String url = "jdbc:oracle:thin:@203.236.209.111:1521:XE";

//or

//String url = "jdbc:oracle:thin:@localhost:1521:XE";

String user = "scott";

String pwd = "tiger";

Connection conn = DriverManager.getConnection(url,user,pwd); // 직접입력 혹은 변수 만들어서 사용해도됨

// connection으로 반환한다.


//3. sql명령어를 실행하기 위한 Statement 객체 생성

//conn.createStatement(); // 질의문에 물음표가 없을때 사용하는 것

//perparedStatement 질의문에 물음표가 있을때 사용하는 것   

PreparedStatement pstmt = conn.prepareStatement(sql);


//? 물음표가 있기 때문에 저 질의문은 불안하다 그렇기에 각각의 물음표에 값을 설정해야함

//sql 명령어에 결정되지 않은 ? 물음표에 값을 설정해야함

// 설정하는거니까 set__ 시작할것임, 문자열이면 setString, int면 setInt

pstmt.setString(1, num); // 첫번째 물음표에 num , Index 는 1부터 시작(0부터아님)

pstmt.setString(2, name);

pstmt.setInt(3, price);

pstmt.setString(4, desc);

pstmt.setString(5, img);


//sql 명령어를 실행한다.

//실행 메소드(executeUpdate -  insert, update, delete // executeQuery - select)

// executeUpdate(String sql) // 물려받은것 // 여기서 이것을 사용하면 물음표가 비어있는 상태로 질의하게 됨

// executeUpdate() // 자기자신꺼

int re = pstmt.executeUpdate(); // 성공적으로 sql문을 실행한 레코드의 수를 반환

if (re ==1){

System.out.println("상품 등록 완료");

}else{

System.out.println("상품 등록 실패");

}


// 사용했던 객체를 닫기

pstmt.close();

conn.close();


}//end try

catch (Exception e){

System.out.println(e);

}//end catch

}// end psv

}//end class




3. 모든 상품의 정보를 보여주는 프로그램을 작성

즉, 다시 말하면 데이터베이스 서버에 접속해서 "select * from 상품" 이라는 sql명령어를 실행해서 그 결과를 화면에 출력하고자 한다.


import java.sql.*;


class  ListGoods{

public static void main(String[] args) {

// 실행시키고자 하는 sql명령어를 문자열 변수에 담아 보자

String sql = "select * from 상품";


try{

// java언어에서 데이터베이스 연결 프로그램 ==> JDBC 프로그래밍

//JDBC 프로그래밍 순서

//1. jdbc 드라이버를 메모리로 로드한다.

Class.forName("oracle.jdbc.driver.OracleDriver");


//2. DB 서버에 연결

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@203.236.209.141:1521:XE","scott","tiger");


//3. sql 명령어 실행하기 위한 Statement 객체 생성

Statement stmt= conn.createStatement();


//4. sql 명령어 실행(Statement를 통해서)

//sql 명령어 실행하기 위한 메소드 executeUpdate, executeQuery

ResultSet rs = stmt.executeQuery(sql);


//일처리 ==> 검색한 결과를 모두 출력

//검색한 결과가 rs에 담겨져 있음

//디비 정보를 검색한 결과만큼 반복실행하여 데이터를 하나씩 꺼내와서 화면에 출력


while (rs.next()){

String num = rs.getString(1); // or rs.getString("상품번호");

String name = rs.getString(2);

int price = rs.getInt(3);

String desc = rs.getString(4);

String img = rs.getString(5);

System.out.println(num+","+name+","+price+","+desc+","+img);

}


rs.close();

stmt.close();

conn.close();


}catch (Exception e){

System.out.println(e);

}

}

}




4. 사용자로부터 가격을 입력받아 입력받은 가격과 같거나 더 높은 금액의 상품의 정보를 모두 출력하는 프로그램 작성


import java.util.*;

import java.sql.*;


class  TestGoods{


public static void main(String[] args) {


Scanner sc = new Scanner(System.in);

System.out.print("가격입력==>");

int input = sc.nextInt();


String sql = "select * from 상품 where 가격 >= " + input;


try{

//1. jdbc 드라이버를 메모리 로드

Class.forName("oracle.jdbc.driver.OracleDriver");


//2. DB 서버 연결

String url = "jdbc:oracle:thin:@203.236.209.141:1521:XE";

String user = "scott";

String pwd = "tiger";

Connection conn = DriverManager.getConnection(url,user,pwd);


//3. sql 명령어 실행하기 위한 Statement 객체 생성

Statement stmt = conn.createStatement();

//4. sql 명령어 실행

ResultSet rs = stmt.executeQuery(sql);


while (rs.next()){

String num = rs.getString("상품번호");

String name = rs.getString("상품명");

int price = rs.getInt("가격");

String desc = rs.getString("상세설명");

String img = rs.getString("상품이미지");

System.out.println(num + "\t" + name + "\t" + price + "\t" + desc + "\t" + img);

}


rs.close();

stmt.close();

conn.close();


}catch (Exception e){

System.out.println(e);

}

}

}



반응형