다음은 JDBC를 이용하여 데이터베이스(여기서는 Ms-Access)연결 예제입니다.
소스 대부분은 awt와 이벤트 처리이고, 정작 DB연결 처리는 간단합니다.
파란색으로 표시 했으니.. DB연결작업을 눈여겨 보세요..!!
실행 그림 장면은 ece서버가 고쳐지는대로 이곳에 같이 올릴것이며,
소스와 DB파일을 자료실에 올립니다.
import java.awt.*;
import java.awt.event.*;
import java.util.*; //Calendar(나이...)를 얻어내기 위해서..
import java.io.*; //Exception 처리를 위해서.. 현재 시스템의 시간을 알아내기 위해..
import javax.swing.*;
import javax.swing.table.*;//colum과 header를 지원받기 위해서(DefaultTableModel...)
import java.sql.*;
class JDBCApplication extends Frame implements ActionListener, ItemListener, FocusListener {
Connection conn;
Statement stmt;
ResultSet rs;
Panel global = new Panel();
Panel center = new Panel();
Panel west = new Panel();
Panel west1 = new Panel();
Panel west11 = new Panel();
Panel west12 = new Panel();
Panel west13 = new Panel();
Panel west2 = new Panel();
Panel west21 = new Panel();
Panel west22 = new Panel();
Panel db1 = new Panel();
Panel db2 = new Panel();
Panel db3 = new Panel();
Panel db31 = new Panel();
Panel south = new Panel();
//////////////// JTable ////////////////
//String이 배열로 되어있으면 Object Type이다.
String head[][] = new String[30][6];//30행 6열
String item[] = {"성명","주민번호","나이","성별","생일","직업"};
//한줄단위로 선택
DefaultTableModel model = new DefaultTableModel(head, item){
public boolean isCellEditable(int row, int cal){
return false;
}
};
JTable table = new JTable(model);
JScrollPane pane = new JScrollPane(table);
Label help = new Label();
//////////////// west1 ////////////////
TextField nameTF = new TextField();
TextField idTF = new TextField();
Choice job = new Choice();
//////////////// west2 ////////////////
String title[] = {"나이","성별","생일"};
Label label[] = new Label[3];//Label 선언
CheckboxGroup cg = new CheckboxGroup();
Checkbox check1 = new Checkbox("성명",cg,true);
Checkbox check2 = new Checkbox("직업",cg,false);
Checkbox check3 = new Checkbox("나이",cg,false);
TextField nameDB = new TextField(21);
Choice jobDB = new Choice();
Choice ageDB = new Choice();
Button find = new Button("찾 기");
Button delete = new Button("지우기");
Button end = new Button("닫 기");
//////////////// south ////////////////
Button send = new Button(" 전 송 ");
Button search = new Button(" 검 색 ");
Button erase = new Button(" 삭 제 ");
Button modify = new Button(" 수 정 ");
Button close = new Button(" 종 료 ");
CardLayout card = new CardLayout();
JDBCApplication(){
super("Java DataBase Connectivity Example");
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //MS-Access 와 Ms-sql 일경우..
conn = DriverManager.getConnection("jdbc:odbc:memberDB", "", "");
// 여기서 memberDB는 DB원본이름이고,, 뒤에 "", "" 은 Access에는
//아이디와 패스워드가 필요없기 때문이다.
// DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); <--오라클일경우..
// conn = DriverManager.getConnection("jdbc:oracle:thin:@211.183.2.18:1521:javadb",
// "troment","a3726"); 아이디가 troment, 패스워드가 a3726일경우..,
stmt = conn.createStatement();
System.out.println("DB 연결 성공");
}// try end
catch(Exception e){System.out.println("DB 연결 실패 " + e);}
center.setLayout(new BorderLayout(0,10));
center.add("Center", pane);
help.setFont(new Font("돋움체",Font.BOLD,12));
help.setBackground(new Color(255,200,255));
center.add("South", help);
west11.setLayout(new BorderLayout(5,0));
west11.add("Center", nameTF);
west11.add("West", new Label("성 명", Label.CENTER));
west12.setLayout(new BorderLayout(5,0));
west12.add("Center", idTF);
west12.add("West", new Label("주민번호", Label.CENTER));
west13.setLayout(new BorderLayout(5,0));
job.addItem("프돌이");
job.addItem("디자이너");
job.addItem("회사원");
job.addItem("학생");
west13.add("Center", job);
west13.add("West", new Label("직 업", Label.CENTER));
west1.setLayout(new GridLayout(4,1,0,5));
west1.add(new Label(""));
west1.add(west11);
west1.add(west12);
west1.add(west13);
//west1.add(new Label(""));
west21.setLayout(new GridLayout(3,4,0,5));
for(int i=0;i<4;i++)
west21.add(new Label(""));//가상 행을 삽입
for(int i=0;i<3;i++){
west21.add(new Label(title[i], Label.CENTER));
label[i] = new Label();//Label 객체 생성
label[i].setBackground(Color.white);
west21.add(label[i]);
}
west21.add(new Label(""));
west21.add(new Label(""));//빈공간에대한 가상 Label삽입
db1.setLayout(new GridLayout(1,3));
db1.add(check1);
db1.add(check2);
db1.add(check3);
db2.setLayout(card);
db2.add(nameDB, "name");
jobDB.addItem("프돌이");
jobDB.addItem("디자이너");
jobDB.addItem("회사원");
jobDB.addItem("학생");
db2.add(jobDB, "job");
for(int i=10;i<=70;i+=10)
ageDB.addItem(String.valueOf(i));
db2.add(ageDB, "age");
db31.setLayout(card);
db31.add(find, "find");
db31.add(delete, "delete");
db3.add(db31);
db3.add(end);
west22.setLayout(new GridLayout(3,1,0,5));
west22.add(db1);
west22.add(db2);
west22.add(db3);
west2.setLayout(card);
west2.add(west21, "personal");
west2.add(west22, "searching");
west.setLayout(new GridLayout(2,1));
west.add(west1);
west.add(west2);
south.setLayout(new GridLayout(1,5,5,0));
south.add(send);
south.add(search);
south.add(erase);
south.add(modify);
south.add(close);
global.setLayout(new BorderLayout(5,5));
global.add("Center", center);
global.add("West", west);
global.add("South", south);
setBackground(Color.lightGray);
add("West", new Label(""));
add("East", new Label(""));
add("South", new Label(""));
add("North", new Label(""));
card.show(west2, "personal");
add("Center", global);
//////////////// JTable ////////////////
table.getColumnModel().getColumn(0).setPreferredWidth(80);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(60);
table.getColumnModel().getColumn(3).setPreferredWidth(60);
table.getColumnModel().getColumn(4).setPreferredWidth(60);
table.getColumnModel().getColumn(5).setPreferredWidth(100);
table.setShowHorizontalLines(false);
table.setShowVerticalLines(false);
table.setSelectionBackground(Color.orange);
table.setSelectionForeground(Color.red);
table.setRowMargin(0);
table.setIntercellSpacing(new Dimension(0,0));
table.setRequestFocusEnabled(false);
setBounds(60,150,670,360);
setResizable(false);
setVisible(true);
send.addActionListener(this);
search.addActionListener(this);
erase.addActionListener(this);
modify.addActionListener(this);
close.addActionListener(this);
find.addActionListener(this);
delete.addActionListener(this);
end.addActionListener(this);
check1.addItemListener(this);
check2.addItemListener(this);
check3.addItemListener(this);
idTF.addFocusListener(this); //주민등록 입력창에 포커스이벤트가 발생했을때 help 창에
//주민등록번호 입력 메세지를 띄우기 위해...
}
public void actionPerformed(ActionEvent e) {
Object ob = e.getSource();
if(ob == search)
{
card.show(west2, "searching");
card.show(db31, "find");
card.show(db2, "name");
check1.setState(true);
}
if(ob == erase)
{
card.show(west2, "searching");
card.show(db31, "delete");
card.show(db2, "name");
check1.setState(true);
}
if(ob == send)
sendProcess();
if(ob == end)
card.show(west2, "personal");
if(ob == close)
System.exit(0);
if(ob == find) {
String temp="";
if(check1.getState()) {
temp = nameDB.getText().trim();
selectProcess(temp, "name"); // 여기서 "name"은 테이블에서 필드 이름이다.
} //check1 end
else if(check2.getState()) {
temp = jobDB.getSelectedItem().trim();
selectProcess(temp, "job");
}
else if(check3.getState()) {
temp = ageDB.getSelectedItem().trim();
selectProcess(temp, "age");
}
}//find end
if(ob == delete) {
String temp="";
if(check1.getState()) {
temp = nameDB.getText().trim();
// selectProcess(temp, "name"); // 여기서 "name"은 테이블에서 필드 이름이다.
deleteProcess(temp, "name");
} //check1 end
else if(check2.getState()) {
temp = jobDB.getSelectedItem().trim();
// selectProcess(temp, "job");
deleteProcess(temp, "job");
}
else if(check3.getState()) {
temp = ageDB.getSelectedItem().trim();
// selectProcess(temp, "age");
deleteProcess(temp, "age");
}
}//delete end
} //actionPerformed end~!!
private void deleteProcess(String temp, String item)
{
String sql = "Delete from member";
if(temp.length() >= 1) {
if(item.equals("age")) {
int n = Integer.parseInt(temp);
if(n == 70)
sql += " where age >= '" + n + "'"; //★★sql 문장에서는 이렇게 '으로 문자열을 인용한다는 사실에 주위한다.★★
else
sql += " where age >= '" + n +"' AND age <'" + (n+10) + "'";
} //age if문 end
else
sql += " where " + item + "= '" + temp + "'";
}
System.out.println(sql); //★★try절로 가기 전에 이렇게 콘솔출력을 통해 sql문의 올바름 여부를 알 수 있다. ★★
try {
stmt.executeUpdate(sql);
help.setText(stmt.getUpdateCount() + " 개가 삭제 되었습니다.");//직접 API를 찾아 보세요..~.^*
}catch(SQLException e) {System.out.println("data 삭제 실패" + e);}
}
private void selectProcess(String temp, String item)
{
String sql = "select * from member";
if(temp.length() >= 1) {
if(item.equals("age")) {
int n = Integer.parseInt(temp);
if(n == 70)
sql += " where age >= '" + n + "'";
else
sql += " where age > '" + n +"' AND age <'" + (n+10) + "'";
} //age if문 end
else
sql += " where " + item + "='" + temp + "'";
}
System.out.println(sql);
model.setNumRows(0);
try{
rs = stmt.executeQuery(sql);
while(rs.next())
{
String record[] = new String[6];
for(int i=1; i<=6; i++)
record[i-1] = rs.getString(i); //DB에서의 인덱스는 1부터 시작한다..★★★
model.addRow(record);
} //while end
} // try end
catch(SQLException e) {System.out.println("검색실패 " + e);}
catch(Exception e) { }
if(temp.length() <1)
help.setText("모든 record " + table.getRowCount() + " 개가 검색되었습니다.");
else
help.setText(temp + "에 관련된 record" + table.getRowCount() + " 개가 검색되었습니다.");
}
private void sendProcess() {
String name = nameTF.getText().trim();
String id = idTF.getText().trim();
if(name.length()<1 || id.length()<1)
{
// JOptionPane.showMessageDialog(this, "올바르게 입력해주세요");
return;
}
String sql = "Insert into member values('" + name + "','" + id + "',";
for(int i=0; i<3; i++)
sql += "'" + label[i].getText() + "',";
sql += "'" + job.getSelectedItem() + "')";
System.out.println("Sql="+sql); //sql문이 이상이 없는지 콘솔출력을 통해 확인할 수 있다.
try{
stmt.executeUpdate(sql);
help.setText("data가 정상적으로 입력 되었습니다.");
System.out.println("data가 정상적으로 입력 되었습니다.");
//}catch(SQLException e) {help.setText("data 전송 실패" + e);}
}catch(SQLException e) {System.out.println("data 전송 실패 " + e.getMessage());}
catch(Exception e){}
cleaning();
}//sendProcess End
void cleaning() {
nameTF.setText("");
idTF.setText("");
job.select(0);
for(int i=0; i<3; i++)
label[i].setText("");
nameTF.requestFocus(); // nameTF에서 Focus를 요청!!
}
public void itemStateChanged(ItemEvent e) {
Object ob = e.getSource();
if(ob == check1)
card.show(db2, "name");
else if(ob == check2)
card.show(db2, "job");
else if(ob == check3)
card.show(db2, "age");
}
public void focusGained(FocusEvent e) {
help.setText("주민등록 번호를 입력해 주십시오");
}
public void focusLost(FocusEvent e) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
String id = idTF.getText().trim();
if(!idCheck(id)) {
JOptionPane.showMessageDialog(this, "똑바로 입력해 주십시오!!");
return;
}
int age = Integer.parseInt(id.substring(0,2)); //substring 다소문자이고 2앞까지라는 사실에 주의!!
label[0].setText(id.charAt(7)-48 <3 ? String.valueOf(year-(1900+age)) : String.valueOf(year-(2000+age))); //아무래도 이상한데..
label[1].setText(id.charAt(7)-48 % 2 == 0 ? "여자" : "남자");
label[2].setText(id.substring(2,4) + "/" + id.substring(4,6));
help.setText("아주 좋아요");
}
private boolean idCheck(String id){ //주민등록번호 진위판별..
boolean sw = true;
int y[] = {2,3,4,5,6,7,0,8,9,2,3,4,5};
int sum = 0;
try {
for(int i=0; i<13; i++) {
if(id.charAt(i)=='-')
continue;
sum += (id.charAt(i)-48)*y[i];
} // for end
int temp = 11*(sum/11)+11 - sum;
int result = temp - 10 * (temp/10);
if(result != (id.charAt(13)-48))
sw=false;
} catch(Exception ex){ sw=false;}
return sw;
}
public static void main(String args[]){
new JDBCApplication();
}
}
※ DB작성방법(Ms-Access 2000 중심으로..)※
1. 실행 -> 새데이터베이스 만들기(새 Access 데이터베이스)
2. 저장화면이 나온다. 임의의 폴더에 임의의 파일이름으로 저장한다.
3. 데이터베이스 창이 하나 뜬다. 세개의 메뉴중 디자인보기에서 새 체이블 만들기 더블클릭
4. 테이블이 뜬다. 위의 프로그램경우 DB에 들어갈내용이... name, id, age, sex, birth, job 이 있다.
필드명 각각의 셀에 위의 6개의 항목을 입력하고 데이터 형식은 텍스트로 한다.(텍스트로
저장할 것이므로....)
5. 종료버튼을 눌러 테이블을 종료시킨다. --> 저장하는 화면이 나온다. 테이블명을 위의 소스 코드중..
insert into 테이블명 ... 에서 테이블명에 해당하는 이름으로 저장한다.
6. 테이블창이 닫힌후 데이터베이스창이 남아있다. 마져 종료시킨다.
7. 제어판의(윈도 2000경우, 윈도 98은 제어판의 ODBC설정으로..)관리도구의 데이터원본(ODBC)로 간다.
사용자DSN에서 추가버튼을 누르고, Microsoft Access Driver (*.mdb)를 선택한다.
8. 중간쯤에 데이터베이스 선택 버튼을 눌러서 아까 만들었던 DB파일을 선택한다.
9. 위에 데이터베이스 원본이름을 적는곳에
conn = DriverManager.getConnection("jdbc:odbc:memberDB", "", "");
이곳에서 정해주었던 memberDB를 적고 확인버튼을 누르고 빠져 나온다.
10. 끝.. 이제 컴파일하고 제대로 실행되는지 확인해본다.
[펌 : 예전 공부사이트 김상철 씀]]