// 实验存档。。。

效果图:

完整程序: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控制台版图书借阅程序的更多相关文章

  1. [Java] 将标准字符流写入到文件中(通过控制台写一个html程序,并保存)

    package test.stream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...

  2. 转贴:修改springboot控制台输出的图案

    Post from:https://blog.csdn.net/WXN069/article/details/90667668 修改springboot控制台输出的图案1.在src\main\reso ...

  3. 清理忽略springboot控制台启动的banner和启动日志

    清理忽略springboot控制台启动的banner和启动日志 1.springboot的banner spring: main: banner-mode: off 2.mybatis-plus的ba ...

  4. springboot 控制台程序读取配置文件(原创)

    首先新建一个springboot项目,此处省略. 1.新建一个application.properties person.name=kevin person.age=6 person.sex=male ...

  5. 控制台手动编译Qt5程序

    转自:http://www.cnblogs.com/csulennon/p/4479236.html 在上一篇随笔中已经搭建好了Qt5的的开发环境,并且通过Qt Creator自动构建了一个视窗程序. ...

  6. .NET Core创建一个控制台(Console)程序

    .NET Core版本:1.0.0-rc2 Visual Studio版本:Microsoft Visual Studio Community 2015 Update 2 开发及运行平台:Window ...

  7. Visual Studio 2012 开发环境配置+控制台工具+桌面应用程序

    一.界面布局视图设置 1.窗口的布局.控制台窗口运行恢复到开发环境的设置方法 也可以保存好设好的个性化设置,导入设置: 2.视图|服务器资源管理器(sever explorer) 可以访问数据源.服务 ...

  8. SpringBoot系列: 极简Demo程序和Tomcat war包部署

    =================================SpringBoot 标准项目创建步骤================================= 使用 Spring IDE( ...

  9. 自定义SpringBoot控制台输出的图案

    pringboot启动的时候,控制台输出的图案叫banner banner?啥玩意儿?相信有些人,一定是一脸懵逼... ——这个就不陌生了吧,这个是我们启动springboot的时候,控制台输出的.. ...

随机推荐

  1. Java虚拟机堆和栈详细解析,以后面试再也不怕问jvm了!

    堆 Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都放在其中,并且Java堆完全是自动化管理,通过垃圾收集机制,垃圾对象会自动清理,不需自己去释放. 根据垃圾回收机制的不同,Jav ...

  2. django基础之day09,手机号校验的规则和代码编写

    通过re模块实现手机号码校验的脚本--json老师 import re 通过re模块实现手机号码校验的脚本--json老师 def mobile_validate(value): mobile_re ...

  3. 函数基础重点掌握内容:创建函数、return返回单个值、return返回多个值、函数名加括号与不加括号的区别

    ##比较两个数大小 #有参函数!!! def compare(s,t): if s > t: print(s) else: print(t) f=compare compare(1000,30) ...

  4. 初步了解JVM第二篇

    在一篇<初步了解JVM第一篇>中,我们已经了解了: 类加载器:负责加载*.class文件,将字节码内容加载到内存中.其中类加载器的类型有如下: 启动类加载器(Bootstrap) 扩展类加 ...

  5. 面试连环炮系列(十五):说说Eureka的高可用方案

    说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eurek ...

  6. Python 使用中出现错误:ImportError: No module named _sqlite3

    解决办法: 1.先安装sqlite3    从sqlite官网:https://www.sqlite.org/download.html 上下载linux环境下的安装包:sqlite-autoconf ...

  7. Maven项目使用mybatis报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    maven项目使用mybatis时,找不到mapper文件(.xml) 错误信息提示: 项目可以正常运行,但是在有请求到达服务器时(有访问数据库的请求),会出现报错!! 错误原因: mybatis没有 ...

  8. Linux之shell详解

    Shell是什么 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界 ...

  9. 为用户分配有效期程序-更新数据库的TRY使用

    REPORT ZPMRP030. TABLES:USR02. DATA: L_ERROR TYPE REF TO CX_SY_OPEN_SQL_DB, L_ERROR_TEXT TYPE STRING ...

  10. C# - VS2019 WinFrm应用程序调用WebService服务

    WinFrm应用程序调用WebService服务 关于WebService的创建.发布与部署等相关操作不再赘述,传送门如下:C# VS2019 WebService创建与发布,并部署到Windows ...