MySQL——基础知识总结超详细版本做一个简易的图书馆系系统附源代码

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL——基础知识总结超详细版本做一个简易的图书馆系系统附源代码相关的知识,希望对你有一定的参考价值。

目录

题目:

要求:

设计表的参考步骤:

图书管理系统

~~~开始操作啦~~~

1、MySQL建库——library_system​

 2、在library_system库中创建三张表

3、到这里大概框架就完成啦,现在打开我们的 IDEA,与我们的数据库建立连接,注意新建一个项目,一定要使用maven哦,然后就创建相应的Java class文件就好了,见下文👇

a. 先创建DBUti (lJava class)对象,与数据库建立连接

b.  创建借阅记录(Record)对象

c.  创建借阅者(Reader)对象

d.  创建书籍(Book)对象

e.  创建上架书籍(PutAwayCommand)对象

f.  创建下架书籍(PutOffCommand)对象

g.  创建查看借阅记录(QueryAllRecords)对象

h.  创建借书(BorrowBookCommand)对象

源码地址:here  图书管理系统 简洁版


题目:

设计图书管理系统,包含学生和图书信息,且图书可以进行分类,学生可以在一个时间范围内借阅图书,并在这个时间范围内归还图书。

要求:

1. 涉及以上场景的数据库表,并建立表关系。 2. 查询某个分类下的图书借阅信息。 3. 查询在某个时间之后的图书借阅信息。 4. 查询图书借阅周期在某个时间范围内的图书借阅信息(图书借阅周期与查询时间范围有交集)。

设计表的参考步骤:

  1. 分析应用的不同角色
  2. 找出应用的场景——需求分析 (沟通很重要)
  3. 以不同角色为时间,写用户故事;谁(角色)做了哪些动作,希望得到什么结果和什么反馈——测试用例;不好的是(角色转换了,跳到实现者角度去了)
  4. 从用户故事中找出涉及到的名词(实体Entity)——事、 物;概念实体和数据实体不一定完全一致
  5. 借助E-R图,描述实体和实体之间的关系
  6. 为上一步找到的表,确定有那些字段(非主键、关系字段);为每个字段确定类型以及约束;每张表都有自己的主键(int、 nn、 ai) 、其他字段(nn),如果(uq) .
  7. 检查表设计的是否合理
    1.数据库设计表的三 
    范式——(减少数据冗余,提升查询难度)表中的每个字段从业务上是不可再分的;表中的数据和主键有直接关系;表中的数据和完整的符合主键呈现关系
    2.用户故事能否转换成SQL

图书管理系统

  1. 角色——书籍,借阅者,借阅记录
  2. 场景 -- 用户故事(功能)——借阅者:浏览书籍列表、借书、还书、查看自己的借阅记录   书籍上架人:上架书籍、下架书籍、查看借阅记录列表
  3. 实体 -- 关系  viaE-R图——书籍:书名,存量,总量     借阅记录:书籍id,借阅者id,借阅时间    借阅者:姓名
  4. 表的字段、类型、约束
  5. 检查:用SQL还原用户故事
     

~~~开始操作啦~~~

1、mysql建库——library_system

 2、在library_system库中创建三张表

CREATE TABLE `library_system`.`books` (
  `bid` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL COMMENT '书籍名称',
  `count` INT NOT NULL COMMENT '存量',
  `total` INT NOT NULL COMMENT '总量',
  PRIMARY KEY (`bid`))
COMMENT = '书籍信息';

CREATE TABLE `library_system`.`readers` (
  `rid` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL COMMENT '借阅者姓名',
  PRIMARY KEY (`rid`))
COMMENT = '借阅者信息';

CREATE TABLE `library_system`.`records` (
  `reid` INT NOT NULL AUTO_INCREMENT,
  `bid` INT NOT NULL COMMENT '借阅书籍编号',
  `rid` INT NOT NULL COMMENT '借阅者',
  `borrowed_time` DATETIME NOT NULL DEFAULT current_timestamp COMMENT '借阅时间',
  PRIMARY KEY (`reid`))
COMMENT = '借阅记录';

3、到这里大概框架就完成啦,现在打开我们的 IDEA,与我们的数据库建立连接,注意新建一个项目,一定要使用maven哦,然后就创建相应的Java class文件就好了,见下文👇

a. 先创建DBUti (lJava class)对象,与数据库建立连接

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("library_system");
        db.setUseSSL(false);
        db.setCharacterEncoding("utf-8");
        db.setServerTimezone("Asia/Shanghai");

        dataSource = db;
    

    public static Connection connection() throws SQLException 
        return dataSource.getConnection();
    

b.  创建借阅记录(Record)对象

public class Record 
    public int reid;
    public int rid;
    public int bid;
    public String borrowed_time;

    @Override
    public boolean equals(Object o) 
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Record record = (Record) o;
        return reid == record.reid;
    

    @Override
    public int hashCode() 
        return Objects.hash(reid);
    

c.  创建借阅者(Reader)对象

public class Reader 
    public int rid;
    public String name;
    public String password;

    @Override
    public boolean equals(Object o) 
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Reader reader = (Reader) o;
        return rid == reader.rid && Objects.equals(name, reader.name);
    

    @Override
    public int hashCode() 
        return Objects.hash(rid, name);
    

d.  创建书籍(Book)对象

public class Book 
    public int bid;
    public String name;
    public int count;
    public int total;

    @Override
    public boolean equals(Object o) 
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return bid == book.bid && Objects.equals(name, book.name);
    

    @Override
    public int hashCode() 
        return Objects.hash(bid, name);
    

e.  创建上架书籍(PutAwayCommand)对象

public class PutAwayCommand 
    public static void main(String[] args) throws SQLException 
        //1.不存在登录
        //2.提示用户输入本次操作的基本信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要上架的书名:");
        String name = scanner.nextLine();
        System.out.println("请输入本次要上架的书的数量:");
        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 = ?";
            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("上架成功");
    

f.  创建下架书籍(PutOffCommand)对象

public class PutOffCommand 
    public static void main(String[] args) throws SQLException 
        // 1.不需要的登录
        // 2.读取用户输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要下架的书名:");
        String name = scanner.nextLine();
        System.out.println("请输入本次下架的书籍数量:");
        int count = scanner.nextInt();

        System.out.println("DEBUG: 读取到用户输入的书名是 |" + name + "|");
        System.out.println("DEBUG: 读取到用户输入的数量是 |" + count + "|");

        // 3.sql
        // 3.1 select
        // 根据用户输入 和 总量的关系,决定是 delect 还是 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()) 
                        // Statement 和 ResultSet 还没有关闭,暂时不能执行其他的 SQL
                        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();
                
            
        
    

g.  创建查看借阅记录(QueryAllRecords)对象

public class QueryAllRecords 
    public static void main(String[] args) throws SQLException 
        try (Connection c = db.getConnection()) 
            String sql = "select reid,rid,bid,borrowed_time from records order by reid";
            try (PreparedStatement ps = c.prepareStatement(sql)) 
                try (ResultSet rs = ps.executeQuery()) 
                    while (rs.next()) 
                        int reid = rs.getInt(1);
                        int rid = rs.getInt("rid");
                        String bid = rs.getString(3);
                        String borrowed_time = rs.getString("borrowed_time");

                        System.out.printf("%d,%d,%s,%s\\n",reid,rid,bid,borrowed_time); //查询借阅记录操作
                    
                
            
        
    

h.  创建借书(BorrowBookCommand)对象

public class BorrowBookCommand 
    public static void main(String[] args) throws SQLException 
        // 1.登录
        // 1.1 证明 你是你
        // 1.2 权限(角色)
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:");
        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;
        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;
                    
                
            
        

        //借书操作
        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();
            
        
        System.out.println("借书成功");
    

源码地址:here  图书管理系统 简洁版


本小节完^_^

以上是关于MySQL——基础知识总结超详细版本做一个简易的图书馆系系统附源代码的主要内容,如果未能解决你的问题,请参考以下文章

超详细的MySQL三万字总结

MySQL 知识点总结(简易版)

史上最全MYSQL总结MySQL超详细笔记

一份超详细的MySQL高性能优化实战总结!

《基于Node.js实现简易聊天室系列之详细设计》

超详细的计算机网络基础知识总结 第五章:传输层