반응형
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;
//GridLayout은 표처럼 배치해주는 방식
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;
public class GoodsTestDB2Method extends JFrame{
// 입력받기 위한 멤버변수들의 입력상자
JTextField jtf_no;
JTextField jtf_item;
JTextField jtf_qty;
JTextField jtf_price;
//모든 상품목록을 엑셀과 같은 모양으로 보여주기 위한 테이블을 선언
JTable table;
// 테이블의 칼럼이름을 위한 벡터를 선언
Vector colNames;
Vector<Vector> rowData;
//데이터 베이스에 접근 할 insertGoods 메소드 작성
public void insertGoods(int no, String item, int qty, int price) {
String sql = "insert into goods values("+ no + ", '" + item +"', " + qty + ", " + price + ")";
// finally에서도 접근할 수 있도록 Connection과 Statment변수를 try문 바깥에도 선언함
Connection conn = null;
Statement stmt = null;
// 데이터베이스에 연결
try {
//01. jdbc 드라이버를 메모리로 로드한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
//02. db서버에 연결한다.
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "c##sist", "sist");
//03. DB 명령을 실행할 Statement 객체를 생성한다.
stmt = conn.createStatement();
//04. DB 명령을 실행한다.
int re = stmt.executeUpdate(sql);
if (re == 1 ) {
System.out.println("상품등록에 성공하였습니다.");
//상품 등록후 작성 필드 리셋
jtf_no.setText("");
jtf_item.setText("");
jtf_qty.setText("");
jtf_price.setText("");
printGoods();
}else {
System.out.println("상품등록에 실패하였습니다.");
}
}catch(Exception ex ) {
System.out.println("예외발생 : " + ex.getMessage());
}finally {
//05. 사용했던 자원들을 닫아줌(반드시 처리해야하는 것)
try {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}catch(Exception ex) {
System.out.println("예외발생 : ");
}
}
}
//데이터베이스에 연결하여 goods테이블의 모든 상품을 읽어와서 (검색, 조회)
//테이블에 출력하는 메소드 생성
public void printGoods() {
//새로운 상품을 등록하여 계속 호출 될 수 있으니 먼저 깨끗이 지워줌
rowData.clear();
//데이터 베이스에 연결하여 실행할 명령어
String sql = "select * from goods order by no";
//데이터베이스 연결과 필요한 변수들을 선언한다.
//DB 서버에 연결을 위한 변수
Connection conn = null;
//데이터 베이스 명령을 실행하기 위한 변수
Statement stmt = null;
//읽어온 데이터를 담기 위한 변수
ResultSet rs = null;
try {
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}finally {
try{
//01. jdbc 드라이버를 메모리로 로드한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
//02. db서버에 연결한다.
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "c##sist", "sist");
//03. DB 명령을 실행할 Statement 객체를 생성한다.
stmt = conn.createStatement();
//04. DB 명령을 실행한다.
// executeUpdate 자료를 추가 수정 삭제
//executeQuery(String sql) 자료를 읽어올때
rs = stmt.executeQuery(sql);
//5. 일처리를 한다.
// 검색한 자료가 있는만큼 반복실행하여 한 행씩 읽어와서 그것을 벡터로 만든다.
// 벡터를 테이블의 자료를 위한 rowData에 담는다.
// ResultSet의 결과에서 특정 레코드를 가리키는 커서 가 있음
// 이 커서를 한 행씩 옮겨주는 메소드가 next()임.
//메소드는 레코드가 있어서 성공적으로 옮겨지면 true 아니면 false 반환
while ( true == rs.next()) {
//현재 커서가 바라보고 있는 레코드의 속성값을 읽어오기 위해 자료형에 따라
//get()을 사용함 문자열 getString 정수 getInt
//매개변수로 컬럼의 인덱스나 컬럼 이름을 문자열로 전달 할 수 있음
// 여기서 인덱스는 1부터 시작함
int no = rs.getInt(1);
String item = rs.getString(2);
int qty = rs.getInt(3);
int price = rs.getInt(4);
//벡터를 만들고 그 벡터에 no,item,price를 담는다
Vector v = new Vector();
v.add(no);
v.add(item);
v.add(qty);
v.add(price);
rowData.add(v);
// 바뀐 내용으로 테이블을 다시 그림
// 처음 테이블을 만들 때 rowData벡터는 비어있음
// 나중에 테이블의 데이터인 rowData 바뀐자료를 적용하기 위해서는 updateUI를 호출
table.updateUI();
}
try{
if(rs != null) {
rs.close();
}
if(stmt != null) {
stmt.close();
}
if(conn != null) {
conn.close();
}
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}
}catch(Exception e) {
System.out.println("예외발생 : " + e.getMessage());
}
}
}
public GoodsTestDB2Method(){
// 테이블에 들어갈 칼럼이름을 위한 벡터를 생성하고 자료를 추가
colNames = new Vector<Vector>();
colNames.add("상품번호");
colNames.add("상품명");
colNames.add("수량");
colNames.add("단가");
//테이블에 들어가 실제 담기 위한 벡터를 생성하고 자료를 추가
rowData = new Vector<Vector>();
//컬럼 이름이 있는 colName벡터와 실제 데이터 있는 rowData 벡터를 가지고 엑셀과 같은 화면의
table = new JTable(rowData, colNames);
JScrollPane jsp = new JScrollPane(table);
jtf_no = new JTextField();
jtf_item = new JTextField();
jtf_price = new JTextField();
jtf_qty = new JTextField();
//입력 설명하는 라벨들을 담기 위한 패널 생성
JPanel p = new JPanel();
p.setLayout(new GridLayout(4,2));
//라벨과 입력상자 (텍스트 필드)들을 패널에 차례로 담는다
p.add(new JLabel("상품번호 :"));
p.add(jtf_no);
p.add(new JLabel("상품이름 : "));
p.add(jtf_item);
p.add(new JLabel("상품수량 : "));
p.add(jtf_qty);
p.add(new JLabel("상품단가 : "));
p.add(jtf_price);
//버튼을 만들어요
JButton btn_add = new JButton("추가");
JButton btn_list = new JButton("목록");
// 버튼들을 담을 패널을 생성
JPanel p2 = new JPanel();
p2.add(btn_add);
p2.add(btn_list);
//입력상자 패널, 버튼 패널을 담기위한 패널을 생성
JPanel p_center = new JPanel();
p_center.setLayout(new BorderLayout());
p_center.add(p,BorderLayout.CENTER);
p_center.add(p2,BorderLayout.SOUTH);
// 프레임 가운데에 입력상자와 버튼을 담고 있는 패널을 담는다
add(p_center, BorderLayout.CENTER);
//table을 담고 있는 스크롤 팬을 아래쪽에 담아요.
add(jsp,BorderLayout.SOUTH);
//프레임의 가로길이, 세로길이를 설정하고 화면에 보여주도록 설정
setSize(800,600);
setVisible(true);
//창을 닫으면 프로그램도 종료하도록 설정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//목록을 누르면 데이터베이스를 연결 할 수 있도록 생성
btn_list.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
printGoods();
}
});
//추가 버튼을 누리면 사용자가 입력한 상품번호, 상품이름, 상품 수량, 상품 가격을
//데이터 베이스 자료에 추가
//import java.awt.event.ActionListener;
btn_add.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
int no = Integer.parseInt(jtf_no.getText());
String item = jtf_item.getText();
int qty = Integer.parseInt(jtf_qty.getText());
int price = Integer.parseInt(jtf_price.getText());
insertGoods(no, item, qty, price);
}
});
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new GoodsTestDB2Method();
}
}
반응형
'programming language > Java' 카테고리의 다른 글
[Java] 03.메서드 (0) | 2021.11.28 |
---|---|
[Java] 02. 변수 (0) | 2021.11.28 |
[Java] 01.클래스와 객체 (0) | 2021.11.28 |
[Java] PrepareSatement (0) | 2021.11.05 |
[Java] 1. 자바를 시작하기 전에 (2) | 2021.10.05 |
댓글