JDBC-Book 图书商城系统
1.前言
刚刚学习完JDBC的一些基础,想记录一下自己的学习过程分享给大家。
此次我将要完成对如下数据库进行增删改查:

我用的开发工具是idea 2021.1.4旗舰版。
数据库是Mysql,此项目需要一个数据库的jar包,参考如下:
https://dev.mysql.com/downloads/
选择连接器
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Omgr8quy-1649403360462)(F:\typora图\image-20220408113520513.png)]](/https://i-blog.csdnimg.cn/blog_migrate/7d97010fd2bded9724f1312fe539e1ad.png)
不是最新版的话就选择 Archives
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UIibeJwF-1649403360462)(F:\typora图\image-20220408113638574.png)]](/https://i-blog.csdnimg.cn/blog_migrate/12fc9bd4fbec4d9c475dd408f93418e6.png)
自行选择对应的版本,然后选中这个。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9oc8YhVh-1649403360463)(F:\typora图\image-20220408114004875.png)]](/https://i-blog.csdnimg.cn/blog_migrate/c4532a4b1cbe063a471d93550521cb8d.png)
下载压缩包

解压缩,我们需要的是这个jar文件。

项目开始
1.在idea新建一个java项目(jdbc-book)

src文件可以删掉。
在根目录新建一个lib文件夹引入jar包,将上面下载的jar包复制到lib中

右键lib选择Add as Library


这样jar包就引入了。
2.新建一个Module(book-jdbc)

3.完成菜单显示
在src新建一个class (com.yk.book.controller.Menu)类

在类中输入:
//显示菜单
Scanner input = new Scanner(System.in);
// 菜单
/*
return slt 返回用户的选择
*/
public int showMenu(){
System.out.println("============欢迎使用图书商城系统============");
System.out.println("1.查看图书列表");
System.out.println("2.添加图书库存信息");
System.out.println("3.查看特定图书信息");
System.out.println("4.图书下架");
System.out.println("5.退出");
System.out.println("========================================");
System.out.print("请选择:");
int slt = input.nextInt();
return slt;
在同目录下新建一个main 调用Menu:(主函数)
package com.yk.book.controller;
public class Main {
public static void main(String[] args) {
Menu m = new Menu();
boolean flag = true; // 先死循环,后面通过判断用户是否退出。
while(flag){
//调用显示主菜单的方法
int slt = m.showMenu();
switch (slt){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
System.out.println("好好选,别调皮");
break;
}
}
System.out.println("谢谢使用!");
}
}
运行此文件可以看到:

4.退出程序功能
当用户选择功能5时,即退出此程序
在Menu文件中写入 exit方法
equalsIgnoreCase: 忽略大小写比较。 返回值是一个布尔类型,若用户决定退出,则将flag修改为false,退出程序。
// 退出
public boolean exit(){
System.out.print("是否确认退出?(Y/N) ");
String slt = input.next();
return !"Y".equalsIgnoreCase(slt);
}
在Main函数中调用exit()
case 5:
flag = m.exit();
break;
进行测试,运行程序,输入5,将会得到如下画面,说明这一步已经完成了

5.书写图书类
在src.com.book新建一个pojo.Book

引入get/set方法,我这里的快捷键是 alt+fn+insert.
package com.yk.book.pojo;
public class Book {
// 私有属性
private Integer id;
private String name;
private Integer price;
private Integer count;
private String publisher;
public Book() {
}
public Book(Integer id, String name, String publisher) {
this.id = id;
this.name = name;
this.publisher = publisher;
}
public Book(Integer id, String name, Integer price, Integer count, String publisher) {
this.id = id;
this.name = name;
this.price = price;
this.count = count;
this.publisher = publisher;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
@Override
public String toString() {
return id +"\t\t" + name +"\t\t" + price + "\t\t" + count + "\t\t" + publisher ;
}
}
6.接口
在scr.yk.com.DAO.impl见一个接口文件BookDAO
接口(Interface)从本质上讲是一个抽象类

完成各个功能的接口
package com.yk.book.DAO.impl;
import com.yk.book.pojo.Book;
import java.util.List;
public interface BookDAO {
// 查询库存列表
List<Book> getBookList();
// 新增库存
boolean addBook(Book book);
// 修改库存
boolean updateBook(Book book);
// 根据名称查询特定排序
Book getBookByName(String name);
// 删除特定库存记录
boolean delBook(String name);
}
然后在同目录下新建一个BookDAOImpl,在这里完成增删改查。

7.功能实现
1.展示图书列表
1.连接驱动 Class.forName(“com.mysql.cj.jdbc.Driver”);

2.创建驱动管理器 (数据库url,用户名,密码)
Connection conn = DriverManager.getConnection(URL,‘root’,‘p123456’);
3.编写sql语句查询 String sql = “selec * from t_book”;
4.创建预处理命令 PreparedStatement psmt = conn.prepareStatement(sql);
5.执行查询 ResultSet rs = psmt.executeQuery(); 返回查询的行数
6.数据解析
在BookDAOImpl中写入,返回值是一个list
ResultSet rs;
PreparedStatement psmt;
Connection conn;
final String URL = "jdbc:mysql://localhost:3306/book?useSSL=false";
@Override
public List<Book> getBookList() {
List<Book> bookList = new ArrayList<>();
try {
// 1.连接驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.创建驱动管理器
conn = DriverManager.getConnection(URL,"root","p123456");
// 3.编写SQL语句(查询)
String sql = "select * from t_book";
// 4.创建预处理命令
psmt = conn.prepareStatement(sql);
// 5.执行查询
rs = psmt.executeQuery();
// 6.数据解析
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
int price = rs.getInt(3);
int count = rs.getInt(4);
String publisher = rs.getString(5);
Book book = new Book(id,name,price,count,publisher);
bookList.add(book);
}
return bookList;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally { //关闭
try {
if (rs != null) {
rs.close();
}
if(psmt!=null){
psmt.close();
}
if(conn!=null && !conn.isClosed()){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
7.在Menu菜单中完成showBookList()方法
BookDAO bookDAO = new BookDAOImpl();
// 查看图书列表
public void showBookList(){
// 获取所有的图书
List<Book> bookList = bookDAO.getBookList();
System.out.println("===========================================");
System.out.println("编号\t\t名称\t\t单价\t\t库存\t\t出版社");
// 判断是否有数据
if(bookList == null || bookList.size() <=0 ){
System.out.println("对不起,库存为空");
}else{
for (int i = 0; i < bookList.size(); i++) {
Book book = bookList.get(i);
System.out.println(book); //默认调用Book里面的String方法,
}
}
System.out.println("===========================================");
System.out.print("任意键继续:");
input.next();
}
8.在主函数中调用
case 1:
m.showBookList();
break;
9.运行程序,测试,输入1:

看到此结果,说明查看图书列表功能已经完成。
2.添加图书
添加图书的时候,我们需要用到查询单个图书的功能,如果该图书存在,则追加库存量;若不存在,则添加该图书。
在bookDAOImpl中书写代码
1.添加
@Override
public boolean addBook(Book book) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL,"root","p123456");
// 插入 语句
String sql = "insert into t_book values(0,?,?,?,?)";
PreparedStatement psmt = conn.prepareStatement(sql);
// 赋值
psmt.setString(1,book.getName());
psmt.setInt(2,book.getPrice());
psmt.setInt(3,book.getCount());
psmt.setString(4,book.getPublisher());
return psmt.executeUpdate()>0;
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally { // 关闭
try {
if(psmt!=null){
psmt.close();
}
if(conn!=null && !conn.isClosed()){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return false;
}
@Override
public boolean updateBook(Book book) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(URL,"root","p123456");
// 更新的sql语句
String sql = "update t_book set count = ? where id = ?";
// 赋值
psmt = conn.prepareStatement(sql);
psmt.setInt(1,book.getCount());
psmt.setInt(2,book.getId());
return psmt.executeUpdate()>0;
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally { // 关闭
try {
if(psmt!=null){
psmt.close();
}
if(conn!=null && !conn.isClosed()){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return false;
}
@Override
public Book getBookByName(String name) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(URL,"root","p123456");
// 查询单本图书
String sql = "select * from t_book where name like ?";
// 赋值
psmt = conn.prepareStatement(sql);
psmt.setString(1,name);
// 数据解析
rs = psmt.executeQuery();
if(rs.next()){
int id = rs.getInt(1);
int price = rs.getInt(3);
int count = rs.getInt(4);
String publisher = rs.getString(5);
// 返回一个book对象
return new Book(id,name,price,count,publisher);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally { // 关闭
try {
if (rs != null) {
rs.close();
}
if(psmt!=null){
psmt.close();
}
if(conn!=null && !conn.isClosed()){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
接着在Menu菜单中写添加图书代码
// 添加图书
public void addBook(){
System.out.print("请输入图书名称:");
String name = input.next();
Book book = bookDAO.getBookByName(name);
// 图书不存在时,新建一个
if (book == null){
System.out.print("请输入图书单价:");
int price = input.nextInt();
System.out.print("请输入图书库存量:");
int count = input.nextInt();
System.out.print("请输入图书出版社:");
String publisher = input.next();
// 封装一个图书对象
book = new Book(0,name,price,count,publisher);
// 调用添加接口
bookDAO.addBook(book);
}else{ // 图书存在,则追加库存量
System.out.print("请输入追加的库存量:");
int count = input.nextInt();
book.setCount(book.getCount()+count);
// 调用DAO的修改方法
bookDAO.updateBook(book);
}
}
最后在主函数中调用:
case 2:
m.addBook();
break;
代码写完了,接着我们进行测试,输入2:

可以看到,高等数学这本书已经被添加了。、
3.查看特定图书信息
这功能的接口在添加图书已经写过了
我们通过一个图书名称去数据查询,返回值是一个book对象
如果图书存在,则打印图书信息,若不存在,则告诉用户没有这本书。
我们直接在Menu菜单中书写代码
// 查看特定图书
public void viewOneBook(){
System.out.print("请输入图书名称:");
String name = input.next() ;
// 调用查询单个图书接口
Book book =bookDAO.getBookByName(name);
// 如果图书不存在
if(book == null){
System.out.println("对不起,没有找到指定的图书记录!");
}else{
System.out.println("=======================================");
System.out.println("编号\t\t名称\t\t单价\t\t库存\t\t出版社");
System.out.println(book);
System.out.println("=======================================");
}
System.out.print("任意键继续:");
input.next();
}
接着我们在主函数调用
case 3:
m.viewOneBook();
break;
输入3:

看到这样的结果,我们就还是顺利的。
4.图书下架
@Override
public boolean delBook(String name) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(URL,"root","p123456");
// 删除的sql语句
String sql = "delete from t_book where name like ?";
psmt = conn.prepareStatement(sql);
psmt.setString(1,name);
return psmt.executeUpdate()>0;
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
try {
if (rs != null) {
rs.close();
}
if(psmt!=null){
psmt.close();
}
if(conn!=null && !conn.isClosed()){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
在Menu菜单中书写删除代码:
// 删除
public void delBook(){
System.out.print("请输入要删除图书名称:");
String name = input.next();
Book book = bookDAO.getBookByName(name);
if(book==null) {
System.out.println("对不起,没有找到需要删除的图书信息!");
}else{
System.out.print("是否确认删除(Y/N):");
String slt = input.next();
if("y".equalsIgnoreCase(slt)){
// 调用删除接口
bookDAO.delBook(name);
System.out.println("删除成功");
}
}
}
在主函数调用:
case 4:
m.delBook();
break;
最后,我们测试一下功能,输出4:

可以看到,计算机网络已经被删除了。
3.结语
到此,这个项目就结束了。生命不息,学习不止。
最后看一下项目的目录吧
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ivWy26f-1649403360476)(F:\typora图\image-20220408153403964.png)]](/https://i-blog.csdnimg.cn/blog_migrate/4fdf15567b9470b4fca688a8c253aa38.png)
源码链接
链接:https://pan.baidu.com/s/12Tc2BYbdUY1nG5DHh2mvJw?pwd=tysm
提取码:tysm
侵删致歉!
本文记录了一个使用JDBC实现的图书商城系统的开发过程,包括数据库连接、菜单显示、增删改查功能的实现,涉及Mysql数据库、IDEA集成环境及基本的Java编程操作。

1924

被折叠的 条评论
为什么被折叠?



