190611_Day42 <기존 코드 대입> 어제에 이어서...
M
- DAO , 데이터를 가지고 Calculator
V
C
- 요청분석
- 데이터 얻기
- 모델호출
- 뷰호출
- 유효성검사
<작업순서>
어제에 이어서 개선하고, 추가하자!
-
입력폼 : X버튼 클릭시 '메인뷰'로 이동
-
입력폼 : 입력버튼 클릭시
- '입력폼에 입력한 데이터들 얻어와서 하나로 모으기 '
- 데이터 (3개) 얻어오기 => 하나의 변수명으로 저장하기
- 알맞은 모델호출 (Insert)
- boolean insert (Person p)
- 입력이 잘 되었을 때 메인뷰로 이동
- => 이동 전 전체 Person의 정보 얻어오기
- => 알맞은 모델 호출 (selectAll)
- => 얻어 온 정보를 메인뷰에 출력
- => Main뷰 클래스에 출력하는 메소드 정의 (예 : displayTable)
-
메인뷰 : 수정버튼 클릭시
-
모델호출에 필요한 수정번호(사용자로부터) 얻기
- 방법1) JTable에 선택된 행의 번호 얻기
- 방법2) JOptionPane에 입력창을 통한 입력된 번호 얻기
-
이동 전 수정 폼에 출력될 내용 (DB로부터) 조회 : 모델호출
- => Person select (int no)
-
메인뷰 => 수정폼 이동
-
-
수정폼 : 수정버튼 클릭시
- 데이터 (2개) 얻어오기
- 하나의 변수명으로 저장하기
- 알맞은 모델호출(update)
- boolean update (Person p)
- 수정이 잘 되었을 때 메인뷰로 이동
- 이동 전 전체 Person의 정보 얻어오기
- 알맞은 모델호출 (selectAll)
- 정보 (수정 후 결과) 를 메인뷰 (JTable)에 출력
- Main뷰 클래스에 출력하는 메소드 정의 ( 예 : displayTable)
- 이동 전 전체 Person의 정보 얻어오기
- 데이터 (2개) 얻어오기
-
메인뷰 : 삭제버튼 클릭시
-
JOptionPane의 inputDialog를 통해 삭제할 번호 입력
-
알맞은 모델(DAO) 호출 (delete)
- boolean delete (int no)
-
수정이 잘 되었을 때 메인뷰로 이동
- 이동 전 전체 Person의 정보 얻어오기
- 알맞은 모델호출 (selectAll)
- 정보 (삭제 후 결과) 를 메인뷰 (JTable)에 출력
- Main뷰 클래스에 출력하는 메소드 정의 ( 예 : displayTable)
- 삭제가 잘 되지 않았을 때
- 실패메시지 출력
- 이동 전 전체 Person의 정보 얻어오기
-
-
유효성검사
- 사용자가 입력한 데이터를 대상으로!
- 입력폼, 수정폼에서 빈값에 대한 체크
- 입력폼, 수정폼에서 나이에 숫자값 체크
- 삭제번호 입력 -> 숫자값 체크
-
기타
-
입력폼의 TextField 초기화
-
InputForm에 메소드 추가 : void initText(){
예: tf_job.setText(""); } ---> 입력폼 호출시 ---> 입력폼: 취소버튼 클릭시
- 수정폼의 취소버튼 클릭시 : 처음 출력된 데이터를 다시 출력
- ---> UpForm에 메소드 추가 : void initText(){
예: tf_job.setText("학생"); }
- JTable범위밖의 데이터가 출력될때 ==> 스크롤바의 위치(포커스)를 하단으로 이동.
-
-
DAO
package j0611.model.dao;
import java.sql.Statement;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Properties;
import j0610.model.dto.Person;
public class PersonDAO
{
Connection conn;
Statement stmt;
ResultSet rs;
Properties pro;
public PersonDAO()
{
try
{
pro = new Properties();
pro.load(new FileReader("conn/conn.properties"));
Class.forName(pro.getProperty("driver"));
}catch (Exception e) {
e.printStackTrace();
}
}
//public boolean insert(자바빈즈) {}
public boolean insert(Person p) {
//또는public void insert(Person p) {}
connect();
try {
stmt = conn.createStatement();
String sql="insert into person (no,name,age,job) values "
//+ "(1, '홍길동' , 13 , '학생' )";
+ "(person_seq.nextval, '"+p.getName()+"' , "+p.getAge()
+" , '"+p.getJob()+"' )";
System.out.println("추가SQL==> "+ sql);
stmt.executeUpdate(sql);//DB에게 입력요청
return true;
} catch (SQLException e) {
e.printStackTrace();
} finally {
disconnect();
}
return false;
}//insert
//또는 public boolean update(자바빈즈) {}
public boolean update(Person p) {
connect();
try {
stmt = conn.createStatement();
System.out.println("수정할 Person>>>"+ p);
//String sql="update person set age=16, job='학생2' where no=3";
String sql="update person set age="+p.getAge()+", job='"+p.getJob()+
"' where no="+p.getNo();
System.out.println("수정 SQL>>>"+ sql);
int t = stmt.executeUpdate(sql);//수정요청!!
System.out.println("수정된 행의 갯수>>>"+ t);
if(t==1)//수정이 성공하였다면
return true;
} catch (SQLException e) {
e.printStackTrace();
} finally {
disconnect();
}
return false;
}//update
//또는public void update(Person p) {}
//public void delete(프라이머리 키) {}
public boolean delete(int no) {
connect();
try {
stmt = conn.createStatement();
//String sql="delete from person where no=3";
String sql="delete from person where no="+no;
int t = stmt.executeUpdate(sql);//(삭제)실행요청
if(t==1) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
disconnect();
}
return false;
}//delete
//또는 public void delete(int no) {}
//public void select(프라이머리 키) {}
public Person select(int no) {//한 개의 Person정보 얻어오기 --> 수정폼
connect();
try {
stmt = conn.createStatement();
String sql="select name,age,job from person where no="+no;
rs = stmt.executeQuery(sql);
if(rs.next()) {//조회된 행이 있다면
//DB로 부터 데이터 얻기 : rs.get~()
//rs.getString("name");
//rs.getString("age");//"13"
//rs.getInt("age");// 13
//rs.getString("job");
Person p = new Person( no, rs.getString("name"),
rs.getInt("age"),
rs.getString("job"));
return p;
}//else {
//특정 번호 없음!!
//}
} catch (SQLException e) {
e.printStackTrace();
} finally {
disconnect();
}
return null;//번호에 일치하는 Person정보를 얻지 못했을때
}//select
public ArrayList<Person> selectAll() {//모든 Person 정보 얻어오기
connect();
ArrayList<Person> list = new ArrayList<Person>();//(Person)데이터 담는 바구니
try {
stmt = conn.createStatement();
String sql="select no,name,age,job from person order by no";
rs =stmt.executeQuery(sql);
while(rs.next()) {
/*
int no= rs.getInt("no");//rs.get~() ==> DB로 부터 데이터 얻기
String name = rs.getString("name");
int age = rs.getInt("age");
String job = rs.getString("job");
//4개의 변수를 하나의 변수로 저장
Person p = new Person(no, name, age, job);
//p.getNo()
list.add(p);
//list.get(0)
//list.get(0).getNo()
*/
list.add(new Person(rs.getInt("no"), rs.getString("name"),
rs.getInt("age"), rs.getString("job")));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
disconnect();
}
return list;
}//selectAll
private void connect() {
try {
conn = DriverManager.getConnection(pro.getProperty("url"),pro);
//pro.getProperty("user"),
//pro.getProperty("pwd"));
} catch (SQLException e) {
e.printStackTrace();
}
}//connect
private void disconnect() {
try {
//연결끊기(DB자원반환)
if(conn != null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}//disconnect
}//PersonDAO
DTO
package j0610.model.dto;
public class Person
{
// 속성정의
private int no;
private String name;
private int age;
private String job;
public Person()
{
}
public Person(int no, String name, int age, String job)
{
this.no = no;
this.name = name;
this.age = age;
this.job = job;
}
public int getNo()
{
return no;
}
public void setNo(int no)
{
this.no = no;
}
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;
}
public String getJob()
{
return job;
}
public void setJob(String job)
{
this.job = job;
}
@Override
public String toString()
{
return "Person [no=" + no + ", name=" + name + ", age=" + age + ", job=" + job + "]";
}
// @Override
// public String toString() {
// return no+": ["+name+","+age+","+job+"]";
// }
}// class Person
Controller
package j0610.control;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import j0610.model.dao.PersonDAO;
import j0610.model.dto.Person;
import j0610.view.InputForm;
import j0610.view.MainView;
import j0610.view.UpForm;
public class Controller implements ActionListener
{
/*
* <컨트롤러의 역할>★ - 전체 프로그램에 대한 흐름 제어!! 1. 사용자 요청 분석 (예: 어떤 버튼을 눌렀는지) 2. 사용자 입력 데이터
* 얻어오기 (예: 입력폼 또는 수정폼을 통해 입력된 데이터) 3. ★모델객체생성(예: PersonDAO) - 메소드호출 - 결과값 (리턴값)
* 얻기, 저장, 판단 4. 페이지(뷰) 이동 (예: 메인(JTable) ----> 입력폼)
*
* 선택사항) 유효성 검사(valid check) <=== 사용자가 입력한 데이터에 대한!!
*
*/
// 뷰등록
MainView mainView;
InputForm form;
UpForm upForm;
public Controller()
{
// 객체생성
mainView = new MainView();
mainView.displayTable(new PersonDAO().selectAll());
form = new InputForm();
upForm = new UpForm();
eventUp();
}// 생성자
private void eventUp()
{// 이벤트 소스 등록
// 메인뷰
mainView.bt_insert.addActionListener(this);
mainView.bt_update.addActionListener(this);
mainView.bt_del.addActionListener(this);
mainView.bt_exit.addActionListener(this);
// 입력폼
form.bt_submit.addActionListener(this);
// form == JFrame == Window
form.addWindowListener(new WindowAdapter()
{
// class 무명 extends WindowAdapter{ }
@Override
public void windowClosing(WindowEvent e)
{// 윈도우 프레임 우측상단X버튼 클릭시
form.setVisible(false);
mainView.setVisible(true);
}
});
// 수정폼
upForm.bt_submit.addActionListener(this);
upForm.addWindowListener(new WindowAdapter()
{
// class 무명 extends WindowAdapter{ }
@Override
public void windowClosing(WindowEvent e)
{// 윈도우 프레임 우측상단X버튼 클릭시
upForm.setVisible(false);
mainView.setVisible(true);
}
});
}// eventUp
@Override
public void actionPerformed(ActionEvent e)
{
Object ob = e.getSource();// action이벤트를 발생시킨 이벤트 소스의 주소 얻기
if (ob == mainView.bt_insert)
{// 1.메인뷰 : 입력버튼 ==> 분석: 입력폼요청!!
// 4.메인뷰 ---> 입력폼 이동!!
mainView.setVisible(false);
form.setVisible(true);
} else if (ob == form.bt_submit)
{// 1.입력폼: 입력버튼 ==> 분석: DB입력 요청!!
// 2. 입력데이터 얻기
String name = form.tf_name.getText();
String age = form.tf_age.getText();
String job = form.tf_job.getText();
// 세개의 변수를 p변수로 정의하기(한개의 변수명으로 정의하기)
Person p = new Person(0, name, Integer.parseInt(age), job);
// 3. 모델 객체생성
PersonDAO dao = new PersonDAO();
if (dao.insert(p))
{// 입력성공
// 메인뷰에 출력할 (DB로부터) 전체 데이터 얻기
ArrayList<Person> list = dao.selectAll();
// Person []perArr = (Person[]) list.toArray();
mainView.displayTable(list);
// 입력폼 ----> 메인뷰
form.setVisible(false);
mainView.setVisible(true);
}
} else if (ob == mainView.bt_update)
{
// 1. 메인뷰: 수정버튼클릭시 ---> 수정폼 요청
int row = mainView.table.getSelectedRow();
if (row == -1)
{// 선택된 행이 없다면
// JOptionPane.showMessageDialog(mainView, "수정할 행을 선택!!");
mainView.showMsg("수정할 행을 선택!!");
return;
}
// System.out.println("선택된 행 인덱스>>>"+ row);
// 2.
Object value = mainView.table.getValueAt(row, 0);
// 0 column: 번호표현
// System.out.println("선택된 번호>>>"+ value);
int no = Integer.parseInt(value.toString());
// 3 <---- "3"
upForm.upNo = no;// 수정폼 멤버에 '번호'저장
// 3.
PersonDAO dao = new PersonDAO();
Person p = dao.select(no);
// DB조회값 ----> 수정폼 전달
/*
* p.getName() upForm.tf_name.setText(); p.getAge() upForm.tf_name.setText();
* p.getJob() upForm.tf_name.setText();
*/
upForm.tf_name.setText(p.getName());
upForm.tf_age.setText(p.getAge() + "");
// tf_age.setText(13); (X) tf_age.setText("13"); (O)
upForm.tf_job.setText(p.getJob());
// 4.
mainView.setVisible(false);
upForm.setVisible(true);
} else if (ob == upForm.bt_submit)
{
// 1. 수정폼: 수정버튼 클릭시 ----> DB수정 요청시
// 2.
String age = upForm.tf_age.getText();
String job = upForm.tf_job.getText();
// upForm.upNo//수정폼 멤버에 저장된 '번호' 찾기
Person p = new Person();// 기본생성자 : (no=0, name=null, age=0, job=null)
p.setAge(Integer.parseInt(age));// : (no=0, name=null, age=20, job=null)
p.setJob(job);// : (no=0, name=null, age=20, job="장군")
p.setNo(upForm.upNo);// : (no=4, name=null, age=20, job="장군")
// Person p = new Person(upForm.upNo, null,Integer.parseInt(age), job);//오버로딩
// 생성자
// 3.
PersonDAO dao = new PersonDAO();
if (dao.update(p))
{// 수정이 잘되었다면 ---> JTable에 수정내용을 반영
mainView.displayTable(dao.selectAll());// 내용 갱신
upForm.setVisible(false);
mainView.setVisible(true);
}
} else if (ob == mainView.bt_del)
{
// 1.메인폼 : 삭제버튼 클릭시 ----> DB삭제 요청시
// 2.(삭제할 번호)데이터 얻기
String no = mainView.showInput("삭제할 번호:");
// 3.
PersonDAO dao = new PersonDAO();
if (dao.delete(Integer.parseInt(no)))
{
mainView.showMsg("삭제성공!!");
mainView.displayTable(dao.selectAll());
} else
{
mainView.showMsg("삭제실패!!");
}
} else if (ob == mainView.bt_exit)
{
System.exit(0);
}
}// actionPerformed
public static void main(String[] args)
{
new Controller();
}
}
궁금상자
DTO VO
두개 이상의 속성을 묶어주는 역할에서는 동일함,
DB에서 묶어주는것 VO
뷰에서 항목들 모아서 전달하는것이 DTO
정도로 어제 했갈렸던것을 정리!
'클라우드 기반 웹 개발자 과정 공부 > DB' 카테고리의 다른 글
190614_Day45 <회원가입 마무리>, <JCF 자바컬렉션 프레임워크> (0) | 2019.06.14 |
---|---|
190612,13 Day43,44 <로그인, 회원가입 DB> (0) | 2019.06.12 |
190610_DAY41 <기존 인메모리 코드에 DB연결 실습 및 연습> (0) | 2019.06.10 |
190504,5_DAY39,40 <복습> <Cursor>, <Package>, <Trigger>, <바인드변수>, <Table>, <Rollup & Cube>, <카티션 곱>, <GROUPING>, <집합연산자>, <JDBC> (0) | 2019.06.04 |
190603_DAY38 <복습>, <조건문>,<반복문>, <Stored Procedure>, <Stored Function> (0) | 2019.06.03 |