目录
15.1.1 引言
实体类Product.java
异常类DaoException.java
Dao.java
ProductDao.java
ProductDaoImpl.java
ProductDaoTest.java
15.1.1 引言
Java是面向对象编程语言,主要操作对象,而关系数据库的数据并不是对象,Java程序插入和检索数据并不方便。因此,访问数据库的一个好方法是是使用一个单独模块管理数据库连接以及构建SQL语句。数据访问对象(data access object,DAO)模式使应用程序访问数据的一种方法。
DAO模式有很多变体,这里介绍一种比较简单的形式。首先,定义一个DAO接口,它负责建立数据库连接;然后,为每种实体的持久化操作定义一个接口,如ProductDao接口负责Product对象的持久化;最后,定义实现类。
如图15-5给出Dao接口与ProductDao接口与OrderDao接口的关系。
图15-5 Dao接口及其子接口
在DAO模式中,通常要为需要持久存储的每种实体类型编写一个相应的类。如要存储Product信息就需要编写一个类。实现类应该提供添加,删除,修改,检索,查找等功能。例如,ProductDao接口需要支持以下方法。
public void addProduct(Product product)
public void updateProduct(Product product)
public void deleteProduct(int productId)
public Product getProduct(int productId)
public ArrayList<Product> getAllProduct()
在Dao实现类中,可以直接编写SQL操作数据库,也可以使用像Hibernate这样的Java持久API实现。这里,使用SQL语句。
下面定义实体类Product,该类对象用来存放商品信息,与products表的记录对应,代码如下
实体类Product.java
package com.entity;
public class Product {private int id;private String pname;private String brand;private double price;private int stock;public Product() {super();}public Product(int id, String pname, String brand, double price, int stock) {this.id = id;this.pname = pname;this.brand = brand;this.price = price;this.stock = stock;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getPname() {return pname;}public void setPname(String pname) {this.pname = pname;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getStock() {return stock;}public void setStock(int stock) {this.stock = stock;}@Overridepublic String toString(){return getId() + " " + getPname() + " " + getPrice();}
}
该类定义了一个带参数的构造方法,使用它可以创建Product对象,另外为每个属性定义了setter方法和getter方法
数据访问对象组件包含下面的接口和类。
- Dao接口是所有接口的根接口,其中定义了默认方法建立到数据库的连接。
- DaoException类是一个异常类,当Dao方法发生运行时异常时抛出
- ProductDao接口和ProductImpl实现类提供了对Product对象持久化的各种方法
异常类DaoException.java
package com.dao;
public class DaoException extends Exception {private static final long serialVersionUID = 19192L;private String message;public DaoException() {}public DaoException(String message) {this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;} public String toString() {return message;}
}
Dao.java
package com.dao;
import java.sql.*;
public interface Dao {// 接口中定义的默认方法public default Connection getConnection() throws DaoException {String dburl = "jdbc:mysql://127.0.0.1:3306/webstore?useSSL=false";String username = "root";String password = "123456"; try {return DriverManager.getConnection(dburl,username,password);} catch (SQLException e) {throw new DaoException();}}
}
该接口定义了默认的getConnection()方法创建或返回数据库连接对象,该方法将被子接口或实现类继承。这里没有编写加载驱动程序代码,而使用动态加载驱动程序方法。
ProductDao.java
package com.dao;
import java.util.ArrayList;
import com.entity.Product;
public interface ProductDao extends Dao{public void addProduct(Product product) throws DaoException;public void updateProduct(Product product) throws DaoException;public void deleteProduct(int pid) throws DaoException;public Product getProduct(int pid) throws DaoException;public ArrayList<Product> getAllProduct()throws DaoException;
}
该ProductDao接口定义了对Product的操作方法。addProduct()方法用于插入一个商品记录,updateProduct()方法用来修改一个商品,deleteProduct()方法用来删除一个商品,getProduct()方法用来查询一个商品,getAllProduct()方法用来返回所有商品信息。
ProductDaoImpl.java
package com.dao;
import java.sql.*;
import java.util.ArrayList;
import com.entity.Product;
public class ProductDaoImpl implements ProductDao{// 添加商品方法public void addProduct(Product product) throws DaoException{String sql = "INSERT INTO products VALUES(?,?,?,?,?)";try(Connection conn = getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)){pstmt.setInt(1, product.getId());pstmt.setString(2, product.getPname());pstmt.setString(3, product.getBrand());pstmt.setDouble(4, product.getPrice());pstmt.setInt(5, product.getStock());pstmt.executeUpdate();}catch(SQLException se){se.printStackTrace();}}// 修改商品方法public void updateProduct(Product product) throws DaoException{String sql = "UPDATE products SET pname=?," +"brand = ?,price = ?,stock=? WHERE id=?";try(Connection conn = getConnection();PreparedStatement pstmt = conn.prepareStatement(sql);){pstmt.setString(1, product.getPname());pstmt.setString(2, product.getBrand());pstmt.setDouble(3, product.getPrice());pstmt.setInt(4, product.getStock());pstmt.setInt(5, product.getId());pstmt.executeUpdate();}catch(SQLException se){se.printStackTrace();}} // 删除商品方法public void deleteProduct(int pid)throws DaoException{String sql = "DELETE FROM products WHERE id =?";try(Connection conn = getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)){pstmt.setInt(1, pid);pstmt.executeUpdate();}catch(SQLException se){se.printStackTrace();} }// 查询商品方法public Product getProduct(int pid)throws DaoException{String sql = "SELECT * FROM products WHERE id =?";ResultSet resultSet = null;Product product = null;try( Connection conn = getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)){pstmt.setInt(1, pid);resultSet = pstmt.executeQuery();if(resultSet.next()){product = new Product(resultSet.getInt(1),resultSet.getString(2),resultSet.getString(3),resultSet.getDouble(4),resultSet.getInt(5));}}catch(SQLException se){se.printStackTrace();} return product;}// 查询所有商品方法public ArrayList<Product> getAllProduct()throws DaoException{String sql = "SELECT * FROM products";ResultSet resultSet = null;ArrayList<Product> products = new ArrayList<Product>();Product product = null;try(Connection conn = getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)){resultSet = pstmt.executeQuery();while(resultSet.next()){product = new Product(resultSet.getInt(1),resultSet.getString(2),resultSet.getString(3),resultSet.getDouble(4),resultSet.getInt(5));products.add(product);}}catch(SQLException se){se.printStackTrace();} return products;}
}
下面是一个测试程序,它创建一个Product对象,然后使用addProduct()方法注入数据库,调用getAllProduct()方法返回所有商品,最后输出商品号大于104的商品信息。
ProductDaoTest.java
package com.demo;
import java.util.ArrayList;
import com.dao.*;
import com.entity.Product;
public class ProductDaoTest {public static void main(String[] args) {ProductDao dao = new ProductDaoImpl();Product product = new Product(109,"3G手机","Samsung",3500.00,10);ArrayList<Product> products = new ArrayList<Product>();try {dao.deleteProduct(108);dao.addProduct(product); // 向表中插入一行记录products = dao.getAllProduct(); // 返回表中所有记录的数组列表} catch (DaoException e) {e.printStackTrace();}// 输出商品号大于104的商品信息products.stream().filter(p->p.getId()>104).forEach(System.out::println);}
}