Java实训——图书管理系统

/*

  • 图书信息管理系统
  • 功能展示:借出,归还,根据书名查询图书,图书添加,图书更新,图书销毁,退出系统
  • 每个图书的属性:书的编号,书名,借出状态,借出时间,借出次数
    */
    关键:会连接数据库

1 、基础实训

在该次实训中,在得到进步与提高的同时遇到了各种各样的问题与困难,特别对Java语言的方法,类,面向对象的特性有了进一步的认识,也对Java程序知识有了更加完整的知识架构,以前在学习中掌握不牢固和没有掌握的地方,在实训中不懂就问,不理解就问,程序错误找不到原因就问,不耻下问,很好的进行了查漏补缺,不断解决给各种难题,提升自己。

1.1 、实训内容
跟紧老师的教课安排,按老师的步骤一步一步的学习,不掉队,不拖欠,认真做好每一步的学习。串讲Java基础知识,了解数据库,学习eclipse连接数据库,学习程序开发并独立开发一个小项目。强化对Java语言的了解和使用,熟练编写基础题型的代码,学会使用Java语言设计开发程序。

1.2 、问题整理及解决
问题:
1、如何使用数据库:打开数据库,新建数据库,新建表,新建查询。
2、数据库的增删改查(insert,delete,update,select)。
3、eclipse连接数据库。
4、eclipse输入时Int型后变为String型,会出现程序跳跃,需要转换(用scan.nextLine();转换)。

解决:
1、请教老师。
2、询问同学。
3、网上查询。
4、翻看书本。

2 项目开发—图书信息管理系统的设计与实现

2.1 总体功能描述
该图书信息管理系统主要实现的功能有1、借出,2、归还,3、根据书名查询图书,4、图书添加,5、图书更新,6、图书销毁,7、退出系统…。其系统功能模块图如图2-1所示。

Java实训——图书管理系统_第1张图片

如图2-1所示

2.2 系统详细设计

2.2.1 运行结果的显示

Java实训——图书管理系统_第2张图片

Java实训——图书管理系统_第3张图片

在这里插入图片描述
2.2.2 系统执行流程
系统从程序入口主函数开始执行,首先显示主菜单,并列出所有图书信息及功能选项,输入1菜单选项后,执行对应的借书子函数,输入1菜单选项后,执行对应的借书子函数,此子函数包含查询根据书名图书信息、获得state值、获取time值的子函数;输入2菜单选项后,执行对应的归还子函数,此子函数同样包含查询根据书名图书信息、获得state值、获取time值的子函数;输入3菜单选项后,执行对应的根据书名查询图书子函数;输入4菜单选项后,执行对应的图书添加子函数;输入5菜单选项后,执行对应的图书更新子函数;输入6菜单选项后,执行对应的图书销毁子函数;输入7菜单选项后,执行对应的退出系统子函数;程序运行结束。该系统执行流程图如图2-2所示。

Java实训——图书管理系统_第4张图片

图2-2 系统执行流程图

2.3 系统功能与实现
该系统程序主要用到数据库储存图书信息,连接数据库,向数据库里添加各个对象的数据信息,通过增删改查四种sql语句寻找我们所需要的信息,通过条件语句(switch)判断所要执行的功能……

2.3.1数据库处理以及功能和调用数据库的实现

package com.zhiyou100;
//建一个飞机类
/*
 * 1、类中属性私有化
 * 2、生成get和set方法
 * 3、生成toString方法
 * 
 */
public class Plane {
	/*1、 四个字段-->(在类里边叫)属性-->(一般成员都要)私有化
	-->对类中属性进行保护-->private(私有的)-->类中属性私
	有化只能在当前类中使用 。
	在程序中,类与类关联性是非常高的。
	需要通过set和get方法对外开放当前类中的属性*/
	private int id;//编号
	private String number;//航班号
	private String address;//目的地
	private String date;//日期
	/*2、快速生成get和set方法   快捷键--> alt+shif+s然后找
     Generate Getters and Setters 单击,
	 然后四个全勾*/
	public int getId() {
		return id;
	}
	
   	public void setId(int id) {
		this.id = id;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}
	/*3、生成toString方法,打印对象中属性值的时候,必须
	toString   快捷键--> alt+shif+s然后找
     Generate toString ,然后第一个全勾*/
	@Override
	public String toString() {
		return "Plane [id=" + id + ", number=" + number + ", address=" + address + ", date=" + date + "]";
	}
}

package com.zhiyou100;
import java.util.*;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

//程序入口
public class TestBook {
	static int i;
	static java.sql.Connection con = null;//连接
	static PreparedStatement ps = null;//sql模板
	static ResultSet rs = null;//结果集
	public static void main(String[] args) throws Exception {
		System.out.println("********************欢迎使用图书信息管理系统********************");	
		listMessage();
		show();
		Scanner scan = new Scanner(System.in);
		while(true){
			//系统提示数字
			int inputNum = scan.nextInt();
			scan.nextLine();
			switch(inputNum){
			case 1:
				System.out.println("请输入书名:");
				String name01 = scan.nextLine();
				borrwBook(name01);
				break;
			case 2:
				System.out.println("请输入书名:");
				String name02 = scan.nextLine();
				backBook(name02);
				break;
			case 3:
				System.out.println("请输入书名:");
				String name03 = scan.nextLine();
				selectBook(name03, true);//情形3根据书名查询图书
				break;
			case 4:
				System.out.println("添加图书的编号");
				String num = scan.nextLine();
				System.out.println("添加图书的书名:");
				String name04 = scan.nextLine();
				System.out.println("添加图书的状态:");
				int state = scan.nextInt();
				//程序跳跃  原因是因为用Scanner类,首先输入数值,再输入字符串出现异常
				//转换   在控制台从数字往字符串
				scan.nextLine();
				System.out.println("添加图书的借出时间:");
				String date = scan.nextLine();
				System.out.println("添加图书的借出次数:");
				int time = scan.nextInt();
				insertBook(num, name04, state,date,time);//4、情形4图书添加
				break;
			case 5:
				System.out.println("更新图书的状态:");
				int state03 = scan.nextInt();
				System.out.println("更新图书的借出次数:");
				int time03 = scan.nextInt();
				  scan.nextLine();
				System.out.println("更新图书的名字:");
				String name05 = scan.nextLine();
				updateBook(state03, time03, name05);
				System.out.println("更新成功!");//情形5更新图书
				break;
			case 6:
				System.out.println("销毁图书的书名:");
				String name06 = scan.nextLine();
				deleteBook(name06);//6、情形6销毁图书
				break;
			default:
				scan.close();
				exit();	
				break;
			}
			show();
		}
	}
	//注册驱动,获取连接
	public static java.sql.Connection getCon() throws Exception{
		//1、注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2、获取连接
		con = DriverManager.getConnection("jdbc:mysql://localhost:3306/school","root","");
		return  con;
	}

	//显示图书管理信息系统主菜单
	public static void show(){
		System.out.println("请选择操作:(1.借书,2.还书,3.根据书名查询图书,4.图书添加,5.图书更新,6.图书销毁,7.退出系统):");
	}
	//列出所有图书信息
	public static void listMessage() throws Exception{
		//1、2注册驱动,获取连接
		getCon();
		//3、准备sql语句
		String sql = "select * from book";
		//4、准备sql执行模板
		ps = con.prepareStatement(sql);
		//5、执行sql语句获取查询结果指
		rs = ps.executeQuery();
		//6、展示数据   迭代
		System.out.println("序号"+"\t"+"编号"+"\t"+"书名"+"\t"+"状态"+"\t"+"借书时间"+"\t"+"借书次数");
		int index= 1;
		while(rs.next()){
			String name = rs.getString("name");
			String num = rs.getString("num");
			String state= rs.getString("state");
			String date = rs.getString("date");
			int time = rs.getInt("time");
			if(date == null){
				System.out.println(index+"\t"+num+"\t"+name+"\t"+state+"\t"+date+"\t        "+time);
			}
			else{
				System.out.println(index+"\t"+num+"\t"+name+"\t"+state+"\t"+date+"\t"+time);	
			}
			index++;
		}
		rs.close();
		ps.close();
		con.close();
		}
	//查询图书返回state值
	public static int stateBook(String name) throws Exception{
		//1、2、注册驱动,获取连接
		getCon();
		//3、准备sql语句
		String sql = "select * from book where name = ?";
		//4、准备sql执行模板
		ps = con.prepareStatement(sql);
		//5、执行sql语句获取查询结果指
		ps.setString(1, name);
		rs = ps.executeQuery();
		int state = 1;
		while(rs.next()){
			state=rs.getInt("state");
		}
		return state;
	}
	//返回借出次数
	public static int timeBook(String name) throws Exception{
		//1、2、注册驱动,获取连接
		getCon();
		//3、准备sql语句
		String sql = "select * from book where name = ?";
		//4、准备sql执行模板
		ps = con.prepareStatement(sql);
		//5、执行sql语句获取查询结果指
		ps.setString(1, name);
		rs = ps.executeQuery();
		rs.next();
		int time = rs.getInt("time");
		return time;
	}
	//state为0是未借出,1时借出
	//1、借书
	public static void borrwBook(String name) throws Exception{
		//1.1从图书馆查询根据图书吗查询是否存在
		boolean isBor = selectBook(name, false);
		//true 有,false 没有
		if(isBor){
			int time;
			int state = stateBook(name);
			if(state == 0){
				System.out.println("可借,恭喜借书成功!");
				state = 1;
				time = timeBook(name);
				time++;
				i=time;
				updateBook(state,i,name);
			}
			else{
				System.out.println("已借");
			}
		}
		else{
			System.out.println("图书馆没有此书!");
		}
	}
	//2、归还
	public static void backBook(String name) throws Exception{
		
		//true 有,false 没有
		if(selectBook(name, false)){
			int state;
			state = stateBook(name);
			if(state == 0){
				System.out.println("此书未借出,不用归还!");
			}
			else if(state == 1){	
				System.out.println("归还成功!");
				state--;
				updateBook(state,i,name);
			}
		}
	}
	//3、根据书名查询图书   
   //printFlag(1)输出数据库信息(2)统计数据库信息条数(3)如果flag为真,打印信息;如果flag为假,就只统计个数
	public static boolean selectBook(String name, boolean printFlag) throws Exception{
		//1、2、注册驱动,获取连接
		getCon();
		//3、准备sql语句
		String sql = "select * from book where name = ?";
		//4、准备sql执行模板
		ps = con.prepareStatement(sql);
		//5、执行sql语句获取查询结果指
		ps.setString(1, name);
		rs = ps.executeQuery();
		//6、打印表头,迭代输出
		if (printFlag) System.out.println("序号"+"\t"+"编号"+"\t"+"书名"+"\t"+"状态"+"\t"+"借书时间"+"\t"+"借书次数");
		int index = 0;//序号
		while(rs.next()){
			if (printFlag) {
				//依次获取字段值
				int num = rs.getInt("num");
				int state = rs.getInt("state");
				String date = rs.getString("date");
				String time = rs.getString("time");
				System.out.println(index+"\t"+num+"\t"+name+"\t"+state+"\t"+date+"\t"+time);
			}
			index++;
		}
		if (index == 0) {
			//System.out.println("图书馆没有此书!");
			ps.close();
			con.close();
			return false;//查询结束
		}
		rs.close();
		ps.close();
		con.close();
		return true;
	}
	//4、图书添加
	public static void insertBook(String num,String name,int state,String date,int time) throws Exception{
		//1、2、注册驱动,获取连接
		getCon();
		//3、准备sql语句
		String sql = "insert into book values(null,?,?,?,?,?)";
		//4、准备sql模板
		ps = con.prepareStatement(sql);
		//5、替换?,执行sql模板
		ps.setString(1,num);
		ps.setString(2,name);
		ps.setInt(3,state);
		ps.setString(4, date);
		ps.setInt(5,time);
		ps.executeUpdate();	
		//6、关闭连接
		ps.close();
		con.close();
		System.out.println("添加完成!");
	}
	//5、图书更新  借出状态和次数
	public static void updateBook(int state,int time,String name) throws Exception{
		//1、2、注册驱动,获取连接
		getCon();
		//3、准备sql语句
		String sql = "update book set state = ?,time = ? where name = ?";
		//4、准备sql执行模板
		ps = con.prepareStatement(sql);
		//5、替换?,执行sql语句获取查询结果指
		ps.setInt(1, state);
		ps.setInt(2, time);
		ps.setString(3, name);
		ps.executeUpdate();	
		//6、关闭连接
		ps.close();
		con.close();	
	}
	
	//6、图书销毁  根据书名和编号销毁
	public static void deleteBook(String name) throws Exception{
		//1、2、注册驱动获取链接
		getCon();
		//3、准备sql语句
		String sql = "delete from book where name = ?";
		//4、准备sql执行模板
		ps = con.prepareStatement(sql);
		//5、执行sql语句
		ps.setString(1, name);
		ps.executeUpdate();
		//6、关闭连接
		ps.close();
		con.close();
		System.out.println("删除成功!");
		
	}
	//7、退出系统
	public static void exit(){
		System.out.println("欢迎下次光临!");
		System.exit(0);
	}
	
}

3 实训总结
这次是实训,虽然只有短短一周时间,但是总提上收获很大,认识到了自己的许多不足,知识学的不精细,掌握不熟练。我对Java的基础知识有了进一步的更清晰的到之前没有了解过的知识:(一)学会用数据库,知道数据库的增删改查语句,(增:insert into 表格名 values(null,?,?,?,?,?);删:delete from 表格名 where 字段名 = 字段的值;改:update 表格名 set 修改的字段名 = 修改后的字段值 where 修改的某条数据;查:select * from 表格名 where 字段名 = 字段的值;其中查多项内容用”and”连接,或者用”or”;聚合函数:查个数用”count();”,平均数”avg()”等等。(二)学会如何将数据库连接到eclipse上。有六个步骤:(1)注册驱动(2)获取连接(与Myssql数据库的连接)(3)准备sql语句(4)准备sql执行模板(5)执行sql语句获取查询结果(6)关闭数据库连接。(三)学会如何添加jar.包。对eclipse的各项功能有更详细的了解,更加方便编程。(四)可以独立完成一个小的开发项目。(五)printFlag函数。输出数据库信息或统计数据库信息条数,如果flag为真,打印信息;如果flag为假统计个数。(六)学会了遍历:while(rs.next()){ }。(七)学习了随机类Random ran = new Random(System.in);double a=ran.nextDouble();s随机0到1小数;int b = ran.nextInt;(10);随机0到10的整数左开有闭。(八)学习到一些新的小技巧,如:System.out.println();缩写为“syso”;在eclipse中单词字体为红色的都为关键词。通过这次实训,我不仅在Java编程的理论知识上有所巩固和深化,更重要的是有了进行项目开发的动手机会,获得一笔宝贵的经验。

你可能感兴趣的:(Java实训——图书管理系统)