JDBC-Book 图书商城系统
1.前言
刚刚学习完JDBC的一些基础,想记录一下自己的学习过程分享给大家。
此次我将要完成对如下数据库进行增删改查:
我用的开发工具是idea 2021.1.4旗舰版。
数据库是Mysql,此项目需要一个数据库的jar包,参考如下:
https://dev.mysql.com/downloads/
选择连接器
不是最新版的话就选择 Archives
自行选择对应的版本,然后选中这个。
下载压缩包
解压缩,我们需要的是这个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 =newScanner(System.in);// 菜单/*
return slt 返回用户的选择
*/publicintshowMenu(){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:(主函数)
packagecom.yk.book.controller;publicclassMain{publicstaticvoidmain(String[] args){Menu m =newMenu();boolean flag =true;// 先死循环,后面通过判断用户是否退出。while(flag){//调用显示主菜单的方法int slt = m.showMenu();switch(slt){case1:break;case2:break;case3:break;case4:break;case5:break;default:System.out.println("好好选,别调皮");break;}}System.out.println("谢谢使用!");}}
运行此文件可以看到:
4.退出程序功能
当用户选择功能5时,即退出此程序
在Menu文件中写入 exit方法
equalsIgnoreCase: 忽略大小写比较。 返回值是一个布尔类型,若用户决定退出,则将flag修改为false,退出程序。
// 退出publicbooleanexit(){System.out.print("是否确认退出?(Y/N) ");String slt = input.next();return!"Y".equalsIgnoreCase(slt);}
在Main函数中调用exit()
case5:
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;finalString URL ="jdbc:mysql://localhost:3306/book?useSSL=false";@OverridepublicList<Book>getBookList(){List<Book> bookList =newArrayList<>();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 =newBook(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();}}returnnull;}
7.在Menu菜单中完成showBookList()方法
BookDAO bookDAO =newBookDAOImpl();// 查看图书列表publicvoidshowBookList(){// 获取所有的图书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.在主函数中调用
case1:
m.showBookList();break;
9.运行程序,测试,输入1:
看到此结果,说明查看图书列表功能已经完成。
2.添加图书
添加图书的时候,我们需要用到查询单个图书的功能,如果该图书存在,则追加库存量;若不存在,则添加该图书。
在bookDAOImpl中书写代码
1.添加
@OverridepublicbooleanaddBook(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();}}returnfalse;}
@OverridepublicbooleanupdateBook(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();}}returnfalse;}
@OverridepublicBookgetBookByName(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对象returnnewBook(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();}}returnnull;}
接着在Menu菜单中写添加图书代码
// 添加图书publicvoidaddBook(){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 =newBook(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);}}
最后在主函数中调用:
case2:
m.addBook();break;
代码写完了,接着我们进行测试,输入2:
可以看到,高等数学这本书已经被添加了。、
3.查看特定图书信息
这功能的接口在添加图书已经写过了
我们通过一个图书名称去数据查询,返回值是一个book对象
如果图书存在,则打印图书信息,若不存在,则告诉用户没有这本书。
我们直接在Menu菜单中书写代码
// 查看特定图书publicvoidviewOneBook(){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();}
接着我们在主函数调用
case3:
m.viewOneBook();break;
输入3:
看到这样的结果,我们就还是顺利的。
4.图书下架
@OverridepublicbooleandelBook(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菜单中书写删除代码:
// 删除publicvoiddelBook(){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("删除成功");}}}
在主函数调用:
case4:
m.delBook();break;
最后,我们测试一下功能,输出4:
可以看到,计算机网络已经被删除了。
3.结语
到此,这个项目就结束了。生命不息,学习不止。
最后看一下项目的目录吧
源码链接
链接:https://pan.baidu.com/s/12Tc2BYbdUY1nG5DHh2mvJw?pwd=tysm
提取码:tysm
侵删致歉!
版权归原作者 kaikaiccc 所有, 如有侵权,请联系我们删除。