기록
day 0610 상품_등록_수정_삭제_조회 본문
package com.kosta.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class ConnectionProvider {
// 스테틱 메소드 이며 객체와 무관하게 사용
// 커넥션 반환
public static Connection getConnection() {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String username = "c##madang";
String password = "madang";
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}
return conn;
}
// 매개변수 conn, stmt, rs 을 받아서 close(); 시키기
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try {
if(rs != null) {
rs.close();
}
if(stmt != null) {
stmt.close();
}
if(conn != null) {
conn.close();
}
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}
}
public static void close(Connection conn, Statement stmt) {
try {
if(stmt != null) {
stmt.close();
}
if(conn != null) {
conn.close();
}
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}
}
}
package com.kosta.exam01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import com.kosta.db.ConnectionProvider;
public class GoodsDAO {
Statement stmt = null;
Connection conn = null;
ResultSet rs = null; // 조회
// 모든 상품목록을 조회하여 ArrayList로 반환하는 메소드를 정의
public ArrayList<GoodsVO> listGoods(){
ArrayList<GoodsVO> list = new ArrayList<GoodsVO>();
String sql = "select * from goods order by no asc";
try {
conn = ConnectionProvider.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()) {
list.add(new GoodsVO(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getInt(4)));
}
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}finally {
ConnectionProvider.close(conn, stmt, rs);
}
return list;
}
// 새로운 상품을 등록하기위한 구조
public int insertGoods(GoodsVO i) {
// 상관없는 -1값을 임의의 값으로 넣는다
int re = -1;
String sql = "insert into goods values("+i.getNo()+", '"+i.getItem()+"', "+i.getQty()+", "+i.getPrice()+")";
try {
conn = ConnectionProvider.getConnection();
stmt = conn.createStatement();
re = stmt.executeUpdate(sql);
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}finally {
ConnectionProvider.close(conn, stmt);
}
return re;
}
public int updateGoods(GoodsVO u) {
int re = -1;
String sql = "update goods set item = '"+u.getItem()+"', qty = "+u.getQty()+", price = "+u.getPrice()+" where no = "+u.getNo()+"";
try {
conn = ConnectionProvider.getConnection();
stmt = conn.createStatement();
re = stmt.executeUpdate(sql);
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}finally {
ConnectionProvider.close(conn, stmt);
}
return re;
}
public int deleteGoods(int no) {
int re = -1;
String sql = "delete goods where no = "+no;
try {
conn = ConnectionProvider.getConnection();
stmt = conn.createStatement();
re = stmt.executeUpdate(sql);
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}finally {
ConnectionProvider.close(conn, stmt);
}
return re;
}
}
package com.kosta.exam01;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
public class GoodsTest extends JFrame {
JTextField jtf_no;
JTextField jtf_item;
JTextField jtf_qty;
JTextField jtf_price;
Vector<String> colName;
Vector<Vector<String>> rowDate;
JTable table;
int no, qty, price;
String item;
public void reset() {
jtf_no.setText("");
jtf_item.setText("");
jtf_qty.setText("");
jtf_price.setText("");
}
// 텍스트 필드의 입력값을 읽어와 각각의 변수에 저장하는 메소드
public void setData(){
no =Integer.parseInt(jtf_no.getText());
item = jtf_item.getText();
qty =Integer.parseInt(jtf_qty.getText());
price =Integer.parseInt(jtf_price.getText());
}
public void loadGoods() {
rowDate.clear();
GoodsDAO dao = new GoodsDAO();
ArrayList<GoodsVO> list = dao.listGoods();
for (GoodsVO vo : list) {
Vector<String> row = new Vector<String>();
row.add(vo.getNo()+"");
row.add(vo.getItem());
row.add(vo.getQty()+"");
row.add(vo.getPrice()+"");
rowDate.add(row);
}
table.updateUI();
}
public GoodsTest(String title) {
super(title);
jtf_no = new JTextField();
jtf_item = new JTextField();
jtf_qty = new JTextField();
jtf_price = new JTextField();
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
p1.setLayout(new GridLayout(4, 2));
p1.add(new JLabel("상품번호"));
p1.add(jtf_no);
p1.add(new JLabel("상품명"));
p1.add(jtf_item);
p1.add(new JLabel("수량"));
p1.add(jtf_qty);
p1.add(new JLabel("가격"));
p1.add(jtf_price);
p2.setLayout(new FlowLayout());
JButton btnAdd = new JButton("등록");
p2.add(btnAdd);
JButton btnUpdate= new JButton("수정");
p2.add(btnUpdate);
JButton btnDelete = new JButton("삭제");
p2.add(btnDelete);
colName = new Vector<String>();
colName.add("상품번호");
colName.add("상품명");
colName.add("수량");
colName.add("가격");
rowDate = new Vector<Vector<String>>();
table = new JTable(rowDate, colName);
JScrollPane jsp = new JScrollPane(table);
JPanel p_north = new JPanel();
p_north.setLayout(new BorderLayout());
p_north.add(p1, BorderLayout.CENTER);
p_north.add(p2, BorderLayout.SOUTH);
// add(p1, BorderLayout.NORTH);
// add(p2, BorderLayout.CENTER);
add(p_north, BorderLayout.NORTH);
add(jsp, BorderLayout.CENTER);
setSize(500, 350);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
loadGoods();
table.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
int idx = table.getSelectedRow();
Vector<String> row = rowDate.get(idx);
jtf_no.setText(row.get(0));
jtf_item.setText(row.get(1));
jtf_qty.setText(row.get(2));
jtf_price.setText(row.get(3));
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
});
btnAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setData();
GoodsVO vo = new GoodsVO(no, item, qty, price);
GoodsDAO dao = new GoodsDAO();
int re = dao.insertGoods(vo);
if(re == 1) {
JOptionPane.showMessageDialog(null, "상품을 등록하였습니다.");
loadGoods();
}else {
JOptionPane.showMessageDialog(null, "상품을 등록에 실패하였습니다.");
}
reset();
}
});
btnUpdate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setData();
GoodsVO vo = new GoodsVO(no, item, qty, price);
GoodsDAO dao = new GoodsDAO();
int re = dao.updateGoods(vo);
if(re > 0) {
JOptionPane.showMessageDialog(null, "상품 정보를 수정하였습니다.");
loadGoods();
}else {
JOptionPane.showMessageDialog(null, "상품 정보 수정에 실패하였습니다.");
}
reset();
}
});
btnDelete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int no = Integer.parseInt(jtf_no.getText());
GoodsDAO dao = new GoodsDAO();
int re = dao.deleteGoods(no);
if(re > 0) {
JOptionPane.showMessageDialog(null, "상품 정보를 삭제하였습니다.");
loadGoods();
}else {
JOptionPane.showMessageDialog(null, "상품 정보 삭제에 실패하였습니다.");
}
reset();
}
});
}
public static void main(String[] args) {
new GoodsTest("상품관리");
}
}
프로그램 실행 결과를 출력
- 컴퓨터 화면 : 휘발성
- 파일 : 영구저장, 동시에 최신의 정보 공유 X
- 데이터베이스 : 영구저장, 동시에 최신의 정보 공유 O
데이터베이스 (DataBase)
자료를 쌓아 놓은 더미
데이터베이스 관리 시스템 (DataBase Management System)
DBMS
데이터베이스 시스템 관리를 통하여 데이터 베이스를 사용
DBMS 종류
Oracle, Mysql, MariaDB ..
관계형 데이터베이스 : 대체적으로 관계형 데이터베이스를 많이 사용한다
객체 데이터베이스
<< 관계형 데이터베이스 >>
우리가 학습하는 오라클은 "관계형 데이터베이스"에 해당합니다
관계형 데이터베이스는 기업의 정보구조를 여러개의 테이블로 나타냅니다
각 테이블은 행과 열로 구성되며 각각의 테이블은 서로 관계가 있도록 만들어집니다
관계가 있다라는 말은 두개의 테이블에 공통으로 들어가는 칼럼(속성)이 있는 것 입니다
예를들어 부서관리 시스템에서 부서의 정보를 저장하기위하여
부서 테이블의 속성으로 부서번호, 부서명, 부서위치가 있다고 합시다
부서
부서번호 부서명 부서위치
10 기획팀 판교
20 개발팀 종로
30 총무팀 종로
이 부서에 소속된 사원 테이블의 속성으로는
사원번호, 사원명, 급여 그리고 어느 부서에 속해있는지 부서번호가 있어야 합니다
사원
사원번호 사원명 급여 부서번호
1000 이름 500 20
1001 이름 500 20
1002 이름 300 30
이와같이 두개의 테이블에 부서번호라는 속성이 공통으로 들어가 있다
이것을 관계에 있다고 말한다
이론적으로 관계의 종류가 많이 있지만 우리가 학습 할 관계는 "부모자식관계" 입니다
두 개 테이블의 데이터 중 먼저 들어가야 하는 것을 부모로 봅니다
<< 데이터베이스 명령어의 종류 >>
1. 데이터 정의어 (Data Definition Language) DDL
테이블이나 개체를 생성, 수정, 삭제하는 명령
2. 데이터 제어어 (Data Control Language) DCL
사용자를 생성, 삭제, 권한부여, 권한취소
3. 데이터 조작어 (Data Manipulation Language) DML
: 레코드를 추가, 수정, 삭제, 조회
DML (데이터 조작어)
insert 추가
update 수정
delete 삭제
select 조회
-- 서점관리 시스템을 위한 3개의 테이블 생성하기
도서 (도서번호, 도서명, 가격, 출판사)
고객 (고객번호, 고객명, 주소, 전화)
주문 (주문번호, 고객번호, 도서번호, 주문가격, 주문일)
book(bookid*, bookname, price, publisher)
customer(custid*, name, address, phone)
orders(orderid*, custid+, bookid+, saleprice, orderdate)
create table book(bookid number primary key, bookname varchar2(20), price number, publisher varchar2(50));
create table customer(custid number primary key, name varchar2(20), address varchar2(50), phone varchar2(20));
create table orders(orderid number primary key, custid number references customer(custid),bookid number references book(bookid),saleprice number, orderdate date);
* 참조키는 바로 추가 할 수 없다 *
* 중복된 값을 구분하기 위한 식별자
+ 참조 키 (자식은 부모의 주 식별자를 참조한다)
book 테이블은 bookid를 주식별자(primary key)로 설정하여 다른 레코드와 구별하도록 한다
customer 테이블은 custid를 주식별자(primary key)로 설정
orders 테이블은 orderid를 주식별자(primary key)로 설정
그리고 orders 테이블의 custid는 반드시 customer 테이블에 존재하는 custid가 되도록 설정합니다
bookid는 반디스 book 테이블에 존재하는 bookid가 되도록 설정
(참조키 설정 - foreign key)
<< primary key >>
테이블을 만들 때 다른 레코드와 구별할 수 있는 속성이 필요한데
이것을 "주식별자" 라고 함 주식별자를 설정하기 위하여 primary key로 한다
<< foreign key >>
두 개의 테이블을 관계로 설정할 때 자식테이블의 어떤 속성을
부모의 주식별자로 참조하기 위하여 사용한다
14:00 ~
insert into book values (1, '축구의 역사', 7000, '굿스포츠');
insert into book (bookid, bookname, price, publisher) values(2, '세계수의 역사', 13000, '한나무');
insert into book (bookid, bookname, price, publisher) values (3, '축구의 이해', 22000, '대한미디어');
insert into book (bookid, bookname, price, publisher) values (4, '골프 바이블', 35000, '대한미디어');
insert into book (bookid, bookname, price, publisher) values (5, '피겨 교본', 8000, '굿스포츠');
insert into book (bookid, bookname, price, publisher) values (6, '역도 단계별 기술', 6000, '굿스포츠');
insert into book (bookid, bookname, price, publisher) values (7, '야구의 추억', 20000, '이상미디어');
insert into book (bookid, bookname, price, publisher) values (8, '야구를 부탁해', 13000, '이상미디어');
insert into book (bookid, bookname, price, publisher) values (9, '올림픽 이야기', 7000, '삼성당');
insert into book (bookid, bookname, price, publisher) values (10, 'Champion', 13000, 'Pearson');
SQL> ed ff
메모장을 만드시겠습니까?
column bookid Format 9999; // 네자리 숫자로 보겠다
column bookname Format a20;
column price Format 999,999;
column publisher format a20;
@ff (파일 실행)
select * from book;
insert into customer values(1, '박지성', '멘체스타', '010-0000-0001');
insert into customer values(2, '김연아', '서울', '010-0000-0002');
insert into customer values(3, '장미란', '강원도', '010-0000-0003');
insert into customer values(4, '추신수', '미국', '010-0000-0004');
insert into customer values(5, '박세리', '대전', null);
박지성이 축구의 역사를 6000원에 오늘날짜로 주문
insert into orders values (1, 1, 1, 6000, '2024/06/10');
insert into orders values (2, 1, 3, 21000, '2024/05/03');
insert into orders values (3, 2, 5, 8000, '2024/06/03');
insert into orders values (4, 3, 6, 6000, '2024/06/04');
insert into orders values (5, 4, 7, 20000, '2024/06/05');
insert into orders values (6, 1, 2, 12000, '2024/06/07');
insert into orders values (7, 4, 8, 13000, '2024/06/07');
insert into orders values (8, 3, 10, 12000, '2024/06/08');
insert into orders values (9, 2, 10, 7000, '2024/06/08');
insert into orders values (10, 5, 8, 13000, '2024/06/10');
20 -> 30칸으로 바꾸기
alter table customer modify address varchar2(30);
<< 데이터 조회하기 >>
select 칼럼명 from 테이블명 where 조건식;
모든 고객의 주소 조회
select address from customer;
'김연아' 고객의 주소를 조회
select address from customer where name = '김연아';
'대한미디어'에서 출간하는 도서의 도서명과 가격 조회
select bookname, price from book where publisher = '대한미디어';
'대한미디어'에서 출간하는 모든 도서의 도서번호, 도서명, 가격, 출판사를 조회
select * from book where publisher = '대한미디어';
모든 출판사 목록 조회
select publisher from book;
위의 결과는 book 테이블로부터 모든 레코드에 대한 각각의 출판사를 출력
그러다보니 출판사명이 중복된다
중복을 제거하고 목록보기 : distinct
select distinct publisher from book;
<< where 절에 사용할 수 있는 연산자 >>
비교 : >, <, >=, <=, =, <>
논리 : and, or
집합 : in, not in
범위 : between a and b
null : is null, is not null
패턴 : like
가격이 20000원 이상인 도서목록 출력
select bookname from book where price >= 20000;
select book from book where price >= 20000;
출판사가 굿스포츠가 아닌 모든 도서목록 출력
select publisher from book where publisher not in '굿스포츠';
select * from book where publisher <> '굿스포츠';
select * from book where publisher != '굿스포츠';
2024년 6월 10일 주문한 도서번호, 고객번호 출력
select bookid, custid from orders where orderdate = '2024/06/10';
'이상미디어'에서 출간하는 도서중에 가격이 20000원 이상인 도서번호, 도서명 출력
(중에 and)
select bookid, bookname from book where publisher = '이상미디어' and price >= 20000;
'이상미디어'나 '대한미디어'에서 출간하는 도서의 도서번호, 도서명, 출판사명 출력
select bookid, bookname, publisher from book where publisher = '이상미디어' or publisher = '대한미디어';
select bookid, bookname, publisher from book where publisher in ('이상미디어', '대한미디어');
'이상미디어'도 아니고 '대한미디어'도 아닌 출판사의 도서번호, 도서명, 출판사명 출력
select bookid, bookname, publisher from book where publisher not in ('이상미디어', '대한미디어');
where publisher <> '이상미디어' and publisher <> '대한미디어';
'이상미디어'나 '대한미디어'에서 출간하는 도서 중 가격이 20000원 이상인 도서번호, 도서명, 출판사명 출력
select bookid, bookname, publisher from book where publisher in ('이상미디어', '대한미디어') and price >= 20000;
가격이 10000원 이상 20000원 이하인 도서의 도서번호, 도서명, 출판사명, 가격 출력
select * from book where price >= 10000 and price <= 20000;
where price between 10000 and 20000;
'대한미디어'나 '이상미디어'에서 출간하는 도서중에 가격이 10000원 이상 30000원 이하인 도서의 정보 출력
select * from book where publisher in ('대한미디어', '이상미디어') and price >= 10000 and price <= 30000;
where publisher in ('대한미디어', '이상미디어') and price between 10000 and 30000;
전화번호가 null인 고객의 이름, 주소 출력
select name, address from customer where phone is null;
전화번호가 null이 아닌 고객의 정보를 출력
select * from customer where phone is not null;
- 오늘 학습한 내용에 대하여 요약, 정리하고 잘 이해가 되지않는 부분 질문하도록 합니다
- 요약 및 정리가 끝난 사람들은 다음을 프로그래밍 해 봅니다
사용자한테 출판사명을 입력받아 해당 출판사에서 출간하는 모든 도서목록을 출력하는 프로그램을
GUI로 작성 해 봅니다
package com.kosta.exam02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class ConnectionProvider {
// 스테틱 메소드 이며 객체와 무관하게 사용
// 커넥션 반환
public static Connection getConnection() {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String username = "c##madang";
String password = "madang";
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}
return conn;
}
// 매개변수 conn, stmt, rs 을 받아서 close(); 시키기
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try {
if(rs != null) {
rs.close();
}
if(stmt != null) {
stmt.close();
}
if(conn != null) {
conn.close();
}
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}
}
public static void close(Connection conn, Statement stmt) {
try {
if(stmt != null) {
stmt.close();
}
if(conn != null) {
conn.close();
}
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}
}
}
package com.kosta.exam02;
public class BookVO {
private int bookid;
private String bookname;
private int price;
private String publisher;
public BookVO() {
super();
// TODO Auto-generated constructor stub
}
public BookVO(int bookid, String bookname, int price, String publisher) {
super();
this.bookid = bookid;
this.bookname = bookname;
this.price = price;
this.publisher = publisher;
}
public int getBookid() {
return bookid;
}
public void setBookid(int bookid) {
this.bookid = bookid;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
}
package com.kosta.exam02;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
public class BookTest extends JFrame {
JTextField jtf_publisher;
Vector<String> colName;
Vector<Vector<String>> rowDate;
JTable table;
public void loadBook() {
rowDate.clear();
}
public BookTest() {
jtf_publisher = new JTextField(10);
JPanel p = new JPanel();
p.setLayout(new FlowLayout());
p.add(new JLabel("출판사 : "));
p.add(jtf_publisher);
JButton btnOK = new JButton("조회");
p.add(btnOK);
rowDate = new Vector<Vector<String>>();
table = new JTable(rowDate, colName);
JScrollPane jsp = new JScrollPane(table);
add(p, BorderLayout.NORTH);
add(jsp, BorderLayout.CENTER);
setSize(400,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new BookTest();
}
}
'📖' 카테고리의 다른 글
day 0612 데이터베이스(2) (0) | 2024.06.12 |
---|---|
day 0611 데이터베이스(1) (1) | 2024.06.12 |
데이터베이스 명령어 (1) | 2024.06.09 |
day 0607 데이터베이스 연결 프로그래밍 수정_삭제 (1) | 2024.06.07 |
day 0605 데이터베이스 연결 프로그래밍 (0) | 2024.06.05 |