15.5 JDBC数据库编程5——DAO

目录

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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux线程 | 线程的控制(下)

前言&#xff1a; 本节内容是线程的控制部分的第二个小节。 主要是列出我们的线程控制部分的几个细节性问题以及我们的线程分离。这些都是需要大量的代码去进行实验的。所以&#xff0c; 准备好接受新知识的友友们请耐心观看。 现在开始我们的学习吧。 ps:本节内容适合了解线程…

动态内存管理(C语言 VS C++)

目录 一.动态内存管理的前置知识 1.栈区 a.栈区的特点 b.注意事项 2.堆区 a.堆区的特点 b.注意事项 3.全局/静态区 a.作用域和生命周期 b.注意事项 4.常量区 二.C语言动态内存管理 1.malloc 函数 a.接口简介与使用实例 b.注意要点 2.calloc 函数&#xff1a; 3.…

Flink Web UI 是使用和调试保姆级教程(持续更新)

Flink Web UI 是调试和监控 Flink 应用程序的重要工具&#xff0c;通过它&#xff0c;你可以实时查看正在运行的 Flink 任务的详细信息&#xff0c;包括作业的状态、性能指标、各子任务的运行情况、故障恢复情况等。Flink Web UI 的这些功能为开发者和运维人员提供了调试和优化…

软考系统分析师知识点十三:软件需求工程

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;24天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…

FPGA采集adc,IP核用法,AD驱动(上半部分)

未完结&#xff0c;明天补全 IP核&#xff1a;集成的一个现有的模块 串口写好后基本不会再修改串口模块内部的一些逻辑&#xff0c;将串口.v文件添加进来&#xff0c;之后通过他的上层的接口去对他进行使用&#xff0c;所以我们打包IP&#xff0c;之后就不用去添加源文件了&a…

仿 Mac 个人网站开发 |项目复盘

一、前言 1.1 灵感来源 早年有幸看到国外大佬做的一个 基于 Web 的 Windows XP 桌面娱乐系统, 那时刚好有搭建一个个人博客的想法, 所以就想是否可以基于 WEB 实现一个仿 Mac UI 的个人博客, 以应用的形式来展示博客各个功能! 1.2 相关链接(求个 Star) 前端开源代码后端开源…

Linux之实战命令32:chroot应用实例(六十六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

ali 231普通滑块82y版本

有需求可以联系博主 let v Died_in2021

【含开题报告+文档+PPT+源码】基于人脸识别的课堂考勤系统的设计与实现

开题报告 随着科技的不断发展&#xff0c;人脸识别技术已经逐渐渗透到各个领域&#xff0c;包括教育领域。传统的课堂考勤方式通常依赖于学生签到或教师手动记录&#xff0c;这种方式存在着许多不足之处&#xff0c;例如容易出现人为错误、耗费时间和资源等。为了解决这些问题…

诺贝尔经济学奖历史名单数据集(1969-2024年)

2024年诺贝尔经济学奖授予了达龙阿西莫格鲁&#xff08;Daron Acemoglu&#xff09;、西蒙约翰逊&#xff08;Simon Johnson&#xff09;和詹姆斯A罗宾逊&#xff08;James A. Robinson&#xff09;&#xff0c;以表彰他们在理解制度如何影响经济发展方面的贡献。&#xff08;“…

jmeter用csv data set config做参数化

在jmeter中&#xff0c;csv data set config的作用非常强大&#xff0c;用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下&#xff1a; Variable Names处&#xff0c;写上源文件中的参数名&#xff0c;用于后续接口发送请求时引用 Ignore first line…

泰克MDO3054示波器特性和规格Tektronix MSO3054 500M 四通道

Tektronix MDO3054 示波器&#xff0c;混合域&#xff0c;500 MHz&#xff0c;4 通道&#xff0c;5 GS/s 泰克 MDO3054 混合域示波器是终极 6 合 1 集成示波器&#xff0c;包括可选的集成频谱分析仪、任意函数发生器、逻辑分析仪、协议分析仪和数字电压表/计数器。泰克 MDO305…

python项目实战——下载美女图片

python项目实战——下载美女图片 文章目录 python项目实战——下载美女图片完整代码思路整理实现过程使用xpath语法找图片的链接检查链接是否正确下载图片创建文件夹获取一组图片的链接获取页数 获取目录页的链接 完善代码注意事项 完整代码 import requests import re import…

Java算术运算符 C语言的二维数组初始化

1. //算术运算符 public static void main(String[] args) {System.out.println(3.25.01);//若有小数参与&#xff0c;有可能不精确System.out.println(5-1);System.out.println(5*2);System.out.println(10.0/3);//这里不精确System.out.println(10%2);System.out.println();…

2024.10月16日- Vue.js(1)

一 VUE概述与环境搭建 1.1 Vue概述 1.1.1 简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款轻量级的用于构建用户界面的 渐进式的JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高…

Vivado - Aurora 8B/10B IP

目录 1. 简介 2. 设计调试 2.1 Physical Layer 2.2 Link Layer 2.3 Receiver 2.4 IP 接口 2.5 调试过程 2.5.1 Block Design 2.5.2 释放 gt_reset 2.5.3 观察数据 3. 实用技巧 3.1 GT 坐标与布局 3.1.1 选择器件并进行RTL分析 3.1.2 进入平面设计 3.1.3 收发器布…

堆排序(C++实现)

参考&#xff1a; 面试官&#xff1a;请写一个堆排序_哔哩哔哩_bilibiliC实现排序算法_c从小到大排序-CSDN博客 堆的基本概念 堆排实际上是利用堆的性质来进行排序。堆可以看做一颗完全二叉树。 堆分为两类&#xff1a; 最大堆&#xff08;大顶堆&#xff09;&#xff1a;除根…

Java-IO流使用场景

Java IO 流是Java编程中非常重要的组成部分,用于处理文件读写、网络通信等数据传输任务。 1. 字节流 1.1 读取文件 import java.io.FileInputStream; import java.io.IOException;public class ReadFileExample {public static void main(String[] args) {try (FileInputSt…

Unity实现自定义图集(一)

以下内容是根据Unity 2020.1.0f1版本进行编写的   Unity自带有图集工具,包括旧版的图集(设置PackingTag),以及新版的图集(生成SpriteAtlas)。一般来说,unity自带的图集系统已经够用了,但是实际使用上还是存在一些可优化的地方,例如加载到Canvas上的资源,打图集不能…

PyQt 入门教程(3)基础知识 | 3.2、加载资源文件

文章目录 一、加载资源文件1、PyQt5加载资源文件2、PyQt6加载资源文件 一、加载资源文件 常见的资源文件有图像与图标&#xff0c;下面分别介绍下加载资源文件的常用方法 1、PyQt5加载资源文件 2、PyQt6加载资源文件 PyQt6版本暂时没有提供pyrcc工具&#xff0c;下面介绍下在不…