实验目的
了解数据库系统、关系模型、客户-服务器模式等基本概念,掌握SQL的数据定义、数据操纵和数据查询等语句的语法;了解JDBC各种数据库驱动程序类型,熟悉JDBC提供的接口和类,掌握指定驱动类型、连接数据库、执行SQL语句、处理结果集等操作方法。
实验内容
数据库应用程序
1)首先在数据库应用程序中创建数据库Studentinfo,按照下表的结构在数据库中建立"student"表。
字段名 |Java数据类型 |宽度 |SQL数据类型
字段名 | Java数据类型 | 宽度 | SQL数据类型 |
---|---|---|---|
Name | String | 10 | Char(10) |
Sex | String | 2 | Char(2) |
Age | Int | 3 | Integer |
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课程成绩
查询软件工程成绩
查询数据库原理成绩
数据统计
统计结果包括最高分、最低分、平均分、及格数、及格率
(请根据具体实验要求进行参考)