Java實現(xiàn)迷你圖書管理系統(tǒng)案例全程

?
項目需求
為某圖書館開發(fā)一個迷你圖書管理系統(tǒng),實現(xiàn)圖書的管理,包括如下功能:
(1)新增圖書
(2)查看圖書
(3)刪除圖書
(4)借出圖書
(5)歸還圖書
(6)退出圖書系統(tǒng)
覆蓋知識
程序基本概念、數(shù)據(jù)類型、流程控制、順序、選擇 、循環(huán)、跳轉(zhuǎn)語句、變量、類、方法、數(shù)據(jù)庫、JDBC等相關(guān)知識
掌握數(shù)據(jù)庫、JDBC、三層架構(gòu)等相關(guān)知識。
掌握Druid連接池、Apache的DBUtils使用 。
開發(fā)思路
(1)明確需求
(2)編碼順序
1)、添加需要的jar包到項目中,將lib文件夾中的jar文件通過鼠標(biāo)右單擊選擇Build Path的方式添加到你設(shè)置的eatJar文件目錄里。
?
2)、創(chuàng)建database.properties文件,用來配置注冊驅(qū)動和數(shù)據(jù)庫連接對象的相關(guān)數(shù)據(jù)。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java221804
username=root
password=huanghuang
initialSize=10
maxActive=30
maxIdle=5
maxWait=3000
3)、添加需要的工具類DBUtils類
package cn.book.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class DBUtils {
private static DruidDataSource druidDataSource;
static {
Properties properties = new Properties();
try {
InputStream is = DBUtils.class
.getResourceAsStream("/database.properties");
properties.load(is);
druidDataSource = (DruidDataSource) DruidDataSourceFactory
.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return druidDataSource;
}
}4)、創(chuàng)建數(shù)據(jù)表:book表
CREATE DATABASE IF NOT EXISTS `java221804`; CREATE TABLE IF NOT EXISTS book( `name` VARCHAR(20), `state` INT, `date` INT, `count` INT );
?
5)、編寫book類,包含get/set方法、有參/無參構(gòu)造、toString方法等
package cn.book.entity;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Book implements Serializable {
//定義屬性
private String name;
private int state;
private int date;
private int count;
//添加無參構(gòu)造
public Book() {
super();
}
//添加有參構(gòu)造
public Book(String name, int state, int date, int count) {
super();
this.name = name;
this.state = state;
this.date = date;
this.count = count;
}
//添加get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public int getDate() {
return date;
}
public void setDate(int date) {
this.date = date;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public String toString() {
return "Book [name=" + name + ", state=" + state + ", date=" + date
+ ", count=" + count + "]";
}
}6)、數(shù)據(jù)訪問層DAO層的接口和實現(xiàn)類的增刪改查方法的編寫
7)、服務(wù)層Service層的接口和實現(xiàn)類的增刪改查方法的編寫
8)、最后完成視圖層View層測試類的編寫
開發(fā)步驟
1、數(shù)據(jù)初始化?
2、BookDaoImpl類中的部分重要方法
創(chuàng)建 QueryRunner 對象
private QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
增加圖書的方法
public int insert(Book book) {
String sql = "insert into book(name,state,date,count) values(?,?,?,?);";
Object[] args = { book.getName(), book.getState(), book.getDate(),
book.getCount() };
try {
return queryRunner.update(sql, args);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}更改圖書信息的方法
public int update(Book book) {
String sql="update book set state=?,date=?,count=? where name=?; ";
Object[] args={book.getState(),book.getDate(),book.getCount(),book.getName()};
try {
return queryRunner.update(sql, args);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}查詢?nèi)繄D書的方法
public List<Book> selectAll() {
String sql = "SELECT * FROM book;";
try {
return queryRunner.query(sql, new BeanListHandler<Book>(Book.class) );
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}歡迎使用迷你圖書管理器方法
新增圖書方法
查看圖書方法
刪除圖書方法
借出圖書方法
歸還圖書方法
退出圖書方法
歡迎首界面:
public static void useBookSystem() {
// 輸出歡迎菜單
System.out.println("歡迎使用迷你圖書管理器");
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("6.退出圖書");
System.out.println("-------------------------");
}全部代碼展示
1、Book類
package cn.book.entity;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Book implements Serializable {
//定義屬性
private String name;
private int state;
private int date;
private int count;
//添加無參構(gòu)造
public Book() {
super();
}
//添加有參構(gòu)造
public Book(String name, int state, int date, int count) {
super();
this.name = name;
this.state = state;
this.date = date;
this.count = count;
}
//添加get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public int getDate() {
return date;
}
public void setDate(int date) {
this.date = date;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public String toString() {
return "Book [name=" + name + ", state=" + state + ", date=" + date
+ ", count=" + count + "]";
}
}2、DBUtils類
(使用連接池DruidDataSource、Apache的知識)
package cn.book.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class DBUtils {
private static DruidDataSource druidDataSource;
static {
Properties properties = new Properties();
try {
InputStream is = DBUtils.class
.getResourceAsStream("/database.properties");
properties.load(is);
druidDataSource = (DruidDataSource) DruidDataSourceFactory
.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return druidDataSource;
}
}3、數(shù)據(jù)訪問層的BookDao接口
package cn.book.dao;
import java.util.List;
import cn.book.entity.Book;
public interface BookDao {
// 增
public int insert(Book book);
// 刪
public int delete(String name);
// 改
public int update(Book book);
// 查一個
public Book select(String name);
// 查全部
public List<Book> selectAll();
}4、數(shù)據(jù)訪問層的BookDaoImpl類
package cn.book.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import cn.book.dao.BookDao;
import cn.book.entity.Book;
import cn.book.utils.DBUtils;
public class BookDaoImpl implements BookDao {
private QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
@Override
public int insert(Book book) {
String sql = "insert into book(name,state,date,count) values(?,?,?,?);";
Object[] args = { book.getName(), book.getState(), book.getDate(),
book.getCount() };
try {
return queryRunner.update(sql, args);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int delete(String name) {
String sql="delete from book where name=?;";
try {
return queryRunner.update(sql, name);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int update(Book book) {
String sql="update book set state=?,date=?,count=? where name=?; ";
Object[] args={book.getState(),book.getDate(),book.getCount(),book.getName()};
try {
return queryRunner.update(sql, args);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public Book select(String name) {
String sql = "select * from book where name=?;";
try {
return queryRunner.query(sql,new BeanHandler<Book>(Book.class), name);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<Book> selectAll() {
String sql = "SELECT * FROM book;";
try {
return queryRunner.query(sql, new BeanListHandler<Book>(Book.class) );
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}5、服務(wù)層的BookService接口
package cn.book.service;
import java.util.List;
import cn.book.entity.Book;
public interface BookService {
// 增
public int insertBook(Book book);
// 刪
public int deleteBook(String name);
// 改
public int updateBook(Book book);
// 查一個
public Book selectBook(String name);
// 查全部
public List<Book> selectAllBooks();
}6、服務(wù)層的BookServiceImpl類
package cn.book.service.impl;
import java.util.List;
import cn.book.dao.impl.BookDaoImpl;
import cn.book.entity.Book;
import cn.book.service.BookService;
public class BookServiceImpl implements BookService {
BookDaoImpl bookDaoImpl = new BookDaoImpl();
@Override
public int insertBook(Book book) {
if (bookDaoImpl.select(book.getName()) == null) {
return bookDaoImpl.insert(book);
}
return 0;
}
@Override
public int deleteBook(String name) {
if (bookDaoImpl.select(name) != null) {
return bookDaoImpl.delete(name);
}
return 0;
}
@Override
public int updateBook(Book book) {
if (bookDaoImpl.select(book.getName()) != null) {
return bookDaoImpl.update(book);
}
return 0;
}
@Override
public Book selectBook(String name) {
bookDaoImpl.select(name);
return null;
}
@Override
public List<Book> selectAllBooks() {
List<Book> listBooks = bookDaoImpl.selectAll();
return listBooks;
}
}7、視圖層BookMgr測試類
package cn.book.view;
import java.util.List;
import java.util.Scanner;
import cn.book.entity.Book;
import cn.book.service.impl.BookServiceImpl;
public class BookMgr {
// 定義一個靜態(tài)的Scanner
static Scanner inputsc = new Scanner(System.in);
// 是否退出系統(tǒng),false代表退出系統(tǒng)
static boolean flag = true;
static int num = -1;
static BookServiceImpl bookServiceImpl = new BookServiceImpl();
// 歡迎使用迷你圖書管理器方法
public static void useBookSystem() {
// 輸出歡迎菜單
System.out.println("歡迎使用迷你圖書管理器");
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("6.退出圖書");
System.out.println("-------------------------");
}
// 新增圖書方法
public static void addBook() {
System.out.println("-->新增圖書\n");
System.out.println("請輸入圖書名稱:");
String bookName = inputsc.next();
Book book = new Book(bookName, 0, 0, 0);
// 向數(shù)據(jù)庫添加圖書
int num = bookServiceImpl.insertBook(book);
System.out.println();
if (num != 0) {
System.out.println("新增《" + bookName + "》成功!");
} else {
System.out.println("新增《" + bookName + "》失?。?);
}
System.out.println("*****************************************");
}
// 查看圖書方法
public static void lookBook() {
System.out.println("-->查看圖書\n");
System.out.println("序號\t狀態(tài)\t名稱\t借出日期\t借出次數(shù)");
// 獲取數(shù)據(jù)庫全部圖書
List<Book> books = bookServiceImpl.selectAllBooks();
for (int i = 0; i < books.size(); i++) {
String BookState = (books.get(i).getState() == 0) ? "可借閱" : "已借出";
String dateStr = (books.get(i).getDate() == 0) ? "" : (books.get(i)
.getDate() + "日");
System.out.println((i + 1) + "\t" + BookState + "\t"
+ books.get(i).getName() + "\t" + dateStr + "\t"
+ books.get(i).getCount() + "次");
}
System.out.println("*****************************************");
}
// 刪除圖書方法
public static void delBook() {
System.out.println("-->刪除圖書\n");
System.out.println("請輸入要刪除圖書的名稱:");
String deleteBook = inputsc.next();
// 從數(shù)據(jù)庫中查找此圖書
Book delBook = bookServiceImpl.selectBook(deleteBook);
boolean flag3 = false;
// 刪除的圖書存在、狀態(tài)處于可借閱狀態(tài)
if (delBook.getName() != null && deleteBook.equals(delBook.getName())
&& delBook.getState() == 0) {
flag3 = true;
int num = bookServiceImpl.deleteBook(delBook.getName());
if (num != 0) {
System.out.println("圖書刪除成功!");
} else {
System.out.println("圖書刪除失??!");
}
} else if (delBook.getName() != null
&& deleteBook.equals(delBook.getName())
&& delBook.getState() == 1) {
flag3 = true;
System.out.println("該圖書已被借出,目前無法刪除!");
}
if (!flag3) {
System.out.println("沒有找到匹配信息!");
}
System.out.println("*****************************************");
}
// 借出圖書方法
public static void lendBook() {
System.out.println("-->借出圖書\n");
System.out.print("請輸入圖書名稱:");
String want = inputsc.next(); // 要借出的圖書名稱
// 從數(shù)據(jù)庫中查找此圖書
Book wantBook = bookServiceImpl.selectBook(want);
if (wantBook == null) {
System.out.println("沒有找到匹配信息!");
} else {
if (want.equals(wantBook.getName()) && wantBook.getState() == 0) { // 找到匹配可借
wantBook.setState(1); // 將此圖書置于借出狀態(tài)
System.out.print("請輸入借出日期:");
int inputscData = inputsc.nextInt();
wantBook.setDate(inputscData);
while (wantBook.getDate() < 1 || wantBook.getDate() > 31) { // 當(dāng)輸入借出的日期不滿足1-31時
System.out.println("必須輸入大于等于1且小于等于31的數(shù)字,請重新輸入:");
inputscData = inputsc.nextInt();
wantBook.setDate(inputscData);
}
wantBook.setCount(wantBook.getCount() + 1);
// 更新書本最新信息
int num = bookServiceImpl.updateBook(wantBook);
if (num != 0) {
System.out.println("借出《" + want + "》成功!");
} else {
System.out.println("借出《" + want + "》失敗!");
}
} else if (want.equals(wantBook.getName())
&& wantBook.getState() == 1) { // 找到匹配已被借出
System.out.println("《" + want + "》已被借出!");
}
}
System.out.println("*****************************************");
}
// 歸還圖書方法
public static void returnBook() {
System.out.println("-->歸還圖書\n");
int charge = 0; // 租金
System.out.print("請輸入歸還圖書名稱:");
String back = inputsc.next();
// 從數(shù)據(jù)庫中查找此圖書
Book backBook = bookServiceImpl.selectBook(back);
if (backBook == null) {
System.out.println("沒有找到匹配信息!");
} else {
if (back.equals(backBook.getName()) && backBook.getDate() == 1) {// 找到匹配
backBook.setDate(0); // 將借閱狀態(tài)修改為可借閱
System.out.print("請輸入歸還日期:");
int redate = inputsc.nextInt();
while (redate < backBook.getDate() || redate > 31) { //
// 歸還日期不能小于借出日期,也不能大于31
if (redate < backBook.getDate()) {
System.out.println("歸還日期不能小于借出日期,請重新輸入:");
} else {
System.out.println("一個月只有31天,請重新輸入:");
}
redate = inputsc.nextInt();
}
charge = redate - backBook.getDate();
// 更新書本最新信息
int num = bookServiceImpl.updateBook(backBook);
if (num != 0) {
System.out.println("\n歸還《" + back + "》成功!");
System.out.println("借出日期為:" + (backBook.getDate() + 1)
+ "日");
System.out.println("歸還日期為:" + redate + "日");
System.out.println("應(yīng)付租金(元):" + charge);
backBook.setDate(0);
} else {
System.out.println("借出《" + back + "》失?。?);
}
} else if (back.equals(backBook.getName())
&& backBook.getState() == 0) {// 找到匹配但沒有借出
System.out.println("該圖書沒有被借出!無法進(jìn)行歸還操作。");
}
}
System.out.println("*****************************************");
}
// 操作
public static void runTest() {
// 循環(huán)操作
do {
// 定義一個BookMethod操作類,將操作方法定義在BookMethod類中,然后調(diào)用
// 歡迎菜單方法
BookMgr.useBookSystem();
System.out.println("請選擇:");
int choose = inputsc.nextInt();
switch (choose) {
case 1:
// 新增圖書
BookMgr.addBook();
break;
case 2:
// 查看圖書
BookMgr.lookBook();
break;
case 3:
// 刪除圖書
BookMgr.delBook();
break;
case 4:
// 借出圖書
BookMgr.lendBook();
break;
case 5:
// 歸還圖書
BookMgr.returnBook();
break;
case 6:
// 退出圖書
flag = false;
break;
default:
flag = false;
break;
}
if (flag) {
System.out.println("輸入0返回:");
num = inputsc.nextInt();
} else {
break;
}
} while (num == 0);
System.out.println("謝謝使用!");
}
public static void main(String[] args) {
BookMgr.runTest();
}
}到此這篇關(guān)于Java實現(xiàn)迷你圖書管理系統(tǒng)案例全程的文章就介紹到這了,更多相關(guān)Java圖書管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)String類型和Date類型相互轉(zhuǎn)換
很多人表示,java將string類型轉(zhuǎn)為date類型不知道應(yīng)該怎樣做,本文就來介紹一下java實現(xiàn)String類型和Date類型相互轉(zhuǎn)換,具有一定的參考價值,感興趣的可以了解一下2023-10-10
IntelliJ?IDEA?2022.1.1?沒有CVS的過程分析
這篇文章主要介紹了IntelliJ?IDEA?2022.1.1?沒有CVS的過程解析,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
為什么Spring和IDEA都不推薦使用 @Autowired 注解
本文主要介紹了為什么Spring和IDEA都不推薦使用 @Autowired 注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Spring AI 使用本地 Ollama Embeddings的操作方法
使用 OpenAI 的 Embeddings 接口是有費(fèi)用的,如果想對大量文檔進(jìn)行測試,使用本地部署的 Embeddings 就能省去大量的費(fèi)用,所以我們嘗試使用本地的 Ollama Embeddings,這篇文章主要介紹了Spring AI 使用本地 Ollama Embeddings,需要的朋友可以參考下2024-05-05
基于SpringBoot和Vue3的博客平臺的用戶注冊與登錄功能實現(xiàn)
本教程將指導(dǎo)您如何使用Spring?Boot和Vue3實現(xiàn)用戶注冊與登錄功能。我們將使用Spring?Boot作為后端框架,Vue3作為前端框架,同時使用MySQL作為數(shù)據(jù)庫,感興趣的朋友可以參考一下2023-04-04
Jdbctemplate多數(shù)據(jù)源配置方法詳解
這篇文章主要介紹了Jdbctemplate多數(shù)據(jù)源配置方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06

