文章目录
一、StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同?
- 存储对象方式不同。DaoListImpl使用ArrayList对学生对象进行存储、DapArrayImpl使用数组进行存储。
- StudentDaoArrayImpl.java中的addStuden方法有进行查重操作。
二、StudentDao.java文件是干什么用的?为什么里面什么实现代码都没有?
- 是一个接口,有关学生操作的一系列方法的声明。
- 只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为
三、使用搜索引擎搜索“Java DAO”,选出几句你能看懂的、对你最有启发的话。请结合接口知识去理解。
DAO (DataAccessobjects 数据存取对象):是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。
DAO模式需要有三个参与者:
- 数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。
- 数据访问对象实体类(Data Access Object concrete class) 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。
- 模型对象/数值对象(Model Object/Value Object) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。
DAO模式通过将接口定义在模型对象上,再在实体类中对接口的方法具体实现。
四、尝试运行Test.java。根据注释修改相应代码。结合参考代码回答使用DAO模式有什么好处?
-
两种数据存储方式运行的结果相同,如下:
-
DAO 模式隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用 DAO 方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。
-
提高代码的复用性:通过将一系列相似的操作提炼并设计出一个接口,使得实现接口的类的特征更为鲜明,使得该类能更灵活地嵌入其他代码中发挥作用;
利于分工合作:通过将某一操作的具体实现隔离,可以使编写不同部分的程序员专注于自己该做的事情,通过调用对应的接口能更好地进行合作; -
组件的替换更为方便:由于操作的具体实现被隔离开来,当该操作的具体实现发生较大改动时,对其他调用该操作的部分毫无影响。无需做大的变动,只需要修改具体实现的部分即可;
-
提高代码的拓展性:通过 DAO 模式可以向其他部分隐藏细节,这就使得隔离出的部分也能够添加更多的组件来提供更好的服务;
五、可选:编写一些使用DAO模式的代码。比如使用文件作为购物车存储底层。
import java.io.*;
import java.util.*;
class ShoppingCartItem {
private int itemId;
private String name;
private double price;
private int quantity;
public ShoppingCartItem(int itemId, String name, double price, int quantity) {
this.itemId = itemId;
this.name = name;
this.price = price;
this.quantity = quantity;
}
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
@Override
public String toString() {
return "Item ID: " + itemId + " - Name: " + name + " - Price: " + price + " - Quantity: " + quantity;
}
}
interface CartDao {
void addItem(ShoppingCartItem item);
void removeItem(int itemId);
List<ShoppingCartItem> getAllItems();
}
class FileCartDao implements CartDao {
private String filePath;
public FileCartDao(String filePath) {
this.filePath = filePath;
}
@Override
public void addItem(ShoppingCartItem item) {
List<ShoppingCartItem> items = getAllItems();
items.add(item);
saveCartData(items);
}
@Override
public void removeItem(int itemId) {
List<ShoppingCartItem> items = getAllItems();
items.removeIf(i -> i.getItemId() == itemId);
saveCartData(items);
}
@Override
public List<ShoppingCartItem> getAllItems() {
List<ShoppingCartItem> items = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
String[] data = line.split(",");
int itemId = Integer.parseInt(data[0]);
String name = data[1];
double price = Double.parseDouble(data[2]);
int quantity = Integer.parseInt(data[3]);
ShoppingCartItem item = new ShoppingCartItem(itemId, name, price, quantity);
items.add(item);
}
} catch (FileNotFoundException e) {
// No data file found, return empty list
} catch (IOException e) {
e.printStackTrace();
}
return items;
}
private void saveCartData(List<ShoppingCartItem> items) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
for (ShoppingCartItem item : items) {
String line = item.getItemId() + "," + item.getName() + "," + item.getPrice() + "," + item.getQuantity();
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
CartDao cartDao = new FileCartDao("cart.txt");
// Add items to the cart
ShoppingCartItem item1 = new ShoppingCartItem(1, "Item 1", 10.99, 2);
ShoppingCartItem item2 = new ShoppingCartItem(2, "Item 2", 5.99, 1);
cartDao.addItem(item1);
cartDao.addItem(item2);
// Print all items in the cart
List<ShoppingCartItem> items = cartDao.getAllItems();
for (ShoppingCartItem item : items) {
System.out.println(item);
}
// Remove an item from the cart
cartDao.removeItem(1);
// Print all items in the cart after removal
List<ShoppingCartItem> updatedItems = cartDao.getAllItems();
for (ShoppingCartItem item : updatedItems) {
System.out.println(item);
}
}
}