☆ 현재 패키지 경로
File file = new File(".");
String rootPath = file.getAbsolutePath();
System.out.println("현재 프로젝트의 경로 : "+rootPath );
◎ Oracle Table
◎ 구현 결과물
★ Main
package quiz0908;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class HelloMain extends JFrame implements ActionListener{
Container cp;
JButton btnAdd, btnList, btnUpdate, btnDel;
JLabel lbl1, lbl2, lbl3, lbl4;
////////////////////////////////
//기본
public HelloMain() {
super("Hello");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setBounds(800, 100, 250, 300);
this.getContentPane().setBackground(Color.white);
//디자인 보이게 하기
initDesign();
this.setVisible(true);
}
////////////////////////////////////////////
public void initDesign() {
//Grid Layout
this.setLayout(new GridLayout(2,2));
//버튼 생성
btnAdd = new JButton("1.회원가입");
btnList = new JButton("2.회원명단");
btnUpdate = new JButton("3.회원수정");
btnDel = new JButton("4.회원삭제");
//버튼색 지정
btnAdd.setBackground(Color.pink);
btnList.setBackground(Color.orange);
btnUpdate.setBackground(Color.yellow);
btnDel.setBackground(Color.green);
//버튼 기능 추가
btnAdd.addActionListener(this);
btnList.addActionListener(this);
btnUpdate.addActionListener(this);
btnDel.addActionListener(this);
//버튼 추가
this.add(btnAdd);
this.add(btnList);
this.add(btnUpdate);
this.add(btnDel);
}
////////////////////////////////////////////
//오버라이딩
@Override
public void actionPerformed(ActionEvent e) {
//버튼 객체 생성
Object ob = e.getSource();
if (ob==btnAdd) {
HelloInsertForm helloInsertForm = new HelloInsertForm();
} else if (ob==btnList) {
HelloListForm helloListForm = new HelloListForm();
} else if (ob==btnUpdate) {
String num = JOptionPane.showInputDialog("수정할 회원번호를 입력해주세요");
//cancel 누를 경우
if(num==null) {
return;
}
//num값을 형변환한 후, HelloModel의 getOnedate로 넘겨서 dto의 값을 받아옴
HelloDTO dto = new HelloModel().getOneData(Integer.parseInt(num));
if (dto.getNum()==null) {
System.out.println("리스트에 없는 번호");
//목록에 없는 번호라고 경고창
JOptionPane.showMessageDialog(this, "존재하지 않는 회원번호입니다");
//리스트에 번호가 존재하지 않을 때, 수정용 팝업 안보이게 하기
return;
} else {
System.out.println("리스트에 존재하는 번호");
//리스트에 번호가 존재할 때, 수정용 팝업 보이게 하기
}
//update 메서드 호출
HelloUpdateForm helloUpdateForm = new HelloUpdateForm();
helloUpdateForm.num = dto.getNum();
helloUpdateForm.tfName.setText(dto.getName());
helloUpdateForm.tfAddr.setText(dto.getAddr());
} else if (ob==btnDel) {
HelloDeleteForm helloDeleteForm = new HelloDeleteForm();
}
}
////////////////////////////////////////////
public static void main(String[] args) {
new HelloMain();
}
}
★ DTO
package quiz0908;
import java.util.Date;
public class HelloDTO {
private String num;
private String name;
private String addr;
private Date sdate;
//Worker 메서드
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Date getSdate() {
return sdate;
}
public void setSdate(Date sdate) {
this.sdate = sdate;
}
}
★ Model
package quiz0908;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import day0907.ShopDTO;
import quiz.DbConn;
public class HelloModel {
//커넥션 기본
DbConn db = new DbConn();
///////////////////////////////////////////
//Select
//Vector DTO 값을 리턴값으로 값을 출력하는 내용 - 이를 통해 테이블을 통해 전체 출력이 가능하게함
public Vector<HelloDTO> getAllData() {
//데이터들을 담을 백터값 선언
Vector <HelloDTO> list = new Vector<HelloDTO>();
//연결
Connection conn = db.getLoclaConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
//sql문
String sql = "Select * from Hello order by num";
//후속
try {
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
//DTO객체 생성
HelloDTO dto = new HelloDTO();
//rs의 출력값을 넣어줌
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getDate("sdate"));
//리스트에 추가
list.add(dto);
}
} catch (SQLException e) {
} finally {
db.dbClose(rs, pstmt, conn);
}
return list;
}
///////////////////////////////////////////
//Insert
//입력한 DTO를 인자값으로 전달받는다
public void insertHello(HelloDTO dto) {
//DCL의 기본 기능들을 넣어놓는 것이기에 접속은 필수
Connection conn = db.getLoclaConnection();
PreparedStatement pstmt = null;
//sql
String sql = "insert into hello values(seq_hello.nextval,?,?,sysdate)";
//후속
try {
pstmt = conn.prepareStatement(sql);
//DTO 객체는 이미 받았으므로 따로 생성할 필요없음
//값 배분
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
//업데이트
pstmt.execute();
} catch (SQLException e) {
} finally {
db.dbClose(pstmt, conn);
}
}
///////////////////////////////////////////
//Update - 가장 마지막에 작업하는 게 좋다
//1.getOneData
//한 가지 값을 읽어서 rs를 통해 DTO에 할당할 것임 - 삭제할 번호를 받는다
public HelloDTO getOneData(int num) {
//DTO에 담기 위해 객체 호출
HelloDTO dto = new HelloDTO();
//기본
Connection conn = db.getLoclaConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
//sql문
String sql = "Select * from Hello where num = ?";
//후속
try {
pstmt = conn.prepareStatement(sql);
//값할당
pstmt.setInt(1, num);
//rs로 쿼리문 확정
rs = pstmt.executeQuery();
//단일값 출력하면서 rs의 값을 dto값에 담아주기
//단일값은 if로 출력
if (rs.next()) {
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getDate("sdate"));
}
} catch (SQLException e) {
} finally {
db.dbClose(rs, pstmt, conn);
}
//dto값 반환
return dto;
}
//2.updateHello
//앞에서 입력한 DTO값을 받아서 작업
public void updateHello(HelloDTO dto) {
//기본
Connection conn = db.getLoclaConnection();
PreparedStatement pstmt = null;
//sql문
String sql = "update Hello set name=?, addr=? where num=?";
//후속
try {
pstmt = conn.prepareStatement(sql);
//!!!!!!!!!!!!
//dto에서 받은 값들을 토대로 sql문의 ? 값을 할당함
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
pstmt.setString(3, dto.getNum());
//업데이트
pstmt.execute();
} catch (SQLException e) {
} finally {
db.dbClose(pstmt, conn);
}
}
///////////////////////////////////////////
//Delete
//삭제받을 넘버값을 인자값으로 입력받는다
//정상 삭제되었는지 아닌지 여부를 int값으로 리턴한다.
public int deleteHello(int num) {
//기본
Connection conn = db.getLoclaConnection();
PreparedStatement pstmt = null;
//sql
String sql = "delete from Hello where num = ?";
int a = 0;
//후속
try {
pstmt = conn.prepareStatement(sql);
//값 할당
pstmt.setInt(1, num);
//업데이트와 동시에 변수 할당
a = pstmt.executeUpdate();
//정상삭제 여부를 알려주는 int 값을 반환
} catch (SQLException e) {
} finally {
db.dbClose(pstmt, conn);
}
//우선 a를 0으로 할당해주어야함
return a;
}
///////////////////////////////////////////
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
★ List Form
package quiz0908;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class HelloListForm extends JFrame implements ActionListener{
//DCL 메서드 호출을 위해 모아놓았던 객체 생성
HelloModel helloModel = new HelloModel();
//입출력을 위한 테이블 기본 모델과 테이블 생성
DefaultTableModel model;
JTable table;
//출력을 위해 Vector에 저장된 값 호출 - DTO를 객체로 생성하는 게 아니라, Vector가 DTO를 인자로 받음
Vector<HelloDTO> list;
//새로고침 버튼
JButton btnRefresh;
///////////////////////////////////////////
//기본
public HelloListForm() {
super("회원목록");
this.setBounds(800, 100, 700, 400);
this.getContentPane().setBackground(Color.orange);
initDesign();
//this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
/////////////////////////////////////////////
//기본 디자인
public void initDesign() {
//기본 레이아웃
this.setLayout(null);
//이미 HelloModel에서 getAllData이라는 이름으로
//Select 메서드를 return값을 Vector로 하는 list를 만들었다.
//여기에 접속 메서드를 비롯해 각 rs 값이 Vector로 저장되어있다.
//따라서 이 값을 불러와야한다.
//이 값이 곧 여기서 쓰일 Vector의 list 값과 같다.
//!!!!!!!!!!!!
list = helloModel.getAllData();
//테이블 타이틀
String [] title = {"회원번호", "회원명", "지역", "가입일자"};
//테이블 추가
model = new DefaultTableModel(title, 0);
table = new JTable(model);
//JScrollPane
JScrollPane js = new JScrollPane(table);
js.setBounds(10, 10, 665, 260);
this.add(js);
//버튼 추가
btnRefresh = new JButton("새로고침");
btnRefresh.setBounds(250, 300, 150, 30);
btnRefresh.addActionListener(this);
this.add(btnRefresh);
//테이블 출력
showTable();
}
////////////////////////////////////////////
//테이블 출력
//!!!!!!!! 테이블 출력은 따로 메서드를 만들어야 함
public void showTable() {
//모델 초기화 - 손님상 차리기
model.setRowCount(0);
//테이블에 Vector로 저장된 값들 dto 객체를 이용해 일제히 출력
//Vector<HelloDTO>를 담고 있던 Vetor값 일제 출력
//출력할땐 클래스가 아니라 String으로 바꾸어줘야하기 때문
for (HelloDTO dto : list) {
Vector<String> data = new Vector<String>();
//Vector에 데이터주기
data.add(dto.getNum());
data.add(dto.getName());
data.add(dto.getAddr());
//!!!!!!!!!!!!!!!!!!!!!!!!
//Vector가 String 형으로 선언되었기에 int나 data 형을 바꾸려면 String value of 사용
data.add(String.valueOf(dto.getSdate()));
//model에 넣어주기
model.addRow(data);
}
}
/////////////////////////////////////////////
//새로고침 버튼 메서드
@Override
public void actionPerformed(ActionEvent e) {
//단일 버튼일 경우, Object 안만들어도 된다!!!!!
//버튼을 누르면 다시 list의 값을 초기화
list = helloModel.getAllData();
//이걸 기반으로 다시 테이블 출력
showTable();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new HelloListForm();
}
}
★ Insert Form
package quiz0908;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
public class HelloInsertForm extends JFrame implements ActionListener{
//모델들
HelloModel helloModel = new HelloModel();
Container cp;
JLabel lbl1, lbl2, lbl3;
JTextField tfName, tfAddr, tfSdate;
JButton btnAdd;
JPanel panel;
////////////////////////////////////////
//기본
public HelloInsertForm() {
super("회원추가");
this.setBounds(800, 300, 400, 400);
this.getContentPane().setBackground(Color.pink);
initDesign();
//this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
////////////////////////////////////////
//디자인
public void initDesign() {
this.setLayout(null);
//라벨추가
lbl1 = new JLabel("이름", lbl1.CENTER);
lbl2 = new JLabel("지역", lbl2.CENTER);
lbl3 = new JLabel("가입일", lbl3.CENTER);
//라벨크기
lbl1.setBounds(50, 30, 50, 50);
lbl2.setBounds(50, 130, 50, 50);
lbl3.setBounds(50, 230, 50, 50);
//라벨보더
lbl1.setBorder(new LineBorder(Color.blue));
lbl1.setFont(new Font("맑은 고딕", Font.BOLD, 18));
lbl2.setBorder(new LineBorder(Color.blue));
lbl2.setFont(new Font("맑은 고딕", Font.BOLD, 18));
lbl3.setBorder(new LineBorder(Color.blue));
lbl3.setFont(new Font("맑은 고딕", Font.BOLD, 15));
//라벨추가
this.add(lbl1);
this.add(lbl2);
this.add(lbl3);
//Textfield 추가
tfName = new JTextField();
tfAddr = new JTextField();
tfSdate = new JTextField();
//크기
tfName.setBounds(130, 30, 220, 50);
tfAddr.setBounds(130, 130, 220, 50);
tfSdate.setBounds(130, 230, 220, 50);
//더하기
this.add(tfName);
this.add(tfAddr);
this.add(tfSdate);
//날짜 textfield에 오늘날짜 출력하기
//!!!!!!!!!!!!!!!!!!!!!!!!!!
SimpleDateFormat sysdate = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분");
Calendar time = Calendar.getInstance();
String todayDate = sysdate.format(time.getTime());
tfSdate.setText(todayDate);
//버튼추가
btnAdd = new JButton("회원가입");
btnAdd.setBounds(150, 300, 100, 50);
btnAdd.addActionListener(this);
this.add(btnAdd);
}
////////////////////////////////////////
//버튼 기능
@Override
public void actionPerformed(ActionEvent e) {
//버튼 하나면 Object 생성안해도 됨
//값을 넣어줄 DTO 객체 생성
HelloDTO dto = new HelloDTO();
//단순 insert는 num값이 필요없다
dto.setName(tfName.getText());
dto.setAddr(tfAddr.getText());
//HelloModel 클래스의 insert 객체 호출
helloModel.insertHello(dto);
//추가하면 현재창 닫기
this.setVisible(false);
}
// ////////////////////////////////////////
// public static void main(String[] args) {
// // TODO Auto-generated method stub
// new HelloInsertForm();
//
// }
}
★ Update Form
package quiz0908;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
public class HelloUpdateForm extends JFrame implements ActionListener{
//모델들
HelloModel helloModel = new HelloModel();
//전역변수에서 수정할 값의 num을 정의
String num;
Container cp;
JLabel lbl1, lbl2, lbl3;
JTextField tfName, tfAddr, tfSdate;
JButton btnAdd;
JPanel panel;
////////////////////////////////////////
//기본
public HelloUpdateForm() {
super("회원정보 수정");
this.setBounds(800, 300, 400, 400);
this.getContentPane().setBackground(Color.yellow);
initDesign();
//this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
////////////////////////////////////////
//디자인
public void initDesign() {
this.setLayout(null);
//라벨추가
lbl1 = new JLabel("이름", lbl1.CENTER);
lbl2 = new JLabel("지역", lbl2.CENTER);
lbl3 = new JLabel("가입일", lbl3.CENTER);
//라벨크기
lbl1.setBounds(50, 30, 50, 50);
lbl2.setBounds(50, 130, 50, 50);
lbl3.setBounds(50, 230, 50, 50);
//라벨보더
lbl1.setBorder(new LineBorder(Color.blue));
lbl1.setFont(new Font("맑은 고딕", Font.BOLD, 18));
lbl2.setBorder(new LineBorder(Color.blue));
lbl2.setFont(new Font("맑은 고딕", Font.BOLD, 18));
lbl3.setBorder(new LineBorder(Color.blue));
lbl3.setFont(new Font("맑은 고딕", Font.BOLD, 15));
//라벨추가
this.add(lbl1);
this.add(lbl2);
this.add(lbl3);
//Textfield 추가
tfName = new JTextField();
tfAddr = new JTextField();
tfSdate = new JTextField();
//크기
tfName.setBounds(130, 30, 220, 50);
tfAddr.setBounds(130, 130, 220, 50);
tfSdate.setBounds(130, 230, 220, 50);
//더하기
this.add(tfName);
this.add(tfAddr);
this.add(tfSdate);
//날짜 textfield에 오늘날짜 출력하기
//!!!!!!!!!!!!!!!!!!!!!!!!!!
SimpleDateFormat sysdate = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분");
Calendar time = Calendar.getInstance();
String todayDate = sysdate.format(time.getTime());
tfSdate.setText(todayDate);
//버튼추가
btnAdd = new JButton("정보수정");
btnAdd.setBounds(150, 300, 100, 50);
btnAdd.addActionListener(this);
this.add(btnAdd);
}
////////////////////////////////////////
//버튼 기능
@Override
public void actionPerformed(ActionEvent e) {
//버튼 하나면 Object 생성안해도 됨
//값을 넣어줄 DTO 객체 생성
HelloDTO dto = new HelloDTO();
//수정을 위해 num값을 넘겨받아야만 한다.
dto.setNum(num);
//단순 insert는 num값이 필요없다
dto.setName(tfName.getText());
dto.setAddr(tfAddr.getText());
//HelloModel 클래스의 insert 객체 호출
helloModel.updateHello(dto);
//추가하면 현재창 닫기
this.setVisible(false);
}
// ////////////////////////////////////////
// public static void main(String[] args) {
// // TODO Auto-generated method stub
// new HelloInsertForm();
//
// }
}
★ Delete Form
package quiz0908;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Date;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class HelloDeleteForm extends JFrame implements ActionListener{
//DCL 메서드 호출을 위해 모아놓았던 객체 생성
HelloModel helloModel = new HelloModel();
//입출력을 위한 테이블 기본 모델과 테이블 생성
DefaultTableModel model;
JTable table;
//출력을 위해 Vector에 저장된 값 호출 - DTO를 객체로 생성하는 게 아니라, Vector가 DTO를 인자로 받음
Vector<HelloDTO> list;
//새로고침 버튼
JButton btnDel;
///////////////////////////////////////////
//기본
public HelloDeleteForm() {
super("회원목록");
this.setBounds(800, 100, 700, 400);
this.getContentPane().setBackground(Color.green);
initDesign();
//this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
/////////////////////////////////////////////
//기본 디자인
public void initDesign() {
//기본 레이아웃
this.setLayout(null);
//이미 HelloModel에서 getAllData이라는 이름으로
//Select 메서드를 return값을 Vector로 하는 list를 만들었다.
//여기에 접속 메서드를 비롯해 각 rs 값이 Vector로 저장되어있다.
//따라서 이 값을 불러와야한다.
//이 값이 곧 여기서 쓰일 Vector의 list 값과 같다.
//!!!!!!!!!!!!
list = helloModel.getAllData();
//테이블 타이틀
String [] title = {"회원번호", "회원명", "지역", "가입일자"};
//테이블 추가
model = new DefaultTableModel(title, 0);
table = new JTable(model);
//JScrollPane
JScrollPane js = new JScrollPane(table);
js.setBounds(10, 10, 665, 260);
this.add(js);
//버튼 추가
btnDel = new JButton("삭제");
btnDel.setBounds(250, 300, 150, 30);
btnDel.addActionListener(this);
this.add(btnDel);
//테이블 출력
showTable();
}
////////////////////////////////////////////
//테이블 출력
//!!!!!!!! 테이블 출력은 따로 메서드를 만들어야 함
public void showTable() {
//모델 초기화 - 손님상 차리기
model.setRowCount(0);
//테이블에 Vector로 저장된 값들 dto 객체를 이용해 일제히 출력
//Vector<HelloDTO>를 담고 있던 Vetor값 일제 출력
//출력할땐 클래스가 아니라 String으로 바꾸어줘야하기 때문
for (HelloDTO dto : list) {
Vector<String> data = new Vector<String>();
//Vector에 데이터주기
data.add(dto.getNum());
data.add(dto.getName());
data.add(dto.getAddr());
//!!!!!!!!!!!!!!!!!!!!!!!!
//Vector가 String 형으로 선언되었기에 int나 data 형을 바꾸려면 String value of 사용
data.add(String.valueOf(dto.getSdate()));
//model에 넣어주기
model.addRow(data);
}
}
/////////////////////////////////////////////
//삭제 버튼 메서드
@Override
public void actionPerformed(ActionEvent e) {
//단일 버튼일 경우, Object 안만들어도 된다!!!!!
//선택한 행 번호를 받고 그걸 통해 값을 얻는다!!
//!!!!!!!!!!!!
int row = table.getSelectedRow();
Object value = table.getValueAt(row, 0);
//얻은 값을 num값으로 변환!!!
int num = Integer.parseInt((String) value);
System.out.println(num);
//row값 전달
//모델 객체 생성
HelloModel helloModel = new HelloModel();
helloModel.deleteHello(num);
list = helloModel.getAllData();
showTable();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new HelloDeleteForm();
}
}
'프로그래밍 > Oracle' 카테고리의 다른 글
2022년 2월 24일 - 우클릭 설정 해제 방법 & 오라클 Scott 계정 수동 쿼리문 (0) | 2022.02.24 |
---|---|
2021년 9월 13일 - 프로세스 모델링 언어 ERD & UML (0) | 2021.09.13 |
2021년 9월 8일 - JDBC : JDBC Swing (3) : DTO (0) | 2021.09.08 |
2021년 9월 7일 - JDBC : Swing (2) : DTO (0) | 2021.09.08 |
2021년 9월 6일 - JDBC : Swing (0) | 2021.09.06 |
댓글