/*
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所示。
如图2-1所示
2.2 系统详细设计
2.2.1 运行结果的显示
2.2.2 系统执行流程
系统从程序入口主函数开始执行,首先显示主菜单,并列出所有图书信息及功能选项,输入1菜单选项后,执行对应的借书子函数,输入1菜单选项后,执行对应的借书子函数,此子函数包含查询根据书名图书信息、获得state值、获取time值的子函数;输入2菜单选项后,执行对应的归还子函数,此子函数同样包含查询根据书名图书信息、获得state值、获取time值的子函数;输入3菜单选项后,执行对应的根据书名查询图书子函数;输入4菜单选项后,执行对应的图书添加子函数;输入5菜单选项后,执行对应的图书更新子函数;输入6菜单选项后,执行对应的图书销毁子函数;输入7菜单选项后,执行对应的退出系统子函数;程序运行结束。该系统执行流程图如图2-2所示。
图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编程的理论知识上有所巩固和深化,更重要的是有了进行项目开发的动手机会,获得一笔宝贵的经验。