SpringBoot控制台版图书借阅程序
// 实验存档。。。
效果图:
完整程序:https://pan.baidu.com/s/1-d1J90dkEtM0WKkABu0K0Q
提取码:hcnm
DAO层代码由MyBatis Generator生成,仅补充若干自定义代码。主要的代码只有下面这个:
package com.book; import com.book.dao.BookMapper;
import com.book.dao.StudentMapper;
import com.book.dao.lendingRecordMapper;
import com.book.model.Book;
import com.book.model.Student;
import com.book.model.lendingRecord;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.Transactional; import java.util.List;
import java.util.Scanner; @SpringBootApplication
@MapperScan("com.book.dao")
public class MyApplication implements CommandLineRunner { @Autowired
private BookMapper bookMapper; @Autowired
private StudentMapper studentMapper; @Autowired
private lendingRecordMapper lendingRecordMapper; public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
} @Override
public void run(String... strings) throws Exception {
serve();
} private void serve() {
Scanner scan = new Scanner(System.in);
int command;
while (true) {
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、退出程序");
command = scan.nextInt();
if (command == 1) {
System.out.println("请问你下一步要干嘛?");
System.out.println("1、增书");
System.out.println("2、改书");
System.out.println("3、删书");
System.out.println("4、查书");
System.out.println("5、浏览书");
command = scan.nextInt();
if (command == 1) {
System.out.println("1、请你依次输入书的书名、作者、出版社、ISBN号、数量");
System.out.println("注意一行一个:");
scan.nextLine();
String name = scan.nextLine();
System.out.println("书名" + name + "已录入。");
String author = scan.nextLine();
String press = scan.nextLine();
String isbn = scan.nextLine();
int num = scan.nextInt();
Book book = new Book(name, author, press, isbn, num);
bookMapper.insert(book);
System.out.println(book + "已录入!!!");
} else if (command == 2) {
System.out.println("想改书?请填入书的id以及欲改字段");
System.out.print("书的id:");
long id = scan.nextLong();
System.out.print("书名:");
String name = scan.next();
System.out.print("作者:");
String author = scan.next();
System.out.print("出版社:");
String press = scan.next();
System.out.print("isbn:");
String isbn = scan.next();
System.out.print("数量:");
int num = scan.nextInt();
Book book = new Book(name, author, press, isbn, num);
book.setId(id);
System.out.println(book + "修改成功!!!");
// bookMapper.updateByPrimaryKeySelective();
} else if (command == 3) {
System.out.println("你想删书?请直接输入书的id:");
long id = scan.nextLong();
System.out.println("恭喜你,删除成功!!!");
} else if (command == 4) {
System.out.println("你想查书?请直接输入书的id:");
long id = scan.nextLong();
Book book = bookMapper.selectByPrimaryKey(id);
if (book == null) {
System.out.println("不好意思没有这本书");
} else {
System.out.println("找到这本书了,信息如下:");
System.out.println(book);
}
} else if (command == 5) {
List<Book> list = bookMapper.selectAll();
for (Book x : list) {
System.out.println(x);
}
}
} else if (command == 2) {
System.out.println("请问你下一步要干嘛?");
System.out.println("1、增用户");
System.out.println("2、改用户");
System.out.println("3、删用户");
System.out.println("4、查用户");
System.out.println("5、浏览用户");
command = scan.nextInt();
if (command == 1) {
System.out.println("1、请你依次输入用户的身份证号码、姓名、出生年月、性别");
System.out.println("注意一行一个:");
scan.nextLine();
String idCard = scan.nextLine();
System.out.println("idCard" + idCard + "已录入。");
String name = scan.nextLine();
String birth = scan.nextLine();
String sex = scan.nextLine();
Student student = new Student(name, sex, idCard, birth);
studentMapper.insert(student);
System.out.println(student + "已录入!!!");
} else if (command == 2) {
System.out.println("想改用户?请填入用户的id以及欲改字段");
System.out.print("用户的id:");
long id = scan.nextLong();
System.out.print("身份证号码:");
String idCard = scan.next();
System.out.print("姓名:");
String name = scan.next();
System.out.print("性别:");
String sex = scan.next();
System.out.print("出生年月:");
String birth = scan.next();
Student student = new Student(name, sex, idCard, birth);
student.setId(id);
System.out.println(student + "修改成功!!!");
// bookMapper.updateByPrimaryKeySelective();
} else if (command == 3) {
System.out.println("你想删用户?请直接输入用户的id:");
long id = scan.nextLong();
System.out.println("恭喜你,删除成功!!!");
} else if (command == 4) {
System.out.println("你想查用户?请直接输入用户的id:");
long id = scan.nextLong();
Student student = studentMapper.selectByPrimaryKey(id);
if (student == null) {
System.out.println("不好意思没有这个用户");
} else {
System.out.println("找到这个用户了,信息如下:");
System.out.println(student);
}
} else if (command == 5) {
List<Student> list = studentMapper.selectAll();
for (Student x : list) {
System.out.println(x);
}
}
} else if (command == 3) {
System.out.print("读者id:");
Long uid = scan.nextLong();
System.out.print("书的id:");
Long bookId = scan.nextLong();
System.out.print("借书本数:");
int num = scan.nextInt();
borrowBooks(uid, bookId, num);
} else if (command == 4) {
System.out.print("读者id:");
Long uid = scan.nextLong();
System.out.print("书的id:");
Long bookId = scan.nextLong();
returnBooks(uid, bookId);
} else if (command == 5) {
break;
}
}
} @Transactional
private void borrowBooks(Long uid, Long bookId, int num) {
Student student = studentMapper.selectByPrimaryKey(uid);
if (student == null) {
System.out.println("读者身份有错!!!请检查一遍再重新输入");
return;
}
Book book = bookMapper.selectByPrimaryKey(bookId);
if (book == null || book.getNum() < num) {
System.out.println("书籍不存在或者数量不够!!!");
return;
}
book.setNum(book.getNum() - num);
bookMapper.updateByPrimaryKey(book);
System.out.println("书籍数量已更新");
lendingRecord record = lendingRecordMapper.selectByUidAndBookId(uid, bookId);
if (record != null) {
// 如果借过同类的书,那就更新记录
record.setNum(record.getNum() + num);
lendingRecordMapper.updateByPrimaryKey(record);
} else {
// 如果没有,创建新记录
record = new lendingRecord(uid, bookId, num);
lendingRecordMapper.insert(record);
}
System.out.println("恭喜你!借书成功!");
} @Transactional
private void returnBooks(Long uid, Long bookId) {
// 可能出现Expected one result (or null) to be returned by selectOne(), but found: 2
// 需要保证数据干净
lendingRecord record = lendingRecordMapper.selectByUidAndBookId(uid, bookId);
if (record == null) {
System.out.println("不好意思,查不到该条借书记录~");
} else {
// 增加库存
Book book = bookMapper.selectByPrimaryKey(bookId);
book.setNum(book.getNum() + record.getNum());
bookMapper.updateByPrimaryKey(book);
// 删除记录
lendingRecordMapper.deleteByPrimaryKey(record.getId());
System.out.println("恭喜你,还书成功~~~");
System.out.println("^o^");
}
}
}
SpringBoot控制台版图书借阅程序的更多相关文章
- [Java] 将标准字符流写入到文件中(通过控制台写一个html程序,并保存)
package test.stream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...
- 转贴:修改springboot控制台输出的图案
Post from:https://blog.csdn.net/WXN069/article/details/90667668 修改springboot控制台输出的图案1.在src\main\reso ...
- 清理忽略springboot控制台启动的banner和启动日志
清理忽略springboot控制台启动的banner和启动日志 1.springboot的banner spring: main: banner-mode: off 2.mybatis-plus的ba ...
- springboot 控制台程序读取配置文件(原创)
首先新建一个springboot项目,此处省略. 1.新建一个application.properties person.name=kevin person.age=6 person.sex=male ...
- 控制台手动编译Qt5程序
转自:http://www.cnblogs.com/csulennon/p/4479236.html 在上一篇随笔中已经搭建好了Qt5的的开发环境,并且通过Qt Creator自动构建了一个视窗程序. ...
- .NET Core创建一个控制台(Console)程序
.NET Core版本:1.0.0-rc2 Visual Studio版本:Microsoft Visual Studio Community 2015 Update 2 开发及运行平台:Window ...
- Visual Studio 2012 开发环境配置+控制台工具+桌面应用程序
一.界面布局视图设置 1.窗口的布局.控制台窗口运行恢复到开发环境的设置方法 也可以保存好设好的个性化设置,导入设置: 2.视图|服务器资源管理器(sever explorer) 可以访问数据源.服务 ...
- SpringBoot系列: 极简Demo程序和Tomcat war包部署
=================================SpringBoot 标准项目创建步骤================================= 使用 Spring IDE( ...
- 自定义SpringBoot控制台输出的图案
pringboot启动的时候,控制台输出的图案叫banner banner?啥玩意儿?相信有些人,一定是一脸懵逼... ——这个就不陌生了吧,这个是我们启动springboot的时候,控制台输出的.. ...
随机推荐
- 【设计模式】代理模式-Proxy
转载:https://www.cnblogs.com/yangchongxing/p/7654725.html 代理模式定义如下: Provide a surrogate or placeholder ...
- Mybatis sql map 小于号配置
Mybatis SQL map配置中出现小于号转义时,通过<![CDATA[查询条件]]>解决. EXCEMPLE: <select id="getComments&quo ...
- c++ const问题小记
int* a = new int; const int* b = a; const int* a = new int; int* b = (int*)a; const int m = 10; int ...
- 使用Portainer集中管理多地域内网运行的Docker实例
1. 单机运行的Docker 容器化部署是现在进行时,开源应用大多数支持容器化部署 在少量机器的场景下往往采用docker cli 和 docker-compose管理,进行"单机式管理&q ...
- QQ音乐接口api,包括付费音乐、无损音乐、高品质音乐地址解析接口api
QQ音乐网站所有音乐(包括付费.无损等版权音乐解析接口地址url). mp3 普通高品 http://dl.stream.qqmusic.qq.com/M5000012gqVh4fFvVK.mp3?v ...
- 初学者接金币游戏C#+unity
- 原生js复制粘贴上传图片前后台代码,兼容firebox,chrome, ie11,亲测有效
需求:粘贴上传图片,截图工具,右键粘贴,或者ctrl+v粘贴 方法1:可直接套用富文本框的图片上传功能,完成复制粘贴 缺点:麻烦,样式难控制 方法2:用原生js完成,以下案例基于此,样式请自己动手调整 ...
- 利用Python多线程来测试并发漏洞
需求介绍 有时候想看看Web应用在代码或者数据库层有没有加锁,比如在一些支付.兑换类的场景,通过多线程并发访问的测试方式可以得到一个结论. 步骤 1. Burp Suite安装插件 安装一个Copy ...
- 创建mysql索引的方式
创建索引方式: 1.create index 索引名 on 表名 (字段) 2.alter table 表 add index 索引名 (字段) -- 普通索引 alter table 表名 ...
- typeORM 多对多关系不同情况的处理
本文以RBAC权限管理中的用户和角色举例,两个实体存在多对多的关系,一个用户拥有多个角色,一个角色属于多个用户.typeorm的中文文档没有对自定义中间表的说明,发现英文有相关说明,但示例代码貌似有问 ...