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的时候,控制台输出的.. ...
随机推荐
- OSU!
OSU! 首先,由题可知,本题是个期望题,根据期望的套路,定义f[x]为x前的答案,所以最终答案就是f[n] f[x]表示前x期望答案,即每一段的长度立方和的期望(一定要清楚) 但是三次方不好算,由于 ...
- 常见的web安全问题总结
we安全对于web前端从事人员也是一个特别重要的一个知识点,也是面试的时候,面试官经常问的安全前端问题.掌握一些web安全知识,提供安全防范意识,今天就会从几个方面说起前端web攻击和防御的常用手段 ...
- Python中最简单快捷的输出方式
格式化输出最简单的方式之哑巴填充公式 name=ludundun age=25 print(f'hello {name},your age is {age}') 输出内容: hello ludundu ...
- HttpRunner学习7--引用CSV文件数据
前言 在之前的文章中,我们已经学习了 parameters 参数化,是在测试脚本中直接指定参数列表.这种方法简单易用,但如果我们的参数列表数据比较多,这种方法可能就不太适合了. 当数据量比较大的时候, ...
- .NET Core的JWT认证的学习
今天学习下JWT,遇到了两个坑爹问题,这里记录下.在 ASP.NET Core 中,授权的设置方式有两种,可以使用角色,也可以使用策略,这里也将简单举例角色.策略的使用. JWT这里不做介绍,如果想了 ...
- WPF布局容器
1.StackPanel:堆栈面板,通过Orientation属性设置子元素的布局排列方向为“Vertical”(垂直)和“Horizontal”(水平),不写其默认值为“Vertical”,当设置为 ...
- Navicat Premium从远程Mysql数据库复制到本地数据库的方法
之前做在本地测试总是先去现在下一份数据库的sql,然后再在本地建一个相同的,导入sql.然后觉得有点麻烦,现在发现了一个直接远程直接复制一份到本地的方法 工具:Navicat Premium 1.先连 ...
- PMBOK 指南 第二章 项目运行环境
2.1概述 事业环境因素(EEF)源于项目外部(往往企业外部) 组织过程资产(OPA)源于企业内部 2.2 事业环境因素 项目团队不能控制 2.2.1 组织内部的事业环境因素 组织文化.结构和治理 设 ...
- AVProVideo 在android 真机使用经验分享
AVProVideo 在 android 方面 如果想使用必须进行合理的设置:如图 发布的时候设置: 如果想使用代码替换播放视频: 第一步:设置 PlatformOptionsAndroid.ove ...
- 亚马逊写作文档tip
亚马逊的文档要求任何一份开会备忘录/要点备忘录都需要控制在4页左右,Jeff 自己也强调过,4页的备忘录比20页的备忘录要求的更高,它不仅需要更好的思考,也需要对开会讨论各个重点之间关系的理解.ppt ...