package j0623;
// 테이블에 DB연동하기
import java.awt.*;
import java.awt.event.*; // ActionEvent
import javax.swing.*; // JTable
import javax.swing.table.*; // DefaultTableModel을 이용하여 데이터 저장
import java.sql.*; // DB연동
public class DB_Person extends JFrame implements ActionListener {
JLabel l1,l2,l3; //이름, 나이, 전화번호
JTextField tf1,tf2,tf3;
JPanel panel; //+JLabel, JTextArea 부착
//JTable
Object ob[][]=new Object[0][3]; // 데이터 표시(행X) 열만 나오게 설정
DefaultTableModel model; //데이터 저장부분
JTable table;
JScrollPane js;
String str[]= {"이름","나이","전화번호"}; //컬럼명
// DB 연동
Connection con=null;
PreparedStatement pstmt=null; //SQL구문을 실행
ResultSet rs=null; // select 구문을 사용할 때 반드시 필요
public DB_Person() { // 컴포넌트 생성하여 부착
super("테이블에 데이터 입력");
panel=new JPanel();
panel.setBackground(Color.ORANGE); // <-> getBackground()
// 1) 문자열, 2)위치(left,Center,right)
l1=new JLabel("이름",JLabel.CENTER);
l2=new JLabel("나이",JLabel.LEFT); //default
l3=new JLabel("전화번호",JLabel.RIGHT);
tf1=new JTextField(); tf2=new JTextField(); tf3=new JTextField();
// 패널의 배치 - 3행 2열(GridLayout)
panel.setLayout(new GridLayout(3,4)); //구조 변경
panel.add(l1); panel.add(tf1); // 이름
panel.add(l2); panel.add(tf2); // 나이
panel.add(l3); panel.add(tf3); // 전화번호
this.add("North",panel); // 부착
// JTable 가운데 배치
model=new DefaultTableModel(ob, str); //1)데이저 저장[][], 2)컬럼명
table=new JTable(model); // table=new JTable(ob,str);
js=new JScrollPane(table);
this.add("Center", js);
setBounds(250, 250, 300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
// 이벤트 연결하는 코딩
tf1.addActionListener(this);
tf2.addActionListener(this);
tf3.addActionListener(this);
// DB 접속하여 select문장을 사용해 JTable에 보여주는 구문 코딩
connect(); // DB접속하는 메소드
select(); // select하는 메소드
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
try { // 프로그램 종료전에 메모리에 DB연동 부분 해제
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
}catch(Exception e2) {
System.exit(0);
}
}
});
}
// connect()는 내부적으로 호출하기때문에 다른 클래스에서 호출되면 안됨
private void connect() {
try {
// 1) 접속할 드라이버를 메모리에 올리기 : 정적 메소드
Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@localhost:1521:orcl";
// 2) 접속하기 위한 메소드(1.접속url 2.계정명 3.계정암호)
con=DriverManager.getConnection(url, "scott", "tiger");
System.out.println("접속 : "+con);
}catch(Exception e) {
System.out.println("DB 접속 오류 : "+e);
}
}
public void select() {
try { // 1) 실행할 SQL 문장 작성
String sql="select * from person"; //지역변수 선언
pstmt=con.prepareStatement(sql);
System.out.println("pstmt : "+pstmt);
rs=pstmt.executeQuery(); // select문장
System.out.println("rs : "+rs);
// person테이블에서 불러오기
while(rs.next()) {
String name=rs.getString("name");
String age=rs.getString("age");
String tel=rs.getString("tel");
// Object[]을 만들어 저장하여 model에 추가하면 JTable에서 결과를 확인 가능
Object data[]= {name,age,tel};
model.addRow(data);
System.out.println(name+", "+age+", "+tel); // 콘솔 출력
}
}catch(Exception e) {
System.out.println("select() 실행 오류 : " +e);
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==tf1) { // 이름을 입력한 후 enter 친 경우
tf2.requestFocus(); // 커서입력
} else if(e.getSource()==tf2) {
tf3.requestFocus();
} else if(e.getSource()==tf3) {
if(tf1.getText().equals("") && tf2.getText().equals("") && tf3.getText().equals("")) {
// alert(~)
// JOptionPane.showMessageDialog(부모명,경고메세지)
JOptionPane.showMessageDialog(this, "값을 입력하세요.");
tf1.requestFocus(); // 이름필드부터 입력할 수 있게 커서 이동
return;
}
// 다 입력을 했다면 값을 모델에 데이터를 입력 : JTable에 화면 결과 출력
// 형식) 모델객체명.addRow(저장할 값(배열));
Object data[]= {tf1.getText(), tf2.getText(), tf3.getText()};
model.addRow(data);
// model에 저장한 데이터를 오라클 테이블에 저장(inset)
try{
// String sql="insert into person values('김영희','26',서울시 강남구')";
String sql="insert into person values(?,?,?)"; // ? : 파라미터 인수
pstmt=con.prepareStatement(sql);
// 형식) pstmt.set자료형(?순서번호,저장할값); => setString, setInt~
pstmt.setString(1, tf1.getText());
pstmt.setString(2, tf2.getText());
pstmt.setString(3, tf3.getText());
// 반환값
int insert=pstmt.executeUpdate(); // 1:sql성공, 0:sql실패
System.out.println("데이터 성공 유무(insert) : "+insert);
// select 조회
rs=pstmt.executeQuery("select * from person");
while(rs.next()) {
String name=rs.getString("name");
String age=rs.getString("age");
String tel=rs.getString("tel");
System.out.println(name+", "+age+", "+tel); // 콘솔 출력
}
}catch(Exception e2) {
System.out.println("person테이블에 데이터 입력 실패 : "+e2);
}
// 재입력을 위한 필드 초기화
tf1.setText(""); tf2.setText(""); tf3.setText("");
tf1.requestFocus(); // 커서 이동
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new DB_Person();
}
}