文章来源: 学习通http://www.bdgxy.com/

目录
  • 一、梳理功能
  • 二、准备数据库
  • 三、构造和数据库相关的实体类
    • 书籍
    • 用户
    • NormalUser类
  • 四、封装数据库相关操作
    • 数据库链接操作
    • 针对书籍表操作
    • 针对用户表的操作
    • 编写主逻辑(main方法和login方法)
    • 编写operation各种细节
      • 添加书籍操作
      • 借书操作
      • 删除书籍操作
      • 查看书籍列表操作
      • 退出系统操作
      • 查找书籍操作
      • 还书操作

一、梳理功能

1.能够表示书籍信息,针对每本书来说,序号,书名,作者,价格,类型。
2.能够表示用户信息,普通用户,管理员。
3.支持的操作:

  • 对于普通用户:查看书籍列表,查询指定书籍,借书还书。
  • 对于 管理员:查看书籍列表,新增删除书籍。

二、准备数据库

创建用户表和书籍表

create database if not exists java100_bookmanager;
use java100_bookmanager;
drop table if exists book;
//设置id为自增主键
create table book(id int primary  key auto_increment,name varchar(20),author varchar(20),price int,type varchar(20),isBorrowed int);

drop table if exists user;
//同样设置 userid为自增主键并且用户名字不重复
create table user(
userId int primary key auto_increment,
username varchar(20) unique,
password varchar(20),
isAdmin int
);
– 插入一些书籍
insert into book values(null,‘西游记’,‘吴承恩’,10000,‘古典小说’,0);
insert into book values(null,‘三国演义’,‘罗贯中’,10000,‘古典小说’,0);
insert into book values(null,‘水浒传’,‘施耐庵’,10000,‘古典小说’,0);
insert into book values(null,‘金瓶梅’,‘兰陵笑笑生’,10000,‘古典小说’,0);
–插入一些用户
insert into user values(null,‘admin’,‘123’,1);
insert into user values(null,‘zhangsan’,‘123’,0);

三、构造和数据库相关的实体类

书籍

public class Books {private int bookId;//书籍编号private String name;//书名private String author;//作者private int price;//价格private String type;//类型private boolean isBorrowed;//是否被借阅//set get方法
public int getBookId() {return bookId;
}public void setBookId(int bookId) {this.bookId = bookId;
}public String getName() {return name;
}public void setName(String name) {this.name = name;
}public String getAuthor() {return author;
}public void setAuthor(String author) {this.author = author;
}public int getPrice() {return price;
}public void setPrice(int price) {this.price = price;
}public String getType() {return type;
}public void setType(String type) {this.type = type;
}public boolean isBorrowed() {return isBorrowed;
}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;
}@Override
public String toString() {return "Book{" +"bookId=" + bookId +", name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", isBorrowed=" + isBorrowed +'}';
}

用户

有两种用户,一种为普通用户,另一种为管理员,管理员和普通用户看到的menu不同,管理员和普通 用户的类方法也不同
先定义一个抽象类User 让普通用户NoramlUser和管理员类Admin来继承User类

abstract public class user {private int userId;private String userName;private String passWord;
IOperation[] operations;//方法数组,表示user类所包含的方法
abstract int menu();//子类要重写menu方法,因为两个子类看到的menu不同
public void doOperation(int choice){//此方法来执行一些操作,如借书还书等operations[choice].work();
}public int getUserId() {return userId;
}public void setUserId(int userId) {this.userId = userId;
}public String getUserName() {return userName;
}public void setUserName(String userName) {this.userName = userName;
}public String getPassWord() {return passWord;
}public void setPassWord(String passWord) {this.passWord = passWord;
}@Override
public String toString() {return "user{" +"userId=" + userId +", userName='" + userName + '\'' +", passWord='" + passWord + '\'' +'}';
}

}

NormalUser类

public class NormalUser extends user{public NormalUser(){this.operations=new IOperation[]{//之后单独开辟一个包,包里存储和实现这些方法new ExitOperation(),//退出系统new DisplayOperation(),//查看书籍列表new FindOperation(),//查找书籍new BorrowOperation(),//借阅书籍new ReturnOperation(),//还书};}@Overridepublic int menu() {//重写父类menu方法System.out.println("========================");System.out.println("欢迎您,"+this.getUserName()+"!");System.out.println("1.查看书籍列表");System.out.println("2.查找指定书籍");System.out.println("3.借阅书籍");System.out.println("4.归还书籍");System.out.println("0.退出系统");System.out.println("========================");System.out.println("请输入选项");Scanner sc=new Scanner(System.in);int choice=sc.nextInt();return choice;}
}

Admin类

public class Admin extends user {public Admin(){this.operations=new IOperation[]{new ExitOperation(),//退出系统new DisplayOperation(),//查看书籍列表new FindOperation(),//查找书籍new AddOperation(),//添加书籍new DelOperation(),//删除书籍};}@Overridepublic int menu() {System.out.println("========================");System.out.println("欢迎您,"+this.getUserName()+"您是管理员!");System.out.println("1.查看书籍列表");System.out.println("2.查找指定书籍");System.out.println("3.新增书籍");System.out.println("4.删除书籍");System.out.println("0.退出系统");System.out.println("========================");System.out.println("请输入选项");Scanner sc=new Scanner(System.in);int choice=sc.nextInt();return choice;}
}

四、封装数据库相关操作

  • 1.先把数据库链接的操作封装好
  • 2.再把针对书籍表的增删查改操作封装好
  • 3.再把针对用户表的操作封装好

数据库链接操作

//在这里封装数据库的连接操作
public class DBUtil {
//设置url 账号密码 根据个人设置private static final String URL="jdbc:mysql://127.0.0.1:3306/java100_bookmanager?characterEncoding=utf8&&useSSL=false";private static final String USERNAME="root";private static final String PASSWORD="q986681563";//饿汉模式//类加载阶段就会调用静态代码块进行实例化/*private static DataSource dataSource=new MysqlDataSource();
static{((MysqlDataSource)dataSource).setUrl(URL);((MysqlDataSource)dataSource).setUser(USERNAME);((MysqlDataSource)dataSource).setPassword(PASSWORD);
}*/
//懒汉模式
//只有首次调用getDataSource方法 才会实例化
private static DataSource dataSource=null;
public static DataSource getDataSource(){if(dataSource==null){dataSource=new MysqlDataSource();((MysqlDataSource)dataSource).setUrl(URL);((MysqlDataSource)dataSource).setUser(USERNAME);((MysqlDataSource)dataSource).setPassword(PASSWORD);}return dataSource;
}
public static Connection getConnection() throws SQLException {return getDataSource().getConnection();
}
public static void close(ResultSet resultSet, PreparedStatement statement,Connection connection){//释放资源
//注释掉的方式更安全/*if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}*/try {if(resultSet!=null) resultSet.close();if(statement!=null) statement.close();if(connection!=null) connection.close();} catch (SQLException e) {e.printStackTrace();}
}

}

针对书籍表操作

//DAO Data Access Object 数据访问对象
public class BookDAO {//1.新增书籍public boolean add(Books book){Connection connection=null;PreparedStatement statement=null;try {connection= DBUtil.getConnection();String sql="insert into book values(null,?,?,?,?,?)";statement=connection.prepareStatement(sql);statement.setString(1,book.getName());statement.setString(2,book.getAuthor());statement.setInt(3,book.getPrice());statement.setString(4,book.getType());statement.setInt(5,book.isBorrowed()?1:0);int ret=statement.executeUpdate();if(ret!=1) return false;return true;} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.close(null,statement,connection);}return false;}//2.查看所有书籍public List<Books> selectAll(){List<Books> list=new ArrayList<>();Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;try {connection=DBUtil.getConnection();String sql="select*from book";statement=connection.prepareStatement(sql);resultSet=statement.executeQuery();while(resultSet.next()){Books book=new Books();book.setBookId(resultSet.getInt("id"));book.setName(resultSet.getString("name"));book.setAuthor(resultSet.getString("author"));book.setPrice(resultSet.getInt("price"));book.setType(resultSet.getString("type"));book.setBorrowed(resultSet.getInt("isBorrowed")==1);list.add(book);}} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.close(resultSet,statement,connection);}return list;}//3.根据名字找书籍public List<Books> selectByName(String name) {List<Books> list=new ArrayList<>();Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;try {connection=DBUtil.getConnection();String sql="select* from book where name=?";statement=connection.prepareStatement(sql);statement.setString(1,name);resultSet=statement.executeQuery();while(resultSet.next()){Books book=new Books();book.setBookId(resultSet.getInt("Id"));book.setName(resultSet.getString("name"));book.setAuthor(resultSet.getString("author"));book.setType(resultSet.getString("type"));book.setPrice(resultSet.getInt("price"));book.setBorrowed(resultSet.getInt("isBorrowed")==1);list.add(book);}} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.close(resultSet,statement,connection);}return list;}//4.删除书籍public boolean delete(int bookId){Connection connection=null;PreparedStatement statement=null;try {connection=DBUtil.getConnection();String sql="delete from book where id=?";statement=connection.prepareStatement(sql);statement.setInt(1,bookId);int ret=statement.executeUpdate();if(ret!=1) return false;return true;} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.close(null,statement,connection);}return false;}//5.借书public boolean borrowBook(int bookId){Connection connection=null;PreparedStatement statement=null;PreparedStatement statement2=null;ResultSet resultSet=null;try {connection=DBUtil.getConnection();String sql="select * from book where id=?";statement=connection.prepareStatement(sql);statement.setInt(1,bookId);resultSet=statement.executeQuery();if(resultSet.next()){boolean isBorrowed=(resultSet.getInt("isBorrowed")==1);if(isBorrowed){System.out.println("书已借出,无法再次借出! bookId="+bookId);return false;}}else{System.out.println("书不存在 bookId="+bookId);return false;}sql="update book set isBorrowed=1 where id=?";statement2=connection.prepareStatement(sql);statement2.setInt(1,bookId);int ret = statement2.executeUpdate();if(ret!=1) {System.out.println("借阅失败");return false;}System.out.println("借阅成功");return true;} catch (SQLException e) {e.printStackTrace();}finally {if(resultSet!=null) {try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(statement!=null) {try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(statement2!=null) {try {statement2.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}return false;}//6.归还public boolean returnBook(int bookId){Connection connection=null;PreparedStatement statement=null;PreparedStatement statement2=null;ResultSet resultSet=null;try {connection=DBUtil.getConnection();String sql="select* from book where id=?";statement=connection.prepareStatement(sql);statement.setInt(1,bookId);resultSet= statement.executeQuery();if(resultSet.next()){boolean isBorrowed=(resultSet.getInt("isBorrowed")==1);if(!isBorrowed){System.out.println("书没有被借出,不需要归还 bookId="+bookId);return false;}}else{System.out.println("没有该书! bookId="+bookId);return false;}sql="update book set isBorrowed=0 where id=?";statement2=connection.prepareStatement(sql);statement2.setInt(1,bookId);int ret = statement2.executeUpdate();if(ret!=1) return false;return true;} catch (SQLException e) {e.printStackTrace();}finally {if(resultSet!=null) {try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(statement!=null) {try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(statement2!=null) {try {statement2.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}return false;}}

针对用户表的操作

public class UserDao {//根据用户名找密码的逻辑//username是unique约束的public user selectByName(String name){Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;try {connection=DBUtil.getConnection();String sql="select* from user where username=?";statement=connection.prepareStatement(sql);statement.setString(1,name);resultSet = statement.executeQuery();if(resultSet.next()){boolean isAdmin=(resultSet.getInt("isAdmin")==1);user users=null;if(isAdmin){users=new Admin();}else users=new NormalUser();users.setPassWord(resultSet.getString("password"));users.setUserId(resultSet.getInt("userId"));users.setUserName(resultSet.getString("username"));return users;}
    } catch (SQLException e) {e.printStackTrace();}finally {DBUtil.close(resultSet,statement,connection);}return null;
}

}

编写主逻辑(main方法和login方法)

public class Main {public static void main(String[] args) {user users=login();while(true){int choice=users.menu();users.doOperation(choice);}}private static user login(){Scanner sc=new Scanner(System.in);System.out.println("请输入用户名");String name=sc.next();System.out.println("请输入密码");String password=sc.next();UserDao userDao=new UserDao();user users=userDao.selectByName(name);if(users==null){System.out.println("登陆失败!");System.exit(0);}if(!users.getPassWord().equals(password)){System.out.println("密码错误");System.exit(0);}return users;}
}

编写operation各种细节

将所有operations操作放在一个包中,定义一个接口operations,所有操作实现这个接口并重写方法
IOperation接口

public interface IOperation {void work();
}

添加书籍操作

public class AddOperation implements IOperation{@Overridepublic void work() {System.out.println("新增书籍!");Scanner sc=new Scanner(System.in);System.out.println("请输入书名");String name=sc.next();System.out.println("请输入作者");String author=sc.next();System.out.println("请输入价格");int price=sc.nextInt();System.out.println("请输入类别");String type=sc.next();Books book=new Books();book.setName(name);book.setPrice(price);book.setType(type);book.setAuthor(author);BookDAO bookDAO=new BookDAO();boolean ret=bookDAO.add(book);if(ret) System.out.println("新增成功");else System.out.println("新增失败");}
}

借书操作

public class BorrowOperation implements IOperation {@Overridepublic void work() {System.out.println("借阅书籍");System.out.println("请输入要借阅的书籍id");Scanner sc=new Scanner(System.in);int id=sc.nextInt();BookDAO bookDAO=new BookDAO();boolean ret = bookDAO.borrowBook(id);}
}

删除书籍操作

public class DelOperation implements IOperation{@Overridepublic void work() {System.out.println("删除书籍!");Scanner sc=new Scanner(System.in);System.out.println("请输入删除书籍的id");int id=sc.nextInt();BookDAO bookDAO=new BookDAO();boolean ret = bookDAO.delete(id);if(ret) System.out.println("删除成功");else System.out.println("删除失败");}
}

查看书籍列表操作

public class DisplayOperation implements IOperation {@Overridepublic void work() {System.out.println("展示所有书籍");BookDAO bookdao=new BookDAO();List<Books> list=bookdao.selectAll();for(Books book:list){System.out.println(book);}System.out.println("展示书籍完毕");}
}

退出系统操作

public class ExitOperation implements IOperation{@Overridepublic void work() {System.out.println("退出程序");System.exit(0);}
}

查找书籍操作

public class FindOperation implements IOperation{@Overridepublic void work() {System.out.println("根据名字查找书籍");System.out.println("请输入书名");Scanner sc=new Scanner(System.in);String name=sc.next();BookDAO bookDAO=new BookDAO();List<Books> books = bookDAO.selectByName(name);for(Books book:books){System.out.println(book);}System.out.println("根据名字查找书籍完毕");}
}

还书操作

public class ReturnOperation implements IOperation{@Overridepublic void work() {System.out.println("归还书籍!");System.out.println("请输入要归还的书籍的id");Scanner sc=new Scanner(System.in);int id=sc.nextInt();BookDAO bookDAO=new BookDAO();boolean ret = bookDAO.returnBook(id);if(ret){System.out.println("归还成功");}else{System.out.println("归还失败");}}
}

总结:简单的图书管理系统,通过练习掌握简单JDBC语法和API,同时可以帮助理解java中多态继承等概念。

到此这篇关于Mysql实战练习之简单图书管理系统的文章就介绍到这了,更多相关Mysql 图书管理系统内容请搜索菜鸟教程www.piaodoo.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持菜鸟教程www.piaodoo.com!

Mysql实战练习之简单图书管理系统相关推荐

  1. 一个简单图书管理系统TSGL的应用数据库

    简单图书管理系统的应用数据库 一.摘要 这个项目是学校结课要求的项目,所以采用的是SQL sever2008来完成的,并不是mysql来完成的,SQL sever2008与mysql就基础知识没有什么 ...

  2. wxpython实现简单图书管理系统

    用wxpython实现的简单图书管理系统,可以实现增加图书,删除图书,修改图书,查看图书.后台数据库为mysql数据库,采用的pymysql连接数据库.系统界面如下: 代码如下: 1.书本类代码 #a ...

  3. 图书管理系统 图书网站 图书管理 基于 PHP+MySql 开发的完整的图书管理系统

    图书管理系统 图书网站 图书管理 基于 PHP+MySql 开发的完整的图书管理系统. 主要功能模块包括: 1.管理员以及普通用户两种角色 2.登录退出模块 3.图书管理模块 4.用户管理模块 5.借 ...

  4. 利用顺序表建立简单图书管理系统

    采用线性表中的顺序储存方式,实现对书籍的增加,删除,查找,展示等基础功能. 基本知识点:顺序表的初始化,顺序表的查找,顺序表的插入以及顺序表的删除. #include <iostream> ...

  5. ASP网页制作,简单图书管理系统

    ASP网页制作,简单图书管理系统 作品文件 流程图 网站首页 管理页面 百度网盘提取 链接:https://pan.baidu.com/s/18y4y85IwLG1RXvW_8uNbFA 提取码:66 ...

  6. 二叉排序树遍历二叉树打印简单图书管理系统

    二叉排序树的实现 实验内容: 解决方案与关键代码: 解决方案: 编程生成二叉排序树 非递归二叉树遍历 先序 中序 后序 二叉树的打印 简单图书系统 二叉排序树图书管理系统 图书类 构造函数BTree ...

  7. 基于vb的mysql管理系统代码_基于VB+MySQL的简单图书管理系统

    代码片段和文件信息 属性            大小     日期    时间   名称 ----------- ---------  ---------- -----  ---- 文件        ...

  8. Python+tkinter库实现简单图书管理系统

    文章目录 前言 一.MySQL是什么? 二.Tkinter库 三.Code步骤 1.引入库 2.使用tkinter搭建系统 3.定义函数(发送消息,操作mysql数据库) 总结 前言 使用mysql数 ...

  9. python实现简单图书管理系统

    用python实现一个简单的图书管理系统 1.工具:PyCharm3.6 社区版 我创建了一个工程叫fairy,把解释器换成Pytnon3.6 创建一个pytnon file:图书管理系统.py 2. ...

  10. C#实战项目~智能图书管理系统

    智能图书管理系统 引言1.1目的 如今,学校的现代化管理下,学校的智能图书管理显得至关重要.其中图书管理内容也成为学校管理的一部分.因此,我们需要一个比较完善的智能图书管理,为用户提供可借阅的重要信息 ...

最新文章

  1. 如何生成表_SPSS简单操作 | 如何生成交叉表?
  2. idea编译工程时出现Error:java: 无效的目标发行版: 1.8
  3. Andrew NG 机器学习编程作业5 Octave
  4. (二)AS给button添加点击事件
  5. 预编译对象解决SQL注入问题
  6. qt显示rgba8888 如何改 frame_Qt开源作品17-IP地址输入控件
  7. fis3+vue+pdf.js制作预览PDF文件或其他
  8. AI(3)--- 机器学习常见的七个步骤
  9. 获取wlan0eth0联网状态
  10. Navicat Premium11连接Oracle出现ORA-28547:connection to server failed
  11. python在文本添加超链接_在Markdown中快速插入超链接的Workflow
  12. python模拟ios点击_弱弱的问下,ios的捷径可以实现模拟点击吗?
  13. 从4千/平到4.5万/平!南京房价10年血泪史 看哭所有人!
  14. 计算机课件制作总结,多媒体课件制作的学习心得
  15. 想知道如何在Mac上剪切文件吗?一定要看这篇文章!
  16. matlab井函数,用MATLAB函数解承压含水层完整井非稳定流问题
  17. 面试题:重写equals方法为什么通常会重写hashcode方法?
  18. 如何在Word中创建和打印标签
  19. PL\SQL破解版 ,带注册码,免费,不要积分,亲测
  20. React全家桶(技术栈) redux 代码

热门文章

  1. python QQ刷屏代码
  2. 最棒的Java开发企业级权限管理系统项目实战
  3. vxworks7.0SD卡驱动流程及文件系统格式化
  4. 离线CSDN网页打开跳转首页的解决方法
  5. 典型相关分析(CCA)及其python实现
  6. x265帧内预测模式RDO过程
  7. 计算机的科学导论pdf,教材计算机科学导论.PDF
  8. CodeProject.com上微软BizTalk平台技术文章集锦
  9. miui android 版本下载安装,MIUI12.2.2.0稳定版安装包
  10. Java:三角函数计算器!