Java GUI Edit Update to Database |
Java GUI Edit Update to Database บทความนี้จะเป็นตัวอย่างการเขียน Java GUI เพื่อแก้ไข Update ข้อมูลใน Database โดยในตัวอย่างนี้จะออกแบบ Frame ขึ้นมา 2 Frame สำหรับ Frame แรกจะเป็นการแสดงข้อมูลใน JTable และคลิกรายการที่จะแก้ไข ส่วน Frame สองจะเป็น Dialog แสดงรายละเอียดไว้การแก้ไขข้อมูลที่ถูกเลือกมาจาก JTable ของ Frame แรก จากนั้นจะสามารถเลือกแก้ไขข้อมูลตามช่องใน JTextField ต่าง ๆ ที่ออกแบบไว้ พร้อมกับนำผลลีพธ์ไป Update ในฐานข้อมูล
แสดงรายการที่จะเลือกเพื่อแก้ไข Update ข้อมูล
Java GUI Edit Update to Database
ในตัวอย่างนี้จะเลือกใช้ Database ของ MySQL แต่ในกรณีที่จะใช้ร่วมกับ Database อื่น ๆ ก็สามารถทำได้ง่าย ๆ เพียงแค่เปลี่ยน Connector และ Connection String เท่านั้น และการแสดงข้อมูลจะใช้ JTable ของ Java Swing สามารถอ่านเพิ่มเติมได้ที่บทความนี้
Java Connect to MySQL Database (JDBC)
Java Table (JTable) - Swing Example
Java GUI Retrieve List Data from Database
โครงสร้างของ MySQL และ Table
CREATE TABLE `customer` (
`CustomerID` varchar(4) NOT NULL,
`Name` varchar(50) NOT NULL,
`Email` varchar(50) NOT NULL,
`CountryCode` varchar(2) NOT NULL,
`Budget` double NOT NULL,
`Used` double NOT NULL,
PRIMARY KEY (`CustomerID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- dump ตาราง `customer`
--
INSERT INTO `customer` VALUES ('C001', 'Win Weerachai', '[email protected]', 'TH', 1000000, 600000);
INSERT INTO `customer` VALUES ('C002', 'John Smith', '[email protected]', 'UK', 2000000, 800000);
INSERT INTO `customer` VALUES ('C003', 'Jame Born', '[email protected]', 'US', 3000000, 600000);
INSERT INTO `customer` VALUES ('C004', 'Chalee Angel', '[email protected]', 'US', 4000000, 100000);
คำสั่งของ SQL ที่สามารถนำไปรันบน Query เพื่อสร้าง Table และ Rows ได้ทันที
กลับมายัง Java Project จะประกอบด้วย 2 Frame ซึ่ง Frame แรกชื่อว่า MyForm.java ไว้แสดงข้อมูล
MyForm.java
package com.java.myapp;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.JLabel;
public class MyForm extends JFrame {
static JTable table;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
MyForm frame = new MyForm();
frame.setVisible(true);
}
});
}
/**
* Create the frame.
*/
public MyForm() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 516, 319);
setTitle("ThaiCreate.Com Java GUI Tutorial");
getContentPane().setLayout(null);
// Customer List
JLabel lblCustomerList = new JLabel("Customer List");
lblCustomerList.setBounds(207, 44, 87, 14);
getContentPane().add(lblCustomerList);
// ScrollPane
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(28, 84, 440, 89);
getContentPane().add(scrollPane);
// Table
table = new JTable();
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
int index = table.getSelectedRow();
String CustomerID = table.getValueAt(index, 0).toString();
/*
* String Name = table.getValueAt(index, 1).toString(); String
* Email = table.getValueAt(index, 2).toString(); String
* CountryCode = table.getValueAt(index, 3).toString(); String
* Budget = table.getValueAt(index, 4).toString(); String Used =
* table.getValueAt(index, 5).toString();
*/
MyUpdateForm update = new MyUpdateForm(CustomerID);
update.setModal(true);
update.setVisible(true);
PopulateData(); // Reload Table
}
});
scrollPane.setViewportView(table);
PopulateData();
}
private static void PopulateData() {
// Clear table
table.setModel(new DefaultTableModel());
// Model for Table
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.addColumn("CustomerID");
model.addColumn("Name");
model.addColumn("Email");
model.addColumn("CountryCode");
model.addColumn("Budget");
model.addColumn("Used");
Connection connect = null;
Statement s = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager
.getConnection("jdbc:mysql://localhost/mydatabase"
+ "?user=root&password=root");
s = connect.createStatement();
String sql = "SELECT * FROM customer ORDER BY CustomerID ASC";
ResultSet rec = s.executeQuery(sql);
int row = 0;
while ((rec != null) && (rec.next())) {
model.addRow(new Object[0]);
model.setValueAt(rec.getString("CustomerID"), row, 0);
model.setValueAt(rec.getString("Name"), row, 1);
model.setValueAt(rec.getString("Email"), row, 2);
model.setValueAt(rec.getString("CountryCode"), row, 3);
model.setValueAt(rec.getFloat("Budget"), row, 4);
model.setValueAt(rec.getFloat("Used"), row, 5);
row++;
}
} catch (Exception e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
try {
if (s != null) {
s.close();
connect.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
สร้าง Frame ที่สองไว้สำหรับเป็น Form ในการแก้ไขข้อมูล
เลือกเป็น JDialog
ตั้งชื่อเป็น MyUpdateForm
ตอนนี้มีไฟล์อยู่ 2 ไฟล์ MyForm.java และ MyUpdateForm.java
โดยมี MyUpdateForm.java เขียนคำสั่งดังนี้
MyUpdateForm.java
package com.java.myapp;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MyUpdateForm extends JDialog {
/**
* Create the dialog.
*/
public MyUpdateForm(String sCustomerID) {
setTitle("ThaiCreate.Com Java GUI Tutorial");
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setBounds(100, 100, 447, 285);
getContentPane().setLayout(null);
setResizable(false);
// Header Customer Update
JLabel hCustomerUpdate = new JLabel("Customer Update");
hCustomerUpdate.setBounds(144, 21, 132, 14);
getContentPane().add(hCustomerUpdate);
// *** Header ***//
JLabel hCustomerID = new JLabel("CustomerID :");
hCustomerID.setBounds(100, 51, 89, 14);
getContentPane().add(hCustomerID);
JLabel hName = new JLabel("Name :");
hName.setBounds(100, 76, 89, 14);
getContentPane().add(hName);
JLabel hEmail = new JLabel("Email :");
hEmail.setBounds(100, 100, 89, 14);
getContentPane().add(hEmail);
JLabel hCountryCode = new JLabel("CountryCode :");
hCountryCode.setBounds(100, 123, 89, 14);
getContentPane().add(hCountryCode);
JLabel hBudget = new JLabel("Budget :");
hBudget.setBounds(100, 146, 89, 14);
getContentPane().add(hBudget);
JLabel hUsed = new JLabel("Used :");
hUsed.setBounds(100, 171, 89, 14);
getContentPane().add(hUsed);
// *** Update Form ***//
// CustomerID
final JLabel lblCustomerID = new JLabel("lblCustomerID");
lblCustomerID.setBounds(207, 51, 99, 20);
getContentPane().add(lblCustomerID);
// Name
final JTextField txtName = new JTextField("");
txtName.setBounds(207, 76, 99, 20);
getContentPane().add(txtName);
// Email
final JTextField txtEmail = new JTextField("");
txtEmail.setBounds(207, 100, 176, 20);
getContentPane().add(txtEmail);
// CountryCode
final JTextField txtCountryCode = new JTextField("");
txtCountryCode.setBounds(207, 123, 99, 20);
getContentPane().add(txtCountryCode);
// Budget
final JTextField txtBudget = new JTextField("");
txtBudget.setBounds(207, 146, 99, 20);
getContentPane().add(txtBudget);
// Used
final JTextField txtUsed = new JTextField("");
txtUsed.setBounds(207, 171, 99, 20);
getContentPane().add(txtUsed);
// *** Bind Data ***//
Connection connect = null;
Statement s = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager
.getConnection("jdbc:mysql://localhost/mydatabase"
+ "?user=root&password=root");
s = connect.createStatement();
String sql = "SELECT * FROM customer " + "WHERE CustomerID = '"
+ sCustomerID + "' ";
ResultSet rec = s.executeQuery(sql);
if (rec != null) {
rec.next();
lblCustomerID.setText(rec.getString("CustomerID"));
txtName.setText(rec.getString("Name"));
txtEmail.setText(rec.getString("Email"));
txtCountryCode.setText(rec.getString("CountryCode"));
txtBudget.setText(rec.getString("Budget"));
txtUsed.setText(rec.getString("Used"));
}
rec.close();
} catch (Exception e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
try {
if (s != null) {
s.close();
connect.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
e.printStackTrace();
}
// Save Button
JButton btnSave = new JButton("Save");
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
SaveData(lblCustomerID.getText(), txtName.getText(),
txtEmail.getText(), txtCountryCode.getText(),
txtBudget.getText(), txtUsed.getText());
dispose();
}
});
btnSave.setBounds(131, 206, 69, 23);
getContentPane().add(btnSave);
// Button Close
JButton btnClose = new JButton("Close");
btnClose.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
btnClose.setBounds(217, 206, 69, 23);
getContentPane().add(btnClose);
}
// Update
private void SaveData(String strCustomerID, String strName, String strEmail,
String strCountryCode, String strBudget, String strUsed) {
Connection connect = null;
Statement s = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase" +
"?user=root&password=root");
s = connect.createStatement();
String sql = "UPDATE customer " +
"SET Name = '" + strName + "' " +
", Email = '" + strEmail + "' " +
", CountryCode = '" + strCountryCode + "' " +
", Budget = '" + strBudget + "' " +
", Used = '" + strUsed + "' " +
" WHERE CustomerID = '"+strCustomerID+"' ";
s.execute(sql);
JOptionPane.showMessageDialog(null, "Record Update Successfully");
} catch (Exception e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
try {
if(s != null) {
s.close();
connect.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
สำหรับ Code ลองไล่ดูครับ ไม่ได้ยากอะไรมากมาย
Output
แสดงข้อมูลใน JTable สามารถคลิกเลือกเพื่อแก้ไขได้
แสดง Dialog สำหรับการแก้ไขข้อมูล
ทดสอบการแก้ไขข้อมูล
แสดงสถานะการแก้ไขข้อมูล
จากนั้นข้อมูลใน JTable ก็จะมีการเปลี่ยนแปลงตามรายละเอียดที่เราแก้ไจ
พร้อมทั้งใน Database ก็จะถูกแก้ไขด้วย
กรณีที่ใช้ร่วมกับ Database อื่น ๆ สามารถดูวิธีการใช้ Connector และ Connection String ได้ที่นี่
Property & Method (Others Related) |
|