【JAVA高级】——玩转JDBC中的三层架构

news2025/4/9 16:07:18

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:【JAVA高级】——玩转JDBC中的三层架构
更多内容点击👇
       【JAVA高级】——吃透JDBC中的事务及事务的封装

文章目录

    • 什么是三层
    • 三层架构项目搭建步骤
      • 项目环境搭建
      • 创建book表
        • 创建表
        • 向表中插入数据
      • 创建entity实体类Book
      • 创建BookDao接口
      • 创建BookDaoImpl实现类
      • 创建BookService接口
      • 创建BookServiceImpl实现类
      • 编写测试类
        • 测试增加数据
        • 测试删除数据
        • 测试修改数据
        • 测试查询单个
        • 测试查询所有

在这里插入图片描述

什么是三层

(1)表示层(View)

  • 命名:XxxView
  • 职责:收集用户的数据和需求、数据

(2)业务逻辑层(service)

  • 命名:XxxServiceImpl
  • 职责:数据加工处理、调用DAO完成业务实现、控制事务

(3)数据访问层(Dao)

  • 命名:XxxDaoImpl
  • 职责:向业务层提供数据,将业务层加工后的数据同步到数据库

在这里插入图片描述

三层架构项目搭建步骤

项目环境搭建

1)新建一个项目,在项目中创建lib文件夹,将MySQL数据库jar包放在lib文件夹中,配置环境。

2)在src文件夹下面创建db.properties文件,编写数据库driver、url、user、password信息。

3)创建三层需要的各个包。

1)utils包:存放工具类(DBUtils类、DateUtils类)

(2)entity包:存放实体类(Xxx.java)

(3)dao包:存放DAO接口

		impl包:存放DAO接口实现类

(4)service包:存放service接口

		impl:存放service接口实现类

(5)view包:存放程序启动类或测试类(main)

创建book表

创建表

CREATE TABLE IF NOT EXISTS `book`(
`bid` INT PRIMARY KEY AUTO_INCREMENT COMMENT '图书编号',
`isbn` VARCHAR(20) UNIQUE NOT NULL COMMENT '国际标准书号',
`name` VARCHAR(20) NOT NULL COMMENT '书名',
`author` VARCHAR(20) NOT NULL COMMENT '作者',
`press` VARCHAR(20) NOT NULL COMMENT '出版社',
`price` DOUBLE NOT NULL COMMENT '价格',
`classification` VARCHAR(20) NOT NULL COMMENT '分类'
);

向表中插入数据

INSERT INTO `book`(`bid`,`isbn`,`name`,`author`,`press`,`price`,`classification`)
VALUES
(1001,'978-7-5170-7654-4','SQL从入门到精通','张三','中国水利水电出版社',79.80,'数据库');

INSERT INTO `book`(`bid`,`isbn`,`name`,`author`,`press`,`price`,`classification`)
VALUES
(1002,'976-9-5245-7633-5','java从入门到精通','李四','清华大学出版社',99.80,'程序设计');

创建entity实体类Book

package com.cxyzxc.www.entity;

import java.util.Date;

/**
 * entity实体类Booke类
 */
public class Book {
	/** 图书编号 */
	private int bid;
	/** 国际标准书号 */
	private String isbn;
	/** 书名 */
	private String name;
	/** 作者 */
	private String author;
	/** 出版社 */
	private String press;
	/** 价格 */
	private double price;
	/** 分类 */
	private String classification;
	/** 出版日期 */
	private Date pubdate;

	public Book() {
		super();
	}

	public Book(String isbn, String name, String author, String press,
			double price, String classification, Date pubdate) {
		super();
		this.isbn = isbn;
		this.name = name;
		this.author = author;
		this.press = press;
		this.price = price;
		this.classification = classification;
		this.pubdate = pubdate;
	}

	public Book(int bid, String isbn, String name, String author, String press,
			double price, String classification, Date pubdate) {
		super();
		this.bid = bid;
		this.isbn = isbn;
		this.name = name;
		this.author = author;
		this.press = press;
		this.price = price;
		this.classification = classification;
		this.pubdate = pubdate;
	}

	public int getBid() {
		return bid;
	}

	public void setBid(int bid) {
		this.bid = bid;
	}

	public String getIsbn() {
		return isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getPress() {
		return press;
	}

	public void setPress(String press) {
		this.press = press;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public String getClassification() {
		return classification;
	}

	public void setClassification(String classification) {
		this.classification = classification;
	}

	public Date getPubdate() {
		return pubdate;
	}

	public void setPubdate(Date pubdate) {
		this.pubdate = pubdate;
	}

	@Override
	public String toString() {
		return "Book [bid=" + bid + ", isbn=" + isbn + ", name=" + name
				+ ", author=" + author + ", press=" + press + ", price="
				+ price + ", classification=" + classification + ", pubdate="
				+ pubdate + "]";
	}

}

创建BookDao接口

package com.cxyzxc.www.dao;

import java.util.List;

import com.cxyzxc.www.entity.Book;
/**
 * 定义BookDao接口,接口中定义对book表增删改查的方法
 */
public interface BookDao {
	
	//增
	int insert(Book book);
	
	//删
	int delete(int bid);
	
	//改
	int update(Book book);
	
	//查单个
	Book selectOne(int bid);
	
	//查所有
	List<Book> selectAll();

}

创建BookDaoImpl实现类

package com.cxyzxc.www.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.cxyzxc.www.dao.BookDao;
import com.cxyzxc.www.entity.Book;
import com.cxyzxc.www.utils.DBUtils;
import com.cxyzxc.www.utils.DateUtils;
/**
 * 定义BookDaoImpl类,实现BookDao接口,重写接口中的增删改查方法
 */
public class BookDaoImpl implements BookDao {

	@Override
	public int insert(Book book) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;

		connection = DBUtils.getConnection();

		String sql = "INSERT INTO `book`(`isbn`,`name`,`author`,`press`,`price`,`classification`,`pubdate`)VALUES(?,?,?,?,?,?,?);";

		try {
			preparedStatement = connection.prepareStatement(sql);
			// 绑定参数
			preparedStatement.setString(1, book.getIsbn());
			preparedStatement.setString(2, book.getName());
			preparedStatement.setString(3, book.getAuthor());
			preparedStatement.setString(4, book.getPress());
			preparedStatement.setDouble(5, book.getPrice());
			preparedStatement.setString(6, book.getClassification());
			preparedStatement.setDate(7,
					DateUtils.utilDateToSqlDate(book.getPubdate()));

			int result = preparedStatement.executeUpdate();
			return result;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public int delete(int bid) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;

		connection = DBUtils.getConnection();

		String sql = "DELETE FROM `book` WHERE `bid`=?;";

		try {
			preparedStatement = connection.prepareStatement(sql);
			// 绑定参数
			preparedStatement.setInt(1, bid);
			int result = preparedStatement.executeUpdate();
			return result;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public int update(Book book) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;

		connection = DBUtils.getConnection();

		String sql = "UPDATE `book` SET `isbn`=?,`name`=?,`author`=?,`press`=?,`price`=?,`classification`=?,`pubdate`=? WHERE `bid`=?;";

		try {
			preparedStatement = connection.prepareStatement(sql);
			// 绑定参数
			preparedStatement.setString(1, book.getIsbn());
			preparedStatement.setString(2, book.getName());
			preparedStatement.setString(3, book.getAuthor());
			preparedStatement.setString(4, book.getPress());
			preparedStatement.setDouble(5, book.getPrice());
			preparedStatement.setString(6, book.getClassification());
			preparedStatement.setDate(7,
					DateUtils.utilDateToSqlDate(book.getPubdate()));
			preparedStatement.setDouble(8, book.getBid());

			int result = preparedStatement.executeUpdate();
			return result;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public Book selectOne(int bid) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		Book book = null;
		connection = DBUtils.getConnection();

		String sql = "Select * FROM `book` WHERE `bid`=?;";
		try {
			preparedStatement = connection.prepareStatement(sql);
			// 绑定参数
			preparedStatement.setInt(1, bid);

			resultSet = preparedStatement.executeQuery();

			if (resultSet.next()) {
				int bookid = resultSet.getInt(1);
				String isbn = resultSet.getString(2);
				String name = resultSet.getString(3);
				String author = resultSet.getString(4);
				String press = resultSet.getString(5);
				double price = resultSet.getDouble(6);
				String classification = resultSet.getString(7);
				Date pubdate = resultSet.getDate(8);
				book = new Book(bookid, isbn, name, author, press, price,
						classification, pubdate);
			}
			return book;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public List<Book> selectAll() {

		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		Book book = null;
		List<Book> bookList = new ArrayList<Book>();
		connection = DBUtils.getConnection();

		String sql = "Select * FROM `book`;";
		try {
			preparedStatement = connection.prepareStatement(sql);

			resultSet = preparedStatement.executeQuery();

			while (resultSet.next()) {
				int bookid = resultSet.getInt(1);
				String isbn = resultSet.getString(2);
				String name = resultSet.getString(3);
				String author = resultSet.getString(4);
				String press = resultSet.getString(5);
				double price = resultSet.getDouble(6);
				String classification = resultSet.getString(7);
				Date pubdate = resultSet.getDate(8);
				book = new Book(bookid, isbn, name, author, press, price,
						classification, pubdate);
				bookList.add(book);
			}
			return bookList;
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return null;
	}

}

创建BookService接口

package com.cxyzxc.www.service;

import java.util.List;

import com.cxyzxc.www.entity.Book;
/**
 * 定义BookService接口,接口中定义业务逻辑方法
 */
public interface BookService {
	//添加图书
	int addBook(Book book);
	
	//删除图书
	int deleteBook(int bid);
	
	//修改图书
	int updateBook(Book book);
	
	//查询一本图书
	Book selectOne(int bid);
	
	//查询所有图书
	List<Book> selectAll();

}

创建BookServiceImpl实现类

package com.cxyzxc.www.service.impl;

import java.util.List;

import com.cxyzxc.www.dao.BookDao;
import com.cxyzxc.www.dao.impl.BookDaoImpl;
import com.cxyzxc.www.entity.Book;
import com.cxyzxc.www.service.BookService;
/**
 * 定义BookServiceImpl类,实现BookService接口,重写BookService接口中的所有方法
 */
public class BookServiceImpl implements BookService {

	BookDao bookDao = new BookDaoImpl();

	@Override
	public int addBook(Book book) {
		// 首先查询一下插入的图书在数据库中是否存在
		Book book2 = bookDao.selectOne(book.getBid());
		if (book2 == null) {
			return bookDao.insert(book);
		} else {
			System.out.println("插入的图书已经存在,插入失败");
		}
		return 0;
	}

	@Override
	public int deleteBook(int bid) {
		// 查询要删除的图书是否存在
		Book book2 = bookDao.selectOne(bid);
		if (book2 == null) {
			System.out.println("删除的图书不存在,无法删除");
		} else {
			return bookDao.delete(bid);
		}
		return 0;
	}

	@Override
	public int updateBook(Book book) {
		// 查询要修改的图书是否存在
		Book book2 = bookDao.selectOne(book.getBid());
		if (book2 == null) {
			System.out.println("你要修改的图书不存在");
		} else {
			return bookDao.update(book);
		}
		return 0;
	}

	@Override
	public Book selectOne(int bid) {
		Book book2 = bookDao.selectOne(bid);
		return book2;
	}

	@Override
	public List<Book> selectAll() {
		List<Book> bookList = bookDao.selectAll();
		return bookList;
	}

}

编写测试类

测试增加数据

package com.cxyzxc.www.view;

import com.cxyzxc.www.entity.Book;
import com.cxyzxc.www.service.BookService;
import com.cxyzxc.www.service.impl.BookServiceImpl;
import com.cxyzxc.www.utils.DateUtils;

public class Test01InsertBook {

	public static void main(String[] args) {

		BookService bookService = new BookServiceImpl();

		// 添加图书
		Book book = new Book("978-9-9456-3286-9", "JSP从入门到精通", "李二狗", "邮电出版社",129, "编程设计", DateUtils.strDateToUtilDate("2022-01-13"));
		int result = bookService.addBook(book);
		if (result == 1) {
			System.out.println("图书添加成功");
		} else {
			System.out.println("图书添加失败");
		}

	}

}

测试删除数据

package com.cxyzxc.www.view;

import com.cxyzxc.www.service.BookService;
import com.cxyzxc.www.service.impl.BookServiceImpl;

public class Test02DeleteBook {

	public static void main(String[] args) {

		BookService bookService = new BookServiceImpl();

		// 删除图书
		int result = bookService.deleteBook(1003);
		if (result == 1) {
			System.out.println("删除成功");
		} else {
			System.out.println("删除失败");
		}
		
	}

}

测试修改数据

package com.cxyzxc.www.view;

import com.cxyzxc.www.entity.Book;
import com.cxyzxc.www.service.BookService;
import com.cxyzxc.www.service.impl.BookServiceImpl;
import com.cxyzxc.www.utils.DateUtils;

public class Test03UpdateBook {

	public static void main(String[] args) {

		BookService bookService = new BookServiceImpl();

		// //修改图书
		Book book = new Book(1002, "976-9-5245-7633-5", "JSP从入门到放弃", "李四","清华大学出版社", 109.8, "编程设计",DateUtils.strDateToUtilDate("2022-10-13"));

		int result = bookService.updateBook(book);
		if (result == 1) {
			System.out.println("修改成功");
		} else {
			System.out.println("修改失败");
		}

	}

}

测试查询单个

package com.cxyzxc.www.view;

import com.cxyzxc.www.entity.Book;
import com.cxyzxc.www.service.BookService;
import com.cxyzxc.www.service.impl.BookServiceImpl;

public class Test04SelectOneBook {

	public static void main(String[] args) {

		BookService bookService = new BookServiceImpl();

		Book book = bookService.selectOne(1003);
		if (book == null) {
			System.out.println("没有你要查找的图书");
		} else {
			System.out.println(book);
		}
	}

}

测试查询所有

package com.cxyzxc.www.view;

import java.util.List;

import com.cxyzxc.www.entity.Book;
import com.cxyzxc.www.service.BookService;
import com.cxyzxc.www.service.impl.BookServiceImpl;

public class Test05SelectAllBook {

	public static void main(String[] args) {

		BookService bookService = new BookServiceImpl();

		List<Book> books = bookService.selectAll();
		if (books.isEmpty()) {

			System.out.println("数据库里没有书的数据");
		} else {
			for (int i = 0; i < books.size(); i++) {
				System.out.println(books.get(i));
			}
		}
	}

}

在这里插入图片描述

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

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

相关文章

Oracle SQL执行计划操作(8)——视图与集合相关操作

8. 视图相关操作 该类操作与包含视图的SQL语句相关。当SQL语句被硬解析时,如果SQL语句中的视图未被合并,则根据不同的具体场景,如下各操作可能会出现于相关SQL语句的执行计划。 1)VIEW 创建数据的一个中间视图,一般分为系统视图和用户视图。优化器在为SQL语句生成执行计…

iOS上架流程详细版本

苹果上架审核周期长一直是困扰用户的一大问题&#xff0c;这次把我自己上架的经历分享给大家&#xff0c;避免大家入坑。 上架总流程&#xff1a; 创建开发者账号 借助辅助工具appuploader创建证书&#xff0c;描述文件 iTunes connect创建App 打包IPA上传App Store等待审…

Kubernetes(k8s)CNI(flannel)网络模型原理

一、概述 Kubernetes 采用的是基于扁平地址空间的、非NAT的网络模型&#xff0c;每个Pod有自己唯一的IP地址。网络是由CNI(container network interface)插件建立的&#xff0c;而非K8S本身。 二、常见的几种CNI插件介绍 为了使容器之间的通信更加方便&#xff0c;Google 和 Co…

计算机网络面试大总结

本文分文五大部分&#xff0c;第一部分总纲说明计算机网络层次划分的三种模型&#xff0c;一到四部分以TCP/IP协议模型作为划分标准&#xff0c;分别说明各层作用和最常见的面试题&#xff0c;最后总结网络综合面试题&#xff0c;历时六天全文一千字。 其他经典面试题参考程序员…

虹科校园大使招募令

虹科校园大使招募令 我们正式邀请你成为虹科校内明星代言人&#xff01; 近距离接触技术大牛工作领域 来自人力总监的职业发展指导 官方校园大使认证证书 走内部通道提前斩获校招offer 你将成为 校园品牌首席推广师 赋予你自主“DIY”的权利&#xff0c;与校招负责人一起…

损失函数——机器学习

目录 一、实验内容 二、实验过程 1、算法思想 2、算法原理 3、算法分析 三、源程序代码 四、运行结果分析 五、实验总结 一、实验内容 理解损失函数的基本概念&#xff1b;理解并掌握均方差损失函数的原理&#xff0c;算法实现及代码测试分析&#xff1b;理解并掌握交叉…

【linux】linux实操篇之权限管理

14天学习训练营导师课程&#xff1a; 互联网老辛《 符合学习规律的超详细linux实战快速入门》 目录前言权限的基本介绍rwx权限详解更改文件属性1、chgrp&#xff1a;更改文件属组2、chown&#xff1a;更改文件属主&#xff0c;也可以同时更改文件属组3、chmod&#xff1a;更改文…

帷幄前沿茶话丨如何发起一场直播间运营变革?

打开抖音&#xff0c;各种各样的带货模式都有。吃播的、喊麦的、跳舞的、说相声的&#xff0c;各种表现形式都可以是带货的手段。 但实际效果如何复盘&#xff1f;一旦感性的带货模式回归到理性分析&#xff0c;问题就没那么简单了。 电商的关键衡量指标是 GMV。直播带货中&…

[附源码]java毕业设计学院竞赛管理信息系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

RabbitMQ【基本使用】

目录 消息队列 1. Message queue 释义 1.1 问题思考 ? 1.2 存在问题 1.3 优化方案 1.4 案例分析 1.5 带来的好处 1.6 消息队列特点 1.7 Email邮件案例分析 2. 消息队列相关 2.1 AMQP 3. Docker安装部署RabbitMQ 4. springboot连接配置 4.1 RabbitMQ 配置账号…

Unity记录

第四课&#xff1a;组件 自定义组件&#xff0c;主要是 编写 脚本 脚本&#xff1a;要求必须 挂载 到游戏物体上&#xff0c;才能使用 主要组件&#xff1a; &#xff08;1&#xff09;gameObject 游戏对象 VS中的显示 总结&#xff1a; //属性 name:名称 tag : 标签名称 ac…

Execution failed for task ‘:app:javaPreCompileDebug‘.

debug运行app到模拟器的时候&#xff0c;一直报错&#xff0c;然后百度了下&#xff0c;给出的答案是&#xff1a; android { defaultConfig { //添加如下配置就OK了 javaCompileOptions { annotationProcessorOptions { includeCompileClasspath true } } } 但是加了之后&am…

[附源码]java毕业设计养老护理综合服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

个人养老金真的要来了,详解人社部、财政部、税务局、银保监会和证监会联合发布的《个人养老金实施办法》(要点概览+示意图+逐条解读)

11月5日&#xff0c;人力资源社会保障部、财政部、国家税务总局、银保监会、证监会联合发布了《个人养老金实施办法》。&#xff08;人社部发〔2022〕70号&#xff09; 11月18日&#xff0c;中国银保监会发布了《商业银行和理财公司个人养老金业务管理暂行办法》。&#xff08;…

将一个硬盘空间分配给另一个硬盘,怎么把一个磁盘的空间给另一个磁盘

用户在管理电脑磁盘分区的时候&#xff0c;为了更好地利用磁盘分区&#xff0c;需要对磁盘分区进行调整&#xff0c;如果涉及到磁盘分区调整&#xff0c;将一个硬盘空间分配给另一个硬盘&#xff1f;那么&#xff0c;在本文中&#xff0c;易我小编将介绍电脑磁盘分区调整的知识…

【Linux】线程池

文章目录1.线程池概念2.线程池的优点3.线程池的应用场景4.线程池的实现5.STL和智能指针和线程安全5.1其他常见锁5.2读写锁1.线程池概念 线程池是一种线程使用模式。 线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线 程&#xff0c;等待…

土地覆盖数据集汇总

前言 土地覆盖数据是理解人类活动与全球变化之间复杂相互作用的关键信息来源,在改善生态系统、水文和大气模型的性能方面发挥着关键作用。而土地覆盖变化(LCC)是全球环境变化的起因和结果&#xff0c;影响着全球能量平衡和生物地球化学循环&#xff0c;进而影响气候变化和生态系…

Flutter中GetX系列二--Snackbar基本使用(顶部弹窗)

Snackbar基本使用 第一步&#xff1a;应用程序入口设置 当我们导入依赖后&#xff0c;在应用程序顶层把GetMaterialApp 作为顶层&#xff0c;如下所示 import package:flutter/material.dart; import package:get/get.dart;void main() {runApp(MyApp()); }class MyApp exte…

智慧物流解决方案-最新全套文件

智慧物流解决方案-最新全套文件一、建设背景行业痛点二、建设思路三、建设方案四、获取 - 智慧物流全套最新解决方案合集一、建设背景 随着物流国际化发展以及信息技术的普遍应用&#xff0c;物流管理由手工作业到半自动化、自动化&#xff0c;直至智能化的发展过程。面对现代…

MySQL之索引

引言 数据库作为项目中必不可少且运行速度相对较慢的一环&#xff0c;尤其是在大数据量下保证其更高的性能、更稳定的性能是每个后端程序员必备的技能。MySQL在执行查询语句时&#xff0c;会通过IO扫描磁盘&#xff0c;遍历数据表中的每一条数据&#xff0c;时间复杂度为O(N)&…