目 录
一、实验目的及要求
1.实验目的
1)清楚JDBC的相关概念。
2)掌握使用Java提供的JDBC技术连接数据库。
3)对数据库进行相关的一系列操作。
2.实验要求
1)使用JDBC提供的API操作数据库。
2)对在配置数据库和连接数据库的过程中出现的问题进行分析并总结,比如驱动的复制和加载。
3)确定调试的步骤和测试的方法。
4)成功连接数据库并对数据库进行相关的操作。
5)上机过程中要遵守实验室的各项规章制度,爱护实验设备,保持环境卫生。
6)本课程的实验过程中,不得进行游戏、上网等操作。
二、实验环境
1.硬件要求:笔记本电脑一台。
2.软件要求:Windows操作系统,使用Java语言,使用Eclipse集成开发环境。
三、实验内容
1.实验方案
打开Java集成开发环境Eclipse进行操作,根据课本和老师在课堂中讲解的内容,在实验环境中,复制连接数据库相关的jar文件到指定的目录下,配置系统环境变量,配置本地数据库和网络数据库,编写Java应用程序实现连接本地数据库和网络数据库的功能,可以对数据库进行一些简单的数据访问操作,比如数据查询等操作,实现相应的功能,看是否与预期效果一样并完成实验报告。
2.实验步骤
1)打开Eclipse集成开发环境,建立一个包(Java数据库连接)。
2)建立bin文件夹并导入连接数据库的文件jar。
3)建立一个主类Students,通过主类连接数据库。
4)使用Java语句在数据库中建立数据表。
5)使用Java语句对数据表进行显示打印、更新数据、插入数据、查找数据、删除数据、新建数据表等操作。
6)完成相关功能的检测并完成实验报告的书写及提交。
3.设计思路
1)通过在主类Students内设置switch-case语句进行对数据库的功能操作选择。
2)导入连接数据库的文件jar并使用Java语言连接数据库。
3)使用Java语句对数据表进行显示、更新、插入、查找、删除、新建表等操作。
4)使用SQL语言完成相关数据的创建和输入输出。
5)运行主类King类实现在窗口输入并输出。
四、实验结果与分析
1.在官网上下载MySQL的压缩包,并将压缩包解压到本地文件夹,解压后的文件夹目录内容如图4-1:
图4-1 MySQL压缩包解压内容
2.打开高级系统设置后打开环境配置对MySQL数据库进行环境配置,环境配置显示如图4-2:
图4-2 环境配置窗口
3.以管理员身份打开命令行提示符,进行数据库文件及内容的连接操作,并通过语句修改数据库密码,并成功连接服务,命令行提示符窗口如图4-3:
图4-3 命令行提示符窗口
4.打开Eclipse集成开发环境,先导入建立数据库联系的连接文件,然后建立包以及所需要的类文件,如图4-4:
图4-4 建立包及类文件
5.通过调用创建表的函数方法实现对数据表的创建,并在MySQL中显示数据表信息,如图4-5:
图4-5 MySQL显示输出
6.通过调用显示的函数方法实现对数据表在窗口打印输出数据表的内容,如图4-6:
图4-6 数据表内容窗口输出
7.通过调用插入的函数方法实现对数据表的信息插入,并通过显示函数对插入后的信息进行打印输出,如图4-7:
图4-7 数据表的信息插入
8.通过调用更新的函数方法实现对数据表的信息更新,并通过显示函数对更新后的信息进行打印输出,如图4-8:
图4-8 数据表的信息更新
9.通过调用查找的函数方法实现对数据表的信息查找,并通过显示函数对查找后的信息进行打印输出,如图4-9:
图4-9 数据表的信息查找
10.通过调用删除的函数方法实现对数据表中的信息进行删除,并通过显示函数对删除后的信息进行打印输出,如图4-10所示:
图4-10 数据表的信息删除
1、实验分析
1)环境问题:在Eclipse集成开发环境中编写代码时字体太小不利于观察。
解决方法:点击Window->Preferences->在搜索栏中输入font->General-> Appearance->Colors and Fonts->Basic->Text Font->点击Edit进行字体的设置->点击确认即完成了字体大小的设置。
2)运行问题:编写Java代码进行中文输出时出现了乱码现象。
解决方法:鼠标右击->Run As->Run Configurations->Common->在Other后填写gbk然后点击Run进行运行后中文可以正常输出。
3)编译问题:建立类后无法运行,显示没有主程序。
解决方法:填写主类运行信息语句public static void main(String[] args)或 者继续在包内新建一个主类,通过类组合的形式进行类的运行。
4)代码问题:在编辑框内写Scanner语句进行窗口输入时显示语句错误。
解决方法:在文件头部写入如下语句import java.util.Scanner;之后错误消失。
5)代码问题:在调用一些类的成员变量的时候显示错误。
解决方法:所调用的类成员变量为私有类型,私有类型只能在类内访问,类外无法对其直接进行访问,在类内构造公有函数形成一个对外接口,在其他类内直接通过调用这个函数来访问其类内部的私有成员即可。
6)代码问题:在连接数据库的过程中总是报错。
解决方法:在文件头部写入如下语句import java.sql.*;之后错误消失。
7)代码问题:在输入密码后数据库始终无法连接成功。
解决方法:输入的密码应该是在进行数据库安装时自己更改后的密码,密码输入正确后数据库才可以成功的连接。
8)代码问题:使用SQL语言时总是报错。
解决方法:SQL语言在使用的过程中需要用双引号将其括起来,不可以像在MySQL数据库中直接写SQL语言一样,需要特别注意。
9)代码问题:在连接数据库的时候始终无法成功完成数据库的连接,始终显示没有此数 据库。
解决方法:由于在连接数据库之前没有导入连接数据库的jar文件,因此始终无法连接成功,导入jar文件后数据库成功连接。
2、心得体会
1)在使用单引号和双引号的时候要特别注意,输出单个字符时可以使用单引号,如果同时输出多个字符时只能使用双引号进行输出,不然会报错。
2)在使用一些标点符号的时候要特别注意,代码内的标点符号均为英文,所以在注释和写代码切换的时候要特别的注意。
3)私有成员只能在类内进行访问,类外无法对私有成员直接进行访问。
4)在实现窗口输入参数的时候要特别注意,先在文件头部写入import java.util.Scanner;语句后再进行相关输入语句的书写。
5)在连接数据库的时候要特别注意,先在文件头部写入import java.sql.*;语句后再进行相关输入语句的书写,不然会报错。
6)在一些不确定是否发生异常的地方尽可能使用try-catch语句对出现的错误进行显示输出,尽可能的减少程序的中断。
7)使用Class.forName("com.mysql.cj.jdbc.Driver")加载JDBC-MySQL数据库的驱动。
8)使用net start mysql启动MySQL数据库服务器。
9)MySQL服务器默认占用的端口是3306。
10)ResultSet对象一次只能看到一个数据行,使用next()方法移到下一个数据行,next()方法最初的查询位置。
11)连接对象调用prepareStatement(String sql)方法对参数sql指定的SQL语句进行预编译处理,并返回一个PreparedStatement对象。
五、附源程序
1.主类Students类源代码
package 实验六Java数据库连接;
//导入需要的包
import java.sql.*;
import java.util.Scanner;
public class Students {
//建立对象
Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
//函数调用
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("-------------------欢迎来到学生管理系统窗口-------------------");
//创建对象
Students students = new Students();
//定义变量
int choose;
System.out.println("1.显示 2.更新 3.插入 4.查找 5.删除 6.新建表 7.退出");
System.out.println("请输入需要操作的序号为:");
do{
//实例化对象
Scanner scanner = new Scanner(System.in);
choose = scanner.nextInt();
switch(choose){
case 1:
students.Display();
System.out.println("-------------------------------------");
System.out.println("1.显示 2.更新 3.插入 4.查找 5.删除 6.新建表 7.退出");
break;
case 2:
students.Update();
System.out.println("-------------------------------------");
System.out.println("1.显示 2.更新 3.插入 4.查找 5.删除 6.新建表 7.退出");
break;
case 3:
students.Insert();
System.out.println("-------------------------------------");
System.out.println("1.显示 2.更新 3.插入 4.查找 5.删除 6.新建表 7.退出");
break;
case 4:
students.Find();
System.out.println("-------------------------------------");
System.out.println("1.显示 2.更新 3.插入 4.查找 5.删除 6.新建表 7.退出");
break;
case 5:
students.Delete();
System.out.println("-------------------------------------");
System.out.println("1.显示 2.更新 3.插入 4.查找 5.删除 6.新建表 7.退出");
break;
case 6:
students.Create();
System.out.println("-------------------------------------");
System.out.println("1.显示 2.更新 3.插入 4.查找 5.删除 6.新建表 7.退出");
break;
}
}while(choose != 7);
}
catch(Exception e)
{
System.out.print("----------------数据库连接错误!-------------");
e.printStackTrace();
}
}
//连接数据库
public Connection getConnect() throws ClassNotFoundException, SQLException{
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
return DriverManager.getConnection(url, user, password);
}
//打印数据表信息
public void Display(){
String sql = "select * from student";
try {
Statement statement = getConnect().createStatement();
ResultSet resultSet = statement.executeQuery(sql);
System.out.println("-------------------------------------");
System.out.println("执行结果如下所示:");
System.out.println(" 学号" + "\t" + " 姓名"+ "\t" + "性别"+ "\t" + "专业");
System.out.println("----------------------------------");
while (resultSet.next()) {
System.out.println(resultSet.getString("sno")+"\t" + resultSet.getString("sname") + "\t"
+ resultSet.getString("ssex")+ "\t"+ resultSet.getString("sdept"));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//更新数据表
public void Update(){
String sql = "update student set sname=?,ssex=?,sdept=? where sno=?";
String string1,string2,string3,string4;
try {
PreparedStatement preparedStatement = getConnect().prepareStatement(sql);
System.out.println("请输入要更新的学号:");
string1=scanner.next();
preparedStatement.setString(4, string1);
System.out.println("请输入新的姓名:");
string2=scanner.next();
preparedStatement.setString(1, string2);
System.out.println("请输入性别:");
string3=scanner.next();
preparedStatement.setString(2, string3);
System.out.println("请输入要新的专业:");
string4=scanner.next();
preparedStatement.setString(3, string4);
preparedStatement.executeUpdate();
}
catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("更新内容不存在!");
}
}
//在数据表中插入记录
public void Insert(){
String sql = "insert into student(sno,sname,ssex,sdept) values(?,?,?,?)";
String string1,string2,string3,string4;
try {
PreparedStatement preparedStatement = getConnect().prepareStatement(sql);
System.out.println("请输入要插入的学号:");
string1=scanner.next();
preparedStatement.setString(1, string1);
System.out.println("请输入要插入的姓名:");
string2=scanner.next();
preparedStatement.setString(2, string2);
System.out.println("请输入要插入的性别:");
string3=scanner.next();
preparedStatement.setString(3, string3);
System.out.println("请输入要插入的专业:");
string4=scanner.next();
preparedStatement.setString(4, string4);
preparedStatement.executeUpdate();
}
catch (SQLException e) {
System.out.println("所插入的姓名错误!");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//创建数据表
public void Create(){
try {
System.out.println("请输入新创建的表名:");
String string = scanner.next();
PreparedStatement ptmt = getConnect().prepareStatement(string);
ptmt.executeUpdate();
}
catch (SQLException e) {
System.out.println("输入的表名有问题!");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//删除数据表中的记录
public void Delete(){
int choose=0;
System.out.println("请输入需要操作的序号为:");
System.out.println("1.按学号删除"+"\t"+"2.按姓名删除");
choose = scanner.nextInt();
if(choose == 1){
String sql = "delete from student where sno=?";
try {
PreparedStatement ptmt = getConnect().prepareStatement(sql);
System.out.println("请输入学号为:");
String string=scanner.next();
ptmt.setString(1, string);
ptmt.executeUpdate();
}
catch (Exception e) {
e.printStackTrace();
}
}
else{
String sql = "delete from student where sname=?";
try {
PreparedStatement ptmt = getConnect().prepareStatement(sql);
System.out.println("请输入姓名:");
String string=scanner.next();
ptmt.setString(1, string);
ptmt.executeUpdate();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
//查询数据表信息
public void Find(){
int choose=0;
PreparedStatement preparedStatement = null;
System.out.println("请输入需要操作的序号为:");
System.out.println("1.按学号查找"+"\t"+"2.按姓名查找"+"\t"+"3.按专业查找");
choose = scanner.nextInt();
try {
if(choose == 1){
String sql = "select * from student where sno like ?";
preparedStatement = getConnect().prepareStatement(sql);
System.out.println("请输入学号:");
String string=scanner.next();
preparedStatement.setString(1, string);
}
else if(choose == 2){
String sql = "select * from student where sname like ?";
preparedStatement = getConnect().prepareStatement(sql);
System.out.println("请输入姓名:");
String string=scanner.next();
preparedStatement.setString(1, string);
}
else if(choose == 3)
{
String sql = "selsect * from student where sdept like ?";
preparedStatement = getConnect().prepareStatement(sql);
System.out.println("请输入专业:");
String string=scanner.next();
preparedStatement.setString(1, string);
}
ResultSet resultSet = preparedStatement.executeQuery();
System.out.println("------------------------------------");
System.out.println("执行结果如下所示:");
System.out.println("----------------------------------");
System.out.println(" 学号" + "\t" + " 姓名"+ "\t" + "性别"+ "\t" + "专业");
while (resultSet.next()) {
System.out.println("----------------------------------");
System.out.println(resultSet.getString("sno")+"\t" + resultSet.getString("sname") + " \t"
+ resultSet.getString("ssex")+ "\t"+ resultSet.getString("sdept"));
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}