0
点赞
收藏
分享

微信扫一扫

Java程序设计 实验七 数据库应用

以沫的窝 2022-01-06 阅读 108

实验目的

	了解数据库系统、关系模型、客户-服务器模式等基本概念,掌握SQL的数据定义、数据操纵和数据查询等语句的语法;了解JDBC各种数据库驱动程序类型,熟悉JDBC提供的接口和类,掌握指定驱动类型、连接数据库、执行SQL语句、处理结果集等操作方法。

实验内容

数据库应用程序
1)首先在数据库应用程序中创建数据库Studentinfo,按照下表的结构在数据库中建立"student"表。
字段名 |Java数据类型 |宽度 |SQL数据类型

字段名Java数据类型宽度SQL数据类型
NameString10Char(10)
SexString2Char(2)
AgeInt3Integer

2)编写程序,a)向"student"表中填入若干数据记录;b)在"student"表中分别查询所有记录以及满足条件"age>18"的记录。c)编程创建学生成绩表,并进行数据插入、修改、删除、查询和成绩统计等操作。
注:不限定数据库类型,

package sql;
import java.sql.*;
import java.util.Scanner;
public class tt {
public static Statement statement=null;
public static String input=null;	
public static ResultSetMetaData rsm;//只用于输出列表名
public static ResultSet rs;
public static String getscore_for_studentscore="select %s(%s) from studentscore;";
public static String insert_for_studentscore="insert into studentscore values(%s,'%s',%d,%d,%d);";
public static String delete_for_studentscore="delete from studentscore where 学号='%s';";//学号统一为数字,输入时不需要''
public static String check_for_studentscore_count="select count(*) from studentscore where %s%s%s;";//要满足任意输入,所以对于姓名部分,要自带''
public static String check_for_studentscore="select * from studentscore where %s%s%s;";//要满足任意输入,所以对于姓名部分,要自带''
public static Scanner scan=new Scanner(System.in);
public static int data_Exist(String type,String symbol,String number) throws SQLException//依次为属性、符号、参数
{
	rs=statement.executeQuery(String.format(check_for_studentscore_count,type,symbol,number));
	rs.next();
	return rs.getInt(1);	
}
public static void count_Three(String labelString,String type) throws SQLException//依次为标签,类型(max、avg、min)
{
	System.out.print(labelString);
	for(int i=3;i<=5;i++)
	{
		rs=statement.executeQuery(String.format(getscore_for_studentscore,type,rsm.getColumnName(i)));
		rs.next();
		System.out.print(String.format("%9d", rs.getInt(1))+"     ");
	}
	System.out.println();
}
public static void show_columnName(int begin) throws SQLException//输出表头
{
	for (int i = begin; i <= rsm.getColumnCount(); i++) //从begin开始
	{
		System.out.print(String.format("%-10s", rsm.getColumnName(i))+"\t");
	}
	System.out.println();
}
public static void show() throws SQLException
	{
		show_columnName(1);
		int count=0;		
		while(rs.next())
		{
			for (int i = 1; i <= rsm.getColumnCount(); i++)//从1开始
				System.out.print(String.format("%-16s", rs.getString(i)));
			count++;
			System.out.println();
		}
		System.out.println("总共:"+count+"行");	
		System.out.println("----------------------");
	}
public static void main(String[] args) {
	try {
		Class.forName("com.mysql.cj.jdbc.Driver");
		Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Studentinfo?characterEncoding=UTF-8", "root", "123456");
		System.out.println("连接成功对象:"+conn);
		statement=conn.createStatement();//可以考虑设为静态
		rsm=statement.executeQuery("select * from student;").getMetaData();
		System.out.println("获取Statement对象:"+statement);
		System.out.println();
		//插入数据,此时name为主属性
		statement.execute("insert into student values('chen','女',21);");
		statement.execute("insert into student values('zhang','男',18);");
		statement.execute("insert into student values('li','女',20);");
		statement.execute("insert into student values('wang','女',18);");
		statement.execute("insert into student values('guan','男',17);");
		statement.execute("insert into student values('liu','女',17);");
		statement.execute("insert into student values('deng','女',20);");
		
		//查询所有记录
		System.out.println("student表所有记录查询如下");
		rs=statement.executeQuery("select * from student;");
		show();
		
		//查询age大于18的所有记录
		System.out.println("student表中age大于18的所有记录");
		rs=statement.executeQuery("select * from student where age>18;");
		show();
		
		//创建学生成绩表
		statement.execute("create table studentscore(学号 char(9) unique,姓名 char(20),java程序设计 int(3),软件工程 int(3),数据库原理 int(3),primary key(学号));");
		rsm=statement.executeQuery("select * from studentscore;").getMetaData();//获取表头
		System.out.println("学生成绩表已经创建成功");
		int select=1;
		while (true)
		{			
			System.out.println("请选择操作:1.插入数据、2.修改数据、3.删除数据、4.查询数据、5.成绩统计、0:自动退出");
			select=scan.nextInt();
			scan.nextLine();
			System.out.println("请按照格式输入数据,若要退出输入,输入0即可");
			switch(select)
			{
			case 1://进行插入数据的操作
			{
				while(true)
				{
					show_columnName(1);
					input=scan.nextLine();//遇到回车号才结束
					if(input.equals("0")==true)//判断是否结束
						break;
					String [] input_layer=input.split("\t",5);
					if(data_Exist(rsm.getColumnName(1),"=",input_layer[0])==1)
					{
						System.out.println("用户已经存在,请重新输入");
						continue;
					}
					statement.execute(String.format(insert_for_studentscore, input_layer[0],input_layer[1],Integer.parseInt(input_layer[2]),Integer.parseInt(input_layer[3]),Integer.parseInt(input_layer[4])));
				}
				break;
			}
			case 2://修改参数		
			{
				while(true)
				{
					System.out.println(rsm.getColumnName(1));
					input=scan.nextLine();//遇到回车号才结束
					if(input.equals("0")==true)//判断是否结束
						break;
					if(data_Exist(rsm.getColumnName(1),"=",input)==0)
					{
						System.out.println("用户不存在,请重新输入");
						continue;
					}
					rs=statement.executeQuery(String.format(check_for_studentscore, rsm.getColumnName(1),"=",input));
					show();
					System.out.println("用户存在,请输入修改数据");
					System.out.println(rsm.getColumnName(2)+"\t\t"+rsm.getColumnName(3)+"\t\t"+rsm.getColumnName(4)+"\t\t"+rsm.getColumnName(5));
					String temp=scan.nextLine();
					String [] input_layer=temp.split("\t",4);
					statement.execute(String.format(delete_for_studentscore, input));
					statement.execute(String.format(insert_for_studentscore, input,input_layer[0],Integer.parseInt(input_layer[1]),Integer.parseInt(input_layer[2]),Integer.parseInt(input_layer[3])));
				}
				break;
			}
			case 3://删除数据
			{
				while(true)
				{
					System.out.println(rsm.getColumnName(1));
					input=scan.nextLine();//遇到回车号才结束
					if(input.equals("0")==true)//判断是否结束
						break;
					if(data_Exist("学号","=",input)==0)
					{
						System.out.println("用户不存在,请重新输入");
						continue;
					}
					System.out.println("用户存在");
					rs=statement.executeQuery(String.format(check_for_studentscore, rsm.getColumnName(1),"=",input));
					show();
					statement.execute(String.format(delete_for_studentscore, input));
					System.out.println("用户已删除");
				}
				break;				
			}
			case 4://查询数据
			{
				System.out.println("请选择合适的属性序号:1.学号、2.姓名、3.java程序设计、4.软件工程、5.数据库原理");
				while(true)
				{
					System.out.println("属性\t"+"符号\t"+"数值");
					input=scan.nextLine();//遇到回车号才结束
					if(input.equals("0")==true)//判断是否结束
						break;
					String [] input_layer=input.split("\t",3);
					if(input_layer[0].equals("2"))
					{
						input_layer[2]="'"+input_layer[2]+"'";
					}
					if((Integer.parseInt(input_layer[0])<0)||(Integer.parseInt(input_layer[0])>5))
					{
						System.out.println("输入序号错误,请重新输入");
						continue;
					}
					if(data_Exist(rsm.getColumnName(Integer.parseInt(input_layer[0])),input_layer[1],input_layer[2])==0)
					{
						System.out.println("查询结果不存在,请重新输入");
						continue;
					}
					rs=statement.executeQuery(String.format(check_for_studentscore, rsm.getColumnName(Integer.parseInt(input_layer[0])),input_layer[1],input_layer[2]));
					show();
				}
				break;
			}
			case 5://统计结果
			{
				System.out.print("\t");
				show_columnName(3);
				count_Three("最低分","min");
				count_Three("最高分","max");
				count_Three("平均分", "avg");
				int total=data_Exist(rsm.getColumnName(3),">=", "0");
				double temp;
				double[] passing_rate=new double [3];
				System.out.print("及格数");
				for(int i=3;i<=5;i++)
				{
					temp=data_Exist(rsm.getColumnName(i), ">=", "60");
					System.out.print(String.format("%9.0f", temp)+"     ");
					passing_rate[i-3]=temp/total;
				}
				System.out.println();
				System.out.print("及格率");
				for(double i:passing_rate)
				{
					System.out.print(String.format("%11.2f", i)+"   ");
				}
				System.out.println("\n学生总数为:"+total);
				System.out.println("------------------------------------------");
				continue;
			}
			}
			if(select==0)
			{break;}
		}
		 System.out.println("学生成绩数据库管理程序结束");
	} 
	catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		System.out.println("找不到驱动程序类 ,加载驱动失败!");    
		e.printStackTrace();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} 
}
}
/*
sql语言生成student表
create table student
(Name Char(10),
		Sex Char(2),
		Age Integer 
		);
*/

运行参考

在"student"表中分别查询所有记录以及满足条件"age>18"的记录
在这里插入图片描述
在这里插入图片描述

数据插入(可以判断数据是否存在)
在这里插入图片描述

数据修改
先根据学号查询,判断用户是否存在,然后进行修改
在这里插入图片描述

数据删除
根据学号查询,判断用户是否存在,然后进行删除
在这里插入图片描述
在这里插入图片描述

数据查询
按照属性、符号、数值的格式输入查询要求,自动输出查询结果
查询学号
在这里插入图片描述

查询姓名
在这里插入图片描述

查询某科成绩在某一范围的学生
查询java课程成绩

		查询软件工程成绩

在这里插入图片描述

		查询数据库原理成绩

在这里插入图片描述

数据统计
统计结果包括最高分、最低分、平均分、及格数、及格率

在这里插入图片描述


(请根据具体实验要求进行参考)
举报

相关推荐

0 条评论