目录
1.利用JDBC实现图书管理系统
2.通过对象封装关键数据——面向对象思想
3.java日期相关的类和方法
(1).首先把建表语句在workbench中输入如下
CREATE TABLE `books` ( `bid` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL COMMENT '书籍名称', `count` int(11) NOT NULL COMMENT '存量', `total` int(11) NOT NULL COMMENT '总量', PRIMARY KEY (`bid`), UNIQUE KEY `name_UNIQUE` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='书籍信息'; CREATE TABLE `readers` ( `rid` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, PRIMARY KEY (`rid`), UNIQUE KEY `name_UNIQUE` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='借阅者信息'; CREATE TABLE `records` ( `reid` int(11) NOT NULL AUTO_INCREMENT, `rid` int(11) NOT NULL COMMENT '谁借的', `bid` int(11) NOT NULL COMMENT '借的哪本书', `borrowed_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '借阅时间', PRIMARY KEY (`reid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='借阅记录';
(2).在idea中创建项目(代码如下所示)
需要注意的是,包的package声明与文件所在的目录保持一致
同一个package下是不需要导入的
如果害怕出错就多输出也就是写日志(DEBUG)
1.1管理员(不考虑登陆问题)
上架操作
package com.wangqi.lib; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; // utilize public class DBUtil { // 由于 MysqlDataSource 对象只需要一份,所以,一个 static 就够了 private static final DataSource dataSource; static { MysqlDataSource db = new MysqlDataSource(); db.setServerName("localhost"); db.setPort(3306); db.setUser("root"); db.setPassword("123456"); db.setDatabaseName("test2"); db.setUseSSL(false); db.setCharacterEncoding("utf-8"); db.setServerTimezone("Asia/Shanghai"); dataSource = db; } public static Connection connection() throws SQLException { return dataSource.getConnection(); } }
package com.wangqi.lib; import com.wangqi.lib.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Scanner; // 书籍上架命令 // 1. 属于管理员角色 -> 在我们当下的设计中,不考虑登录问题 // 2. 需要用户输入:1、书名 2. 本次上架的书籍数量 // 3. 实际要执行的 SQL: // select * from books where name = ?; 行数: 0 or 1 // insert into books (...) // update books set ... where bid = ?; public class PutAwayCommand { public static void main(String[] args) throws SQLException { // 1. 不存在登录 // 2. 提示用户输入本次操作的基本信息 Scanner scanner = new Scanner(System.in); System.out.print("请输入书名: "); String name = scanner.nextLine(); System.out.print("请输入本次上架的书籍数量: "); int count = scanner.nextInt(); System.out.println("DEBUG: 读取到用户输入的书名是 |" + name + "|"); System.out.println("DEBUG: 读取到用户输入的数量是 |" + count + "|"); // 3. 开始执行 SQL // 3.1 先去执行 select Integer bid = null; try (Connection c = DBUtil.connection()) { String sql = "select bid from books where name = ?"; //bid是书籍id try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setString(1, name); System.out.println("DEBUG: 执行 SQL: " + ps); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { // 说明这里返回 1 行了 bid = rs.getInt("bid"); } } } } System.out.println("DEBUG: 根据书名查询到的 bid = " + bid); // 根据 bid 是否为 null if (bid == null) { // 通过 insert 进行上架 System.out.println("DEBUG: 使用 insert 进行上架"); try (Connection c = DBUtil.connection()) { String sql = "insert into books (name, count, total) values (?, ?, ?)"; try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setString(1, name); ps.setInt(2, count); ps.setInt(3, count); System.out.println("DEBUG: 执行 SQL: " + ps); ps.executeUpdate(); } } } else { // 通过 update 进行上架 System.out.println("DEBUG: 使用 update 进行上架"); try (Connection c = DBUtil.connection()) { String sql = "update books set count = count + ?, total = total + ? where bid = ?"; try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setInt(1, count); ps.setInt(2, count); ps.setInt(3, bid); System.out.println("DEBUG: 执行 SQL: " + ps); ps.executeUpdate(); } } } System.out.println("上架成功"); } }
下架操作(和上架操作基本类似)
package com.wangqi.lib; import java.sql.SQLException; import java.util.Scanner; import javax.print.event.PrintJobEvent; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Scanner; // 下架 public class PutOffCommand { public static void main(String[] args) throws SQLException { // 1. 不需要的登录 // 2. 读取用户输入 Scanner scanner = new Scanner(System.in); System.out.print("请输入书名: "); String name = scanner.nextLine(); System.out.print("请输入本次下架的书籍数量: "); int count = scanner.nextInt(); System.out.println("DEBUG: 读取到用户输入的书名是 |" + name + "|"); System.out.println("DEBUG: 读取到用户输入的数量是 |" + count + "|"); // 3. sql // 3.1 select // 根据用户输入 和 总量的关系,决定是 delete 还是 update Integer bid = null; Integer bookCount = null; Integer total = null; try (Connection c = DBUtil.connection()) { String sql = "select bid, count, total from books where name = ?"; try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setString(1, name); System.out.println("DEBUG: 执行 SQL: " + ps); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { bid = rs.getInt("bid"); bookCount = rs.getInt("count"); total = rs.getInt("total"); } } } } System.out.println("DEBUG: 根据书名查询到的 bid = " + bid); System.out.println("DEBUG: 根据书名查询到的 bookCount = " + bookCount); System.out.println("DEBUG: 根据书名查询到的 total = " + total); if (bid == null) { System.out.println("没有此书"); return; } if (count >= total) { // delete System.out.println("DEBUG: 使用 delete 下架"); try (Connection c = DBUtil.connection()) { String sql = "delete from books where bid = ?"; try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setInt(1, bid); System.out.println("DEBUG: 执行 SQL: " + ps); ps.executeUpdate(); // } } } else { // update System.out.println("DEBUG: 使用 update 下架"); try (Connection c = DBUtil.connection()) { String sql = "update books set count = count - ?, total = total - ? where bid = ?"; // TODO: 存在一个 BUG,书籍的存量可能会出现负数 try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setInt(1, count); ps.setInt(2, count); ps.setInt(3, bid); System.out.println("DEBUG: 执行 SQL: " + ps); ps.executeUpdate(); } } } } }
1.2用户(考虑登录问题)
这里要先在workbench表中插入几行数据哦!!!
package com.wangqi.lib; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Scanner; // 借书命令 public class BorrowBookCommand { public static void main(String[] args) throws SQLException { // 1. 登录 // 1.1 证明你是你 // 1.2 权限(角色) Scanner scanner = new Scanner(System.in); System.out.print("请输入用户名: "); String username = scanner.nextLine(); // select * from readers where name = ? int currentUserRid;//当前读者的读书号 try (Connection c = DBUtil.connection()) { String sql = "select rid from readers where name = ?"; try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setString(1, username); try (ResultSet rs = ps.executeQuery()) { if (!rs.next()) { System.out.println("登录失败"); return; } currentUserRid = rs.getInt("rid");//记录当前读者的读书号 } } } System.out.println("登录成功"); System.out.print("请输入书名: "); String bookName = scanner.nextLine(); // select 书籍有没有 && count > 0 // insert records + update books int bid;//Interger 原因是没有null这一情况,错误就直接返回 ,书号 int count; //数量 try (Connection c = DBUtil.connection()) { String sql = "select bid, count from books where name = ?"; try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setString(1, bookName); try (ResultSet rs = ps.executeQuery()) { if (!rs.next()) { System.out.println("查无此书"); return; } bid = rs.getInt("bid"); //同样也是记录 count = rs.getInt("count"); if (count == 0) { System.out.println("书被借空了"); return; } } } System.out.println("借书成功"); } // 借书操作 try (Connection c = DBUtil.connection()) { String sql = "update books set count = count - 1 where bid = ?"; try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setInt(1, bid); ps.executeUpdate(); } } try (Connection c = DBUtil.connection()) { String sql = "insert into records (rid, bid) values (?, ?)"; try (PreparedStatement ps = c.prepareStatement(sql)) { ps.setInt(1, currentUserRid); ps.setInt(2, bid); ps.executeUpdate(); } } } }
通过对象封装关键数据——面向对象思想
把book、reader、record的类封装成三个类,在操作的时候生成对象调用即可
java日期相关的类和方法 (固定格式,记住即可)
Date date = new Date(); // 当前时间 System.out.println(date); DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String s = df.format(date); System.out.println(s);