Sử dụng text file để lưu trữ dữ liệu dạng CSDL trong Java

Trong bài này chúng ta mở rộng vấn đề đã được thảo luận ở bài viết Các bước làm việc với tập hợp các đối tượng. Ở đây chúng ta thêm vào chức năng lưu trữ dữ liệu sau 1 phiên làm việc và phục hồi chúng cho lần làm việc kế tiếp.

Đầu tiên ta tạo 1 thư mục SimplejavaDB, tạo  tập tin “cơ sở dữ liệu” của chúng ta với tên “database.txt”. Chúng ta có thể dùng notepad để thêm vài mẫu tin bằng cách gõ theo định dạng :msHang;Tên hàng;don_gia ví dụ như sp0;Xoài;4000. Hoặc nếu chúng ta không tạo, chương trình sẽ tự động tạo 1 database mặc định không có mẫu tin nào.

Hình ảnh minh họa
TextFileDB

Tạo tập tin đặc tả cho đối tượng hàng hóa của chúng ta  với tên Product.java






public class Product {
private String productID;
private String productName;
private double price;
public String getProductID() {
return productID;
}
public void setProductID(String productID) {
this.productID = productID;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}public Product() {}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((productID == null) ? 0 : productID.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Product other = (Product) obj;
if (productID == null) {
if (other.productID != null)
return false;
} else if (!productID.equals(other.productID))
return false;
return true;
}
public Product(String productID, String productName, double price) {
super();
this.productID = productID;
this.productName = productName;
this.price = price;
public String toString() {
return productID+”,”+productName+”,”+price;
}}

Tạo tập tin làm database cơ bản có tên ListProduct.java.






package baitapFile;import java.util.ArrayList;public class ListProducts {
private ArrayList<Product> list;
public ListProducts() {
list=new ArrayList<Product>();
public void ThemHang(Product pr) {
list.add(pr);
}public void Remove(Product pro) {
list.remove(pro);
}

public double Tongtien() {
double amount=0;
for(Product p:list) {
amount+=p.getPrice();
}
return amount;
}

public Product GetProduct(int index) {
if(index<0||index>list.size())
return null;
return list.get(index);
}

public int Count() {
return list.size();
}
}

Tạo tập tin ứng dụng để thử. Tập tin này khi khởi động sẽ đọc file dữ liệu, khôi phục nó lên, sau đó chúng ta làm việc với dữ liệu này. Khi chương trình kết thúc, nó sẽ tự động cập nhật dữ liệu xuống file. Code của nó như sau:

File QuanLyHH_GUI.java






package baitapFile;import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Scanner;import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel; public class QuanLyHH_GUI extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;private DefaultTableModel dtm;
private JTable table;
private JTextField tfID,tfName,tfPrice;
private JButton btnAdd,btnSave,btnDelete,btnUpdate,btnExit;

private ListProducts dsHang;

public QuanLyHH_GUI() {
super(“Quản lý hàng hóa”);setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400,300);setLocation(150,100);
CreateGUI();
LoadDatabase();
LockText(true);
//tự động cập nhật khi đóng ứng dụng
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
UpdateDatabase();
System.exit(1);
}
});
}
void CreateGUI() {
String []header={“Mã số SP”,”Tên sản phẩm”,”Đơn giá”};
dtm=new DefaultTableModel(header,0);
table=new JTable(dtm);
this.add(new JScrollPane(table));
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
int row=table.getSelectedRow();
tfID.setText(table.getValueAt(row, 0).toString());
tfName.setText(table.getValueAt(row, 1).toString());
tfPrice.setText(table.getValueAt(row, 2).toString());
} catch (Exception e1) {}
}
});

Box b=Box.createVerticalBox();
Box b1=Box.createHorizontalBox();Box b2=Box.createHorizontalBox();
Box b3=Box.createHorizontalBox();Box b4=Box.createHorizontalBox();
b.add(Box.createVerticalStrut(10));
b.add(b1);b.add(Box.createVerticalStrut(8));
b.add(b2);b.add(Box.createVerticalStrut(8));
b.add(b3);b.add(Box.createVerticalStrut(8));
b.add(b4);b.add(Box.createVerticalStrut(8));
JLabel l1,l2,l3;
b1.add(l1=new JLabel(“Mã số sản phẩm:”,JLabel.RIGHT));b1.add(tfID=new JTextField(20));
b2.add(l2=new JLabel(“Tên sản phẩm:”,JLabel.RIGHT));b2.add(tfName=new JTextField(20));
b3.add(l3=new JLabel(“Đơn giá:”,JLabel.RIGHT));b3.add(tfPrice=new JTextField(20));
l2.setPreferredSize(l1.getPreferredSize());
l3.setPreferredSize(l1.getPreferredSize());
this.add(b,BorderLayout.NORTH);

b4.add(btnAdd=new JButton(“Thêm”));btnAdd.addActionListener(this);
b4.add(Box.createHorizontalStrut(10));
b4.add(btnSave=new JButton(“Lưu”));btnSave.addActionListener(this);
b4.add(Box.createHorizontalStrut(10));btnSave.setEnabled(false);
b4.add(btnUpdate=new JButton(“Sửa”));btnUpdate.addActionListener(this);
b4.add(Box.createHorizontalStrut(10));
b4.add(btnDelete=new JButton(“Xóa”));btnDelete.addActionListener(this);
b4.add(Box.createHorizontalStrut(10));
b4.add(btnExit=new JButton(“Thoát”));btnExit.addActionListener(this);
}

@Override
public void actionPerformed(ActionEvent e) {
Object o=e.getSource();
if(o.equals(btnExit)){
UpdateDatabase();
System.exit(1);
}
if(o.equals(btnAdd)) {
if(btnAdd.getText().equals(“Thêm”)) {
LockText(false);
btnAdd.setText(“Hủy bỏ”);
btnSave.setEnabled(true);
btnUpdate.setEnabled(false);
btnDelete.setEnabled(false);
}
else {
LockText(true);
btnAdd.setText(“Thêm”);
btnSave.setEnabled(false);
btnUpdate.setEnabled(true);
btnDelete.setEnabled(true);
}
}
else if(o.equals(btnSave)) {
if(btnAdd.isEnabled()) //Nút lưu của nút thêm
{
try {
String id=tfID.getText();
String name=tfName.getText();
if(id.trim().equals(“”)||name.trim().equals(“”)) {
JOptionPane.showMessageDialog(null, “Không cho rỗng”);
return;
}
double price=Double.parseDouble(tfPrice.getText());
Product p=new Product(id,name,price);
String []row= {id,name,price+”"};
dsHang.ThemHang(p);
dtm.addRow(row);
}catch (Exception ex) {
JOptionPane.showMessageDialog(null, “Dữ liệu bị lỗi rồi\n” +
“”+ex.getMessage());
}
}
else {//nút lưu của nút sửa

}
}
}
/*** Nạp dữ liệu lúc chương trình khởi động     */
void LoadDatabase() {
dsHang=new ListProducts();//khởi động danh sách
try {
File f=new File(“database.txt”);
if(!f.exists()) f.createNewFile();
//đọc danh mục hàng
Scanner input=new Scanner(new FileInputStream(f));
while(input.hasNextLine()) {
String line=input.nextLine();
if(line.trim()!=”") {
String items[]=line.split(“;”);
//tạo 1 mặt hàng
Product p=new Product();
p.setProductID(items[0]);
p.setProductName(items[1]);
p.setPrice(Double.parseDouble(items[2]));
//đưa vào danh mục
dsHang.ThemHang(p);
dtm.addRow(items);
LockText(true);
btnAdd.setText(“Thêm”);
btnSave.setEnabled(false);
btnUpdate.setEnabled(true);

btnDelete.setEnabled(true);
}
}
input.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//Cập nhật dữ liệu xuống databse khi thoát ứng dụng
void UpdateDatabase() {
try {
PrintWriter out
=new PrintWriter(
new FileOutputStream(“database.txt”),true);
for (int i = 0; i < dsHang.Count(); i++) {
Product p=dsHang.GetProduct(i);
out.println(p);
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, “Không lưu xuống db được\n”+e.toString());
}
}
//Khóa textBox
private void LockText(boolean state) {
tfID.setEditable(!state);
tfName.setEditable(!state);
tfPrice.setEditable(!state);
}

//hàm main
public static void main(String[] args) {
new QuanLyHH_GUI().setVisible(true);
}
}

Trong chương trình này, tôi chỉ hiện thực code cho nút Thêm và nút Lưu phần thêm mới. các thành phần còn lại chúng ta tự phát triển.

bạn có thể dùng chuột chọn mẫu tin -> dữ liệu sẽ hiển thị lên TextFeld.

Phiên bản Execuable Jar file bạn có thể download tại đây để chạy thử.

Chúc thành công!

Post a Comment

أحدث أقدم