Java——迷你图书管理器(JDBC+MySQL+Apache DBUtils)
创始人
2024-03-02 12:10:50

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。

🍎个人主页:乐趣国学的博客

🍊个人信条:不迁怒,不贰过。小知识,大智慧。

💞当前专栏:Java案例分享专栏

✨特色专栏:国学周更-心性养成之路

🥭本文内容:Java——迷你图书管理器(JDBC+MySQL+Apache DBUtils)

更多内容点击👇

                       Java——迷你图书管理器(对象+JDBC)

                       Java——迷你图书管理器(对象+XML)

                       Java——迷你图书管理器(对象+IO流)

                       Java——迷你图书管理器(对象+集合)

                       Java——迷你图书管理器(对象+数组)

目录

⛳️ 项目需求

⛳️ 覆盖知识

⛳️ 开发思路 

⛳️ 开发步骤

❤️ 1、数据初始化​

❤️ 2、BookDaoImpl类中的部分重要方法

⛳️ 全部代码展示 

❤️ 1、Book类

❤️ 2、DBUtils类(使用连接池DruidDataSource、Apache的知识)

❤️ 3、数据访问层的BookDao接口

❤️ 4、数据访问层的BookDaoImpl类

❤️ 5、服务层的BookService接口

❤️ 6、服务层的BookServiceImpl类

❤️ 7、视图层BookMgr测试类 


 

⛳️ 项目需求

为某图书馆开发一个迷你图书管理系统,实现图书的管理,包括如下功能:

        (1)新增图书

        (2)查看图书

        (3)删除图书

        (4)借出图书

        (5)归还图书

        (6)退出图书系统

⛳️ 覆盖知识

        程序基本概念、数据类型、流程控制、顺序、选择 、循环、跳转语句、变量、类、方法、数据库、JDBC等相关知识

        掌握数据库、JDBC、三层架构等相关知识。
        掌握Druid连接池、Apache的DBUtils使用 。

⛳️ 开发思路 

(1)明确需求

(2)编码顺序

        1)、添加需要的jar包到项目中,将lib文件夹中的jar文件通过鼠标右单击选择Build Path的方式添加到你设置的eatJar文件目录里。

        2)、创建database.properties文件,用来配置注册驱动和数据库连接对象的相关数据。

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/java221804username=rootpassword=huanghuanginitialSize=10maxActive=30maxIdle=5maxWait=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)、创建数据表: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方法、有参/无参构造、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;//添加无参构造public Book() {super();}//添加有参构造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;}@Overridepublic String toString() {return "Book [name=" + name + ", state=" + state + ", date=" + date+ ", count=" + count + "]";}}

         6)、数据访问层DAO层的接口和实现类的增删改查方法的编写

         7)、服务层Service层的接口和实现类的增删改查方法的编写

         8)、最后完成视图层View层测试类的编写

⛳️ 开发步骤

❤️ 1、数据初始化​

❤️ 2、BookDaoImpl类中的部分重要方法

        创建 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;}

        查询全部图书的方法

	public List selectAll() {String sql = "SELECT * FROM book;";try {return queryRunner.query(sql, new BeanListHandler(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;//添加无参构造public Book() {super();}//添加有参构造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;}@Overridepublic 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、数据访问层的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 selectAll();}

❤️ 4、数据访问层的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());@Overridepublic 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;}@Overridepublic int delete(String name) {String sql="delete from book where name=?;";try {return queryRunner.update(sql, name);} catch (SQLException e) {e.printStackTrace();}return 0;}@Overridepublic 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;}@Overridepublic Book select(String name) {String sql = "select * from book where name=?;";try {return queryRunner.query(sql,new BeanHandler(Book.class), name);} catch (SQLException e) {e.printStackTrace();}return null;}@Overridepublic List selectAll() {String sql = "SELECT * FROM book;";try {return queryRunner.query(sql, new BeanListHandler(Book.class) );} catch (SQLException e) {e.printStackTrace();}return null;}}

❤️ 5、服务层的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 selectAllBooks();
}

❤️ 6、服务层的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();@Overridepublic int insertBook(Book book) {if (bookDaoImpl.select(book.getName()) == null) {return bookDaoImpl.insert(book);}return 0;}@Overridepublic int deleteBook(String name) {if (bookDaoImpl.select(name) != null) {return bookDaoImpl.delete(name);}return 0;}@Overridepublic int updateBook(Book book) {if (bookDaoImpl.select(book.getName()) != null) {return bookDaoImpl.update(book);}return 0;}@Overridepublic Book selectBook(String name) {bookDaoImpl.select(name);return null;}@Overridepublic List selectAllBooks() {List 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 {// 定义一个静态的Scannerstatic Scanner inputsc = new Scanner(System.in);// 是否退出系统,false代表退出系统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);// 向数据库添加图书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名称\t借出日期\t借出次数");// 获取数据库全部图书List 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();// 从数据库中查找此图书Book delBook = bookServiceImpl.selectBook(deleteBook);boolean flag3 = false;// 删除的图书存在、状态处于可借阅状态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(); // 要借出的图书名称// 从数据库中查找此图书Book wantBook = bookServiceImpl.selectBook(want);if (wantBook == null) {System.out.println("没有找到匹配信息!");} else {if (want.equals(wantBook.getName()) && wantBook.getState() == 0) { // 找到匹配可借wantBook.setState(1); // 将此图书置于借出状态System.out.print("请输入借出日期:");int inputscData = inputsc.nextInt();wantBook.setDate(inputscData);while (wantBook.getDate() < 1 || wantBook.getDate() > 31) { // 当输入借出的日期不满足1-31时System.out.println("必须输入大于等于1且小于等于31的数字,请重新输入:");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();// 从数据库中查找此图书Book backBook = bookServiceImpl.selectBook(back);if (backBook == null) {System.out.println("没有找到匹配信息!");} else {if (back.equals(backBook.getName()) && backBook.getDate() == 1) {// 找到匹配backBook.setDate(0); // 将借阅状态修改为可借阅System.out.print("请输入归还日期:");int redate = inputsc.nextInt();while (redate < backBook.getDate() || redate > 31) { //// 归还日期不能小于借出日期,也不能大于31if (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("应付租金(元):" + charge);backBook.setDate(0);} else {System.out.println("借出《" + back + "》失败!");}} else if (back.equals(backBook.getName())&& backBook.getState() == 0) {// 找到匹配但没有借出System.out.println("该图书没有被借出!无法进行归还操作。");}}System.out.println("*****************************************");}// 操作public static void runTest() {// 循环操作do {// 定义一个BookMethod操作类,将操作方法定义在BookMethod类中,然后调用// 欢迎菜单方法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();}}

       码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,请关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

​​

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...