0


Java——迷你图书管理器(JDBC+MySQL+Apache DBUtils)

181477c04df146b59041d2d73da34b9d.gif

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

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

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

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

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

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

更多内容点击👇

  1. Java——迷你图书管理器(对象+JDBC
  2. Java——迷你图书管理器(对象+XML
  3. Java——迷你图书管理器(对象+IO流)
  4. Java——迷你图书管理器(对象+集合)
  5. Java——迷你图书管理器(对象+数组)

目录


b872f203ebb24b888cc7e36c41fa60d6.jpeg

⛳️ 项目需求

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

  1. 1)新增图书
  2. 2)查看图书
  3. 3)删除图书
  4. 4)借出图书
  5. 5)归还图书
  6. 6)退出图书系统

⛳️ 覆盖知识

  1. 程序基本概念、数据类型、流程控制、顺序、选择 、循环、跳转语句、变量、类、方法、数据库、JDBC等相关知识
  2. 掌握数据库、JDBC、三层架构等相关知识。
  3. 掌握Druid连接池、ApacheDBUtils使用

⛳️ 开发思路

(1)明确需求

(2)编码顺序

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

ebedba26839c45c2a3169eb52852d660.png

  1. 2)、创建database.properties文件,用来配置注册驱动和数据库连接对象的相关数据。
  1. driver=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/java221804
  3. username=root
  4. password=huanghuang
  5. initialSize=10
  6. maxActive=30
  7. maxIdle=5
  8. maxWait=3000
  1. 3)、添加需要的工具类DBUtils
  1. package cn.book.utils;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.Properties;
  5. import javax.sql.DataSource;
  6. import com.alibaba.druid.pool.DruidDataSource;
  7. import com.alibaba.druid.pool.DruidDataSourceFactory;
  8. public class DBUtils {
  9. private static DruidDataSource druidDataSource;
  10. static {
  11. Properties properties = new Properties();
  12. try {
  13. InputStream is = DBUtils.class
  14. .getResourceAsStream("/database.properties");
  15. properties.load(is);
  16. druidDataSource = (DruidDataSource) DruidDataSourceFactory
  17. .createDataSource(properties);
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. public static DataSource getDataSource(){
  25. return druidDataSource;
  26. }
  27. }
  1. 4)、创建数据表:book
  1. CREATE DATABASE IF NOT EXISTS `java221804`;
  2. CREATE TABLE IF NOT EXISTS book(
  3. `name` VARCHAR(20),
  4. `state` INT,
  5. `date` INT,
  6. `count` INT
  7. );

32ac4eae02304bafac7cadeb64c66b85.png

  1. 5)、编写book类,包含get/set方法、有参/无参构造、toString方法等
  1. package cn.book.entity;
  2. import java.io.Serializable;
  3. @SuppressWarnings("serial")
  4. public class Book implements Serializable {
  5. //定义属性
  6. private String name;
  7. private int state;
  8. private int date;
  9. private int count;
  10. //添加无参构造
  11. public Book() {
  12. super();
  13. }
  14. //添加有参构造
  15. public Book(String name, int state, int date, int count) {
  16. super();
  17. this.name = name;
  18. this.state = state;
  19. this.date = date;
  20. this.count = count;
  21. }
  22. //添加get/set方法
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public int getState() {
  30. return state;
  31. }
  32. public void setState(int state) {
  33. this.state = state;
  34. }
  35. public int getDate() {
  36. return date;
  37. }
  38. public void setDate(int date) {
  39. this.date = date;
  40. }
  41. public int getCount() {
  42. return count;
  43. }
  44. public void setCount(int count) {
  45. this.count = count;
  46. }
  47. @Override
  48. public String toString() {
  49. return "Book [name=" + name + ", state=" + state + ", date=" + date
  50. + ", count=" + count + "]";
  51. }
  52. }
  1. 6)、数据访问层DAO层的接口和实现类的增删改查方法的编写
  2. 7)、服务层Service层的接口和实现类的增删改查方法的编写
  3. 8)、最后完成视图层View层测试类的编写

⛳️ 开发步骤

❤️ 1、数据初始化​

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

  1. 创建 QueryRunner 对象
  2. private QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
  3. 增加图书的方法
  1. public int insert(Book book) {
  2. String sql = "insert into book(name,state,date,count) values(?,?,?,?);";
  3. Object[] args = { book.getName(), book.getState(), book.getDate(),
  4. book.getCount() };
  5. try {
  6. return queryRunner.update(sql, args);
  7. } catch (SQLException e) {
  8. e.printStackTrace();
  9. }
  10. return 0;
  11. }
  1. 更改图书信息的方法
  1. public int update(Book book) {
  2. String sql="update book set state=?,date=?,count=? where name=?; ";
  3. Object[] args={book.getState(),book.getDate(),book.getCount(),book.getName()};
  4. try {
  5. return queryRunner.update(sql, args);
  6. } catch (SQLException e) {
  7. e.printStackTrace();
  8. }
  9. return 0;
  10. }
  1. 查询全部图书的方法
  1. public List<Book> selectAll() {
  2. String sql = "SELECT * FROM book;";
  3. try {
  4. return queryRunner.query(sql, new BeanListHandler<Book>(Book.class) );
  5. } catch (SQLException e) {
  6. e.printStackTrace();
  7. }
  8. return null;
  9. }
  1. 欢迎使用迷你图书管理器方法
  2. 新增图书方法
  3. 查看图书方法
  4. 删除图书方法
  5. 借出图书方法
  6. 归还图书方法
  7. 退出图书方法
  8. 欢迎首界面:
  1. public static void useBookSystem() {
  2. // 输出欢迎菜单
  3. System.out.println("欢迎使用迷你图书管理器");
  4. System.out.println("-------------------------");
  5. System.out.println("1.新增图书");
  6. System.out.println("2.查看图书");
  7. System.out.println("3.删除图书");
  8. System.out.println("4.借出图书");
  9. System.out.println("5.归还图书");
  10. System.out.println("6.退出图书");
  11. System.out.println("-------------------------");
  12. }

⛳️ 全部代码展示

❤️ 1、Book类

  1. package cn.book.entity;
  2. import java.io.Serializable;
  3. @SuppressWarnings("serial")
  4. public class Book implements Serializable {
  5. //定义属性
  6. private String name;
  7. private int state;
  8. private int date;
  9. private int count;
  10. //添加无参构造
  11. public Book() {
  12. super();
  13. }
  14. //添加有参构造
  15. public Book(String name, int state, int date, int count) {
  16. super();
  17. this.name = name;
  18. this.state = state;
  19. this.date = date;
  20. this.count = count;
  21. }
  22. //添加get/set方法
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public int getState() {
  30. return state;
  31. }
  32. public void setState(int state) {
  33. this.state = state;
  34. }
  35. public int getDate() {
  36. return date;
  37. }
  38. public void setDate(int date) {
  39. this.date = date;
  40. }
  41. public int getCount() {
  42. return count;
  43. }
  44. public void setCount(int count) {
  45. this.count = count;
  46. }
  47. @Override
  48. public String toString() {
  49. return "Book [name=" + name + ", state=" + state + ", date=" + date
  50. + ", count=" + count + "]";
  51. }
  52. }

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

  1. package cn.book.utils;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.Properties;
  5. import javax.sql.DataSource;
  6. import com.alibaba.druid.pool.DruidDataSource;
  7. import com.alibaba.druid.pool.DruidDataSourceFactory;
  8. public class DBUtils {
  9. private static DruidDataSource druidDataSource;
  10. static {
  11. Properties properties = new Properties();
  12. try {
  13. InputStream is = DBUtils.class
  14. .getResourceAsStream("/database.properties");
  15. properties.load(is);
  16. druidDataSource = (DruidDataSource) DruidDataSourceFactory
  17. .createDataSource(properties);
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. public static DataSource getDataSource(){
  25. return druidDataSource;
  26. }
  27. }

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

  1. package cn.book.dao;
  2. import java.util.List;
  3. import cn.book.entity.Book;
  4. public interface BookDao {
  5. // 增
  6. public int insert(Book book);
  7. // 删
  8. public int delete(String name);
  9. // 改
  10. public int update(Book book);
  11. // 查一个
  12. public Book select(String name);
  13. // 查全部
  14. public List<Book> selectAll();
  15. }

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

  1. package cn.book.dao.impl;
  2. import java.sql.SQLException;
  3. import java.util.List;
  4. import org.apache.commons.dbutils.QueryRunner;
  5. import org.apache.commons.dbutils.handlers.BeanHandler;
  6. import org.apache.commons.dbutils.handlers.BeanListHandler;
  7. import cn.book.dao.BookDao;
  8. import cn.book.entity.Book;
  9. import cn.book.utils.DBUtils;
  10. public class BookDaoImpl implements BookDao {
  11. private QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
  12. @Override
  13. public int insert(Book book) {
  14. String sql = "insert into book(name,state,date,count) values(?,?,?,?);";
  15. Object[] args = { book.getName(), book.getState(), book.getDate(),
  16. book.getCount() };
  17. try {
  18. return queryRunner.update(sql, args);
  19. } catch (SQLException e) {
  20. e.printStackTrace();
  21. }
  22. return 0;
  23. }
  24. @Override
  25. public int delete(String name) {
  26. String sql="delete from book where name=?;";
  27. try {
  28. return queryRunner.update(sql, name);
  29. } catch (SQLException e) {
  30. e.printStackTrace();
  31. }
  32. return 0;
  33. }
  34. @Override
  35. public int update(Book book) {
  36. String sql="update book set state=?,date=?,count=? where name=?; ";
  37. Object[] args={book.getState(),book.getDate(),book.getCount(),book.getName()};
  38. try {
  39. return queryRunner.update(sql, args);
  40. } catch (SQLException e) {
  41. e.printStackTrace();
  42. }
  43. return 0;
  44. }
  45. @Override
  46. public Book select(String name) {
  47. String sql = "select * from book where name=?;";
  48. try {
  49. return queryRunner.query(sql,new BeanHandler<Book>(Book.class), name);
  50. } catch (SQLException e) {
  51. e.printStackTrace();
  52. }
  53. return null;
  54. }
  55. @Override
  56. public List<Book> selectAll() {
  57. String sql = "SELECT * FROM book;";
  58. try {
  59. return queryRunner.query(sql, new BeanListHandler<Book>(Book.class) );
  60. } catch (SQLException e) {
  61. e.printStackTrace();
  62. }
  63. return null;
  64. }
  65. }

❤️ 5、服务层的BookService接口

  1. package cn.book.service;
  2. import java.util.List;
  3. import cn.book.entity.Book;
  4. public interface BookService {
  5. // 增
  6. public int insertBook(Book book);
  7. // 删
  8. public int deleteBook(String name);
  9. // 改
  10. public int updateBook(Book book);
  11. // 查一个
  12. public Book selectBook(String name);
  13. // 查全部
  14. public List<Book> selectAllBooks();
  15. }

❤️ 6、服务层的BookServiceImpl类

  1. package cn.book.service.impl;
  2. import java.util.List;
  3. import cn.book.dao.impl.BookDaoImpl;
  4. import cn.book.entity.Book;
  5. import cn.book.service.BookService;
  6. public class BookServiceImpl implements BookService {
  7. BookDaoImpl bookDaoImpl = new BookDaoImpl();
  8. @Override
  9. public int insertBook(Book book) {
  10. if (bookDaoImpl.select(book.getName()) == null) {
  11. return bookDaoImpl.insert(book);
  12. }
  13. return 0;
  14. }
  15. @Override
  16. public int deleteBook(String name) {
  17. if (bookDaoImpl.select(name) != null) {
  18. return bookDaoImpl.delete(name);
  19. }
  20. return 0;
  21. }
  22. @Override
  23. public int updateBook(Book book) {
  24. if (bookDaoImpl.select(book.getName()) != null) {
  25. return bookDaoImpl.update(book);
  26. }
  27. return 0;
  28. }
  29. @Override
  30. public Book selectBook(String name) {
  31. bookDaoImpl.select(name);
  32. return null;
  33. }
  34. @Override
  35. public List<Book> selectAllBooks() {
  36. List<Book> listBooks = bookDaoImpl.selectAll();
  37. return listBooks;
  38. }
  39. }

❤️ 7、视图层BookMgr测试类

  1. package cn.book.view;
  2. import java.util.List;
  3. import java.util.Scanner;
  4. import cn.book.entity.Book;
  5. import cn.book.service.impl.BookServiceImpl;
  6. public class BookMgr {
  7. // 定义一个静态的Scanner
  8. static Scanner inputsc = new Scanner(System.in);
  9. // 是否退出系统,false代表退出系统
  10. static boolean flag = true;
  11. static int num = -1;
  12. static BookServiceImpl bookServiceImpl = new BookServiceImpl();
  13. // 欢迎使用迷你图书管理器方法
  14. public static void useBookSystem() {
  15. // 输出欢迎菜单
  16. System.out.println("欢迎使用迷你图书管理器");
  17. System.out.println("-------------------------");
  18. System.out.println("1.新增图书");
  19. System.out.println("2.查看图书");
  20. System.out.println("3.删除图书");
  21. System.out.println("4.借出图书");
  22. System.out.println("5.归还图书");
  23. System.out.println("6.退出图书");
  24. System.out.println("-------------------------");
  25. }
  26. // 新增图书方法
  27. public static void addBook() {
  28. System.out.println("-->新增图书\n");
  29. System.out.println("请输入图书名称:");
  30. String bookName = inputsc.next();
  31. Book book = new Book(bookName, 0, 0, 0);
  32. // 向数据库添加图书
  33. int num = bookServiceImpl.insertBook(book);
  34. System.out.println();
  35. if (num != 0) {
  36. System.out.println("新增《" + bookName + "》成功!");
  37. } else {
  38. System.out.println("新增《" + bookName + "》失败!");
  39. }
  40. System.out.println("*****************************************");
  41. }
  42. // 查看图书方法
  43. public static void lookBook() {
  44. System.out.println("-->查看图书\n");
  45. System.out.println("序号\t状态\t名称\t借出日期\t借出次数");
  46. // 获取数据库全部图书
  47. List<Book> books = bookServiceImpl.selectAllBooks();
  48. for (int i = 0; i < books.size(); i++) {
  49. String BookState = (books.get(i).getState() == 0) ? "可借阅" : "已借出";
  50. String dateStr = (books.get(i).getDate() == 0) ? "" : (books.get(i)
  51. .getDate() + "日");
  52. System.out.println((i + 1) + "\t" + BookState + "\t"
  53. + books.get(i).getName() + "\t" + dateStr + "\t"
  54. + books.get(i).getCount() + "次");
  55. }
  56. System.out.println("*****************************************");
  57. }
  58. // 删除图书方法
  59. public static void delBook() {
  60. System.out.println("-->删除图书\n");
  61. System.out.println("请输入要删除图书的名称:");
  62. String deleteBook = inputsc.next();
  63. // 从数据库中查找此图书
  64. Book delBook = bookServiceImpl.selectBook(deleteBook);
  65. boolean flag3 = false;
  66. // 删除的图书存在、状态处于可借阅状态
  67. if (delBook.getName() != null && deleteBook.equals(delBook.getName())
  68. && delBook.getState() == 0) {
  69. flag3 = true;
  70. int num = bookServiceImpl.deleteBook(delBook.getName());
  71. if (num != 0) {
  72. System.out.println("图书删除成功!");
  73. } else {
  74. System.out.println("图书删除失败!");
  75. }
  76. } else if (delBook.getName() != null
  77. && deleteBook.equals(delBook.getName())
  78. && delBook.getState() == 1) {
  79. flag3 = true;
  80. System.out.println("该图书已被借出,目前无法删除!");
  81. }
  82. if (!flag3) {
  83. System.out.println("没有找到匹配信息!");
  84. }
  85. System.out.println("*****************************************");
  86. }
  87. // 借出图书方法
  88. public static void lendBook() {
  89. System.out.println("-->借出图书\n");
  90. System.out.print("请输入图书名称:");
  91. String want = inputsc.next(); // 要借出的图书名称
  92. // 从数据库中查找此图书
  93. Book wantBook = bookServiceImpl.selectBook(want);
  94. if (wantBook == null) {
  95. System.out.println("没有找到匹配信息!");
  96. } else {
  97. if (want.equals(wantBook.getName()) && wantBook.getState() == 0) { // 找到匹配可借
  98. wantBook.setState(1); // 将此图书置于借出状态
  99. System.out.print("请输入借出日期:");
  100. int inputscData = inputsc.nextInt();
  101. wantBook.setDate(inputscData);
  102. while (wantBook.getDate() < 1 || wantBook.getDate() > 31) { // 当输入借出的日期不满足1-31时
  103. System.out.println("必须输入大于等于1且小于等于31的数字,请重新输入:");
  104. inputscData = inputsc.nextInt();
  105. wantBook.setDate(inputscData);
  106. }
  107. wantBook.setCount(wantBook.getCount() + 1);
  108. // 更新书本最新信息
  109. int num = bookServiceImpl.updateBook(wantBook);
  110. if (num != 0) {
  111. System.out.println("借出《" + want + "》成功!");
  112. } else {
  113. System.out.println("借出《" + want + "》失败!");
  114. }
  115. } else if (want.equals(wantBook.getName())
  116. && wantBook.getState() == 1) { // 找到匹配已被借出
  117. System.out.println("《" + want + "》已被借出!");
  118. }
  119. }
  120. System.out.println("*****************************************");
  121. }
  122. // 归还图书方法
  123. public static void returnBook() {
  124. System.out.println("-->归还图书\n");
  125. int charge = 0; // 租金
  126. System.out.print("请输入归还图书名称:");
  127. String back = inputsc.next();
  128. // 从数据库中查找此图书
  129. Book backBook = bookServiceImpl.selectBook(back);
  130. if (backBook == null) {
  131. System.out.println("没有找到匹配信息!");
  132. } else {
  133. if (back.equals(backBook.getName()) && backBook.getDate() == 1) {// 找到匹配
  134. backBook.setDate(0); // 将借阅状态修改为可借阅
  135. System.out.print("请输入归还日期:");
  136. int redate = inputsc.nextInt();
  137. while (redate < backBook.getDate() || redate > 31) { //
  138. // 归还日期不能小于借出日期,也不能大于31
  139. if (redate < backBook.getDate()) {
  140. System.out.println("归还日期不能小于借出日期,请重新输入:");
  141. } else {
  142. System.out.println("一个月只有31天,请重新输入:");
  143. }
  144. redate = inputsc.nextInt();
  145. }
  146. charge = redate - backBook.getDate();
  147. // 更新书本最新信息
  148. int num = bookServiceImpl.updateBook(backBook);
  149. if (num != 0) {
  150. System.out.println("\n归还《" + back + "》成功!");
  151. System.out.println("借出日期为:" + (backBook.getDate() + 1)
  152. + "日");
  153. System.out.println("归还日期为:" + redate + "日");
  154. System.out.println("应付租金(元):" + charge);
  155. backBook.setDate(0);
  156. } else {
  157. System.out.println("借出《" + back + "》失败!");
  158. }
  159. } else if (back.equals(backBook.getName())
  160. && backBook.getState() == 0) {// 找到匹配但没有借出
  161. System.out.println("该图书没有被借出!无法进行归还操作。");
  162. }
  163. }
  164. System.out.println("*****************************************");
  165. }
  166. // 操作
  167. public static void runTest() {
  168. // 循环操作
  169. do {
  170. // 定义一个BookMethod操作类,将操作方法定义在BookMethod类中,然后调用
  171. // 欢迎菜单方法
  172. BookMgr.useBookSystem();
  173. System.out.println("请选择:");
  174. int choose = inputsc.nextInt();
  175. switch (choose) {
  176. case 1:
  177. // 新增图书
  178. BookMgr.addBook();
  179. break;
  180. case 2:
  181. // 查看图书
  182. BookMgr.lookBook();
  183. break;
  184. case 3:
  185. // 删除图书
  186. BookMgr.delBook();
  187. break;
  188. case 4:
  189. // 借出图书
  190. BookMgr.lendBook();
  191. break;
  192. case 5:
  193. // 归还图书
  194. BookMgr.returnBook();
  195. break;
  196. case 6:
  197. // 退出图书
  198. flag = false;
  199. break;
  200. default:
  201. flag = false;
  202. break;
  203. }
  204. if (flag) {
  205. System.out.println("输入0返回:");
  206. num = inputsc.nextInt();
  207. } else {
  208. break;
  209. }
  210. } while (num == 0);
  211. System.out.println("谢谢使用!");
  212. }
  213. public static void main(String[] args) {
  214. BookMgr.runTest();
  215. }
  216. }

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

54fd8b8fdc7a4e469267623a84313921.gif​​

标签: java 数据库 jvm

本文转载自: https://blog.csdn.net/hh867308122/article/details/128108600
版权归原作者 Java Fans 所有, 如有侵权,请联系我们删除。

“Java——迷你图书管理器(JDBC+MySQL+Apache DBUtils)”的评论:

还没有评论