实验三 数据库编程
1. 了解常用数据库系统并掌握其基本操作,掌握SQL语言基本用法,能够创建数据库并通过SQL语句对数据库数据进行常规操作。
2. 掌握JDBC核心API的使用,能够利用JDBC技术访问数据库,实现CRUD操作。
3. 掌握事件处理机制、常用组件的使用和常见事件的处理方法,能够根据需求设计图形用户界面,为程序功能提供用户操作接口。
4. 能够选择适用的数据库管理系统、JDBC技术、GUI组件等设计图形界面应用程序解决实际问题。
支撑课程目标(5):能够选用恰当的平台、工具、技术和资源完成面向对象的程序设计与软件系统开发,体现知识产权意识。
三、实验任务
编程管理学生数据。要求:
1. 自选数据库管理系统创建数据库stu,按照下表的结构创建"student"表:
字段名 |
Java数据类型 |
宽度 |
SQL数据类型 |
id |
int |
10 |
int |
Name |
String |
20 |
Char(20) |
Sex |
String |
2 |
Char(2) |
Age |
Int |
3 |
Integer |
假设表中已有3个学生的数据:
id |
Name |
Sex |
Age |
1 |
张小明 |
男 |
18 |
2 |
李雷 |
男 |
19 |
3 |
韩梅梅 |
女 |
18 |
2. 设计图形用户界面,通过事件处理实现学生数据管理功能。
3. 用恰当的方法处理可能出现的异常。
4. 将数据表stu及其数据操作封装成类,将数据操作功能封装成类的方法,通过该类,借助图形用户界面实现下面功能:
(1)向表中增加记录并显示增加后的所有记录(新增记录的具体数据自定);
(2)从表中删除id=1的记录,并显示删除后的所有记录;
(3)修改表中记录:查询条件id=2,将name修改为:王杰,修改完毕显示所有记录;
(4)查询表中id=3的记录并显示。
四、实验要求
1. 程序要添加适当的注释,程序的书写要采用缩进格式。
2. 程序要具备一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
3. 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
第一个类名叫Conn,用于连接数据库,这是连接数据库的最基本的步骤(本篇文章不详细说明导包过程)注:本次实验运用的数据库为Mysql数据库,使用的库名:test 表名:student
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Conn { // 创建类Conn
Connection con=null; // 声明Connection对象
public static String user;
public static String password;
public Connection getConnection() { // 建立返回值为Connection的方法
try { // 加载数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("数据库驱动加载成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
user = "用户名";//数据库登录名
password = "";//密码
try { // 通过访问数据库的URL获取数据库连接对象
con = DriverManager.getConnection
("jdbc:mysql://localhost:3306/test",user,password);
System.out.println("数据库连接成功");
} catch (SQLException e) {
e.printStackTrace();
}
return con; // 按方法要求返回一个Connection对象
}
}
第二个类用于封装学生基本信息,其名为GetStudentInfo 继承了JPanel
本次实验布局运用FlowLayout布局
import javax.swing.*;
import java.awt.*;
public class GetStudentInfo extends JPanel {
JTextField id; //定义四个文本域存放学生信息
JTextField name;
JTextField sex;
JTextField age;
public GetStudentInfo(){
JLabel stuid=new JLabel("id");
id=new JTextField(4);
JLabel stuname=new JLabel("姓名");
name=new JTextField(4);
JLabel stusex=new JLabel("性别");
sex=new JTextField(4);
JLabel stuage=new JLabel("年龄");
age=new JTextField(4);
this.setLayout(new FlowLayout()); //本次运用的布局为FlowLayout布局
this.add(stuid);
this.add(id); //向窗口里添加信息
this.add(stuname);
this.add(name);
this.add(stusex);
this.add(sex);
this.add(stuage);
this.add(age);
}
public String getId(){ //getter和setter的运用
String id1=id.getText();
return id1;
}
public String getName(){
String name1=name.getText();
return name1;
}
public String getSex(){
String sex1=sex.getText();
return sex1;
}
public String getAge(){
String age1= age.getText();
return age1;
}
}
第三个类,也是最主要且最长的类 StuManager类,主要用Swing组件和事件实现对数据库进行增删改查操作
package Work;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
public class StuManage extends JFrame implements ActionListener {
int row; //用于记录更改行数
JTabbedPane tab=new JTabbedPane(); //new一个可切换的选项卡
JPanel mainpanel=new JPanel(); //new一个新的窗口
JScrollPane viewlistscorll; //滚动条1
JScrollPane viewscroll; //滚动条2
JPanel updatepanel=new JPanel(); //new更改数据库的窗口
GetStudentInfo stuinfo1=new GetStudentInfo(); //调用获取学生类1
GetStudentInfo stuinfo2=new GetStudentInfo(); //调用获取学生类2
JPanel querypanel=new JPanel(); //new查看数据库窗口
JButton dataButton=new JButton("删除"); //定义删除按钮
JTextField queryTestFile=new JTextField(10); //查看文本域,宽度为10
Object data[][],data1[][],data2[][]; //为遍历数据而准备的Object二维数组
Object colname[]={"id","姓名","性别","年龄"}; //定义索引
JTable stutable,querytable,querylist; //定义表格
JButton add=new JButton("添加");
JButton modifybutton=new JButton("修改");
JButton updatebutton=new JButton("更新");
JButton querybutton=new JButton("查询");
JButton update=new JButton("更新数据");
// int sno;
String sno;
public StuManage(){ //重写构造方法
super("学生管理系统");
setDefaultCloseOperation(3);
viewDataList();
addData();
deleteData();
modifyData();
queryData();
add(tab);
}
//添加数据
public void addData(){
JButton adddata_clear=new JButton("清除");
mainpanel.add(stuinfo1); //主界面添加学生信息获取1
add.addActionListener(this);//添加事件监听器
stuinfo1.add(add); //添加按钮
stuinfo1.add(adddata_clear); //添加清理按钮
adddata_clear.addActionListener(new ActionListener() { //new监视器,并重新抽象类
@Override
public void actionPerformed(ActionEvent d) {
stuinfo1.id.setText("");
stuinfo1.sex.setText("");
stuinfo1.name.setText("");
stuinfo1.age.setText("");
}
});
tab.add("添加数据",stuinfo1); //添加到选项卡上
}
//修改数据原理同上
public void modifyData(){
JButton update_clear=new JButton("清除");
mainpanel.add(stuinfo2);
stuinfo2.add(modifybutton);
stuinfo2.add(querybutton);
querybutton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
stuinfo2.id.setEditable(false);
stuinfo2.name.setEditable(true);
stuinfo2.sex.setEditable(true);
stuinfo2.age.setEditable(true);
// sno= Integer.parseInt(stuinfo2.id.getText());
sno=stuinfo2.id.getText();
if(stuinfo2.id.getText().isEmpty())
JOptionPane.showMessageDialog(null, "学号不能为空");
else
try{
ResultSet rs;
Connection conn=new Conn().getConnection();
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
String sql="select * from student where id="+sno;
rs=stmt.executeQuery(sql);
while(rs.next()){ //遍历
// stuinfo2.name.setText(rs.getString(2));
stuinfo2.name.setText(rs.getString("name"));
// stuinfo2.sex.setText(rs.getString(3));
stuinfo2.sex.setText(rs.getString("sex"));
// stuinfo2.age.setText(String.valueOf(rs.getInt(4)));
stuinfo2.age.setText(rs.getString("age"));
// stuinfo2.age.setText(rs.getString(4));
}
querytable.setVisible(false);
querytable.setVisible(true);
rs.close();
conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
});
stuinfo2.add(modifybutton); //修改监视器
modifybutton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(stuinfo2.id.getText().isEmpty())
JOptionPane.showMessageDialog(null,"学号不能为空");
else
try{
stuinfo2.name.setEditable(false); //设置为不可更改
stuinfo2.sex.setEditable(false);
stuinfo2.age.setEditable(false);
// int ssno= Integer.parseInt(stuinfo2.id.getText());
String sno= stuinfo2.id.getText();
// String sname=stuinfo2.name.getName();
String name=stuinfo2.name.getText();
String sex=stuinfo2.sex.getText();
// int sage= Integer.parseInt(stuinfo2.age.getText());
String sage=stuinfo2.age.getText();
Connection conn=new Conn().getConnection();
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
// String sql="update student set id=no,name='"+sname+"',sex='"+ssex+"',age=age";
String sql="update student set name='"+name+"' where id='"+sno+"'";
stmt.executeUpdate(sql);
JOptionPane.showMessageDialog(null,"修改成功");
stmt.close();
} catch (SQLException ex) {
ex.printStackTrace();
}finally {
StuManage add1=new StuManage(); //最好将修改的结果添加到StuManage
add1.setLocationRelativeTo(null);
add1.setVisible(true);
add1.setSize(500,170);
setVisible(false);
stuinfo2.id.setEditable(true);
}
}
});
stuinfo2.add(update_clear); //给更新按钮添加监视器
update_clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
stuinfo2.id.setEditable(true);
stuinfo2.name.setEditable(false);
stuinfo2.sex.setEditable(false);
stuinfo2.age.setEditable(false);
stuinfo2.id.setText("");
stuinfo2.name.setText("");
stuinfo2.sex.setText("");
stuinfo2.age.setText("");
}
});
stuinfo2.name.setEditable(false);
stuinfo2.sex.setEditable(false);
stuinfo2.age.setEditable(false);
tab.add("修改数据",stuinfo2); //为选项卡命名修改数据
}
//删除数据原理同上上
public void deleteData(){
JLabel snolabel=new JLabel("学号");
JTextField snotext=new JTextField(" ");
JButton delete_query=new JButton("查询");
JButton delete_clear=new JButton("清除");
mainpanel.add(snolabel); //各种添加按钮
mainpanel.add(snotext);//注意
mainpanel.add(delete_query);//各种添加按钮
mainpanel.add(dataButton);//各种添加按钮
mainpanel.add(delete_clear);//各种添加按钮
data2=new Object[1][6]; //用于遍历的数组
querylist=new JTable(data2,colname);
JScrollPane jsp=new JScrollPane(querylist);
mainpanel.add(jsp);
querylist.setVisible(false);
querylist.setFillsViewportHeight(true);
delete_query.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sno= snotext.getText();
if(snotext.getText().isEmpty())
JOptionPane.showMessageDialog(null,"学号不能为空");
else
try{
ResultSet rs1;
Connection conn=new Conn().getConnection();
Statement stmt1=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
String sql1="select * from student where id="+sno;
rs1=stmt1.executeQuery(sql1);
int i=0;
if(rs1.next()){ //遍历查找
// data2[i][0]=rs1.getInt(1);
data2[i][0]=rs1.getString(1);
// data[i][1]=rs1.getString(2);
// data[i][2]=rs1.getString(2);
// data[i][3]=rs1.getInt(2);
data2[i][1]=rs1.getString(2);
data2[i][2]=rs1.getString(3);
// data2[i][3]=rs1.getInt(4);
data2[i][3]=rs1.getString(4);
querylist.setVisible(true);
}else JOptionPane.showMessageDialog(null,"无记录!"); //提示
querylist.setVisible(false);
querylist.setVisible(true);
rs1.close();
conn.close();
} catch (SQLException ex) {
// throw new RuntimeException(ex);
System.out.println(ex.getMessage());
}
}
});
dataButton.addActionListener(new ActionListener() { //删除按钮添加事件监视器
@Override
public void actionPerformed(ActionEvent e) {
// sno= Integer.parseInt(snotext.getText());
sno=snotext.getText();
if(snotext.getText().isEmpty())
JOptionPane.showMessageDialog(null,"学号不能为空");
else
try{
Connection conn=new Conn().getConnection();
Statement stmt1=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
String sql1="delete from student where id='"+sno+"'";
stmt1.executeUpdate(sql1);
querytable.setVisible(false);
querytable.setVisible(true);
conn.close();
JOptionPane.showMessageDialog(null,"删除成功");
}catch (Exception ex){
ex.printStackTrace();
}
}
});
delete_clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
snotext.setText("");
}
});
tab.add("删除数据",mainpanel);
}
//查询数据原理同上上上
public void queryData(){
JLabel cxjl=new JLabel("学号");
JButton cxbutton=new JButton("查询");
JButton cxqcbutton=new JButton("清除");
querypanel.add(cxjl);//各种添加按钮
querypanel.add(queryTestFile);//各种添加按钮
querypanel.add(cxbutton);//各种添加按钮
querypanel.add(cxqcbutton);//各种添加按钮
cxqcbutton.addActionListener(new ActionListener() { //添加按钮事件监视器
@Override
public void actionPerformed(ActionEvent e) {
queryTestFile.setText("");
}
});
data1=new Object[1][6];
querytable=new JTable(data1,colname);
viewlistscorll=new JScrollPane(querytable);
querypanel.add(viewlistscorll);
querytable.setVisible(false);
querytable.setFillsViewportHeight(true);
tab.add("查询数据",querypanel);
cxbutton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// sno= Integer.parseInt(queryTestFile.getText());
sno= queryTestFile.getText();
if(queryTestFile.getText().isEmpty())
JOptionPane.showMessageDialog(null,"学号不能为空");
else
try{
ResultSet rs1;
Connection conn=new Conn().getConnection();
Statement stmt1=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
String sql1="select *from student where id="+sno;
rs1=stmt1.executeQuery(sql1);
int i=0;
if(rs1.next()){ //遍历
// data1[i][0]=rs1.getInt(1);
data1[i][0]=rs1.getString(1);
data1[i][1]=rs1.getString(2);
data1[i][2]=rs1.getString(3);
// data1[i][3]=rs1.getInt(4);
data1[i][3]=rs1.getString(4);
querytable.setVisible(true);
}
else JOptionPane.showMessageDialog(null,"无记录!");
querytable.setVisible(false);
querytable.setVisible(true);
rs1.close();
conn.close();
}catch (Exception ex){
System.out.println(ex.getMessage());
}
}
});
}
//用表格显示数据
public void viewData(){
try{
JPanel content=new JPanel();
JButton clear=new JButton("清除");
ResultSet rs;
Connection conn=new Conn().getConnection();
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
String sql="select * from student";
rs=stmt.executeQuery(sql);
rs.last();
row=rs.getRow();
data=new Object[row][4];
// data=new Object[row][6];
stutable=new JTable(data,colname);
DefaultTableCellRenderer r=new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
stutable.setDefaultRenderer(Object.class,r);
content.setPreferredSize(new Dimension(50,400));
content.add(updatebutton); //你忘添加了
content.add(clear);
updatebutton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
StuManage add1=new StuManage();
add1.setLocationRelativeTo(null);
add1.setVisible(true);
add1.setSize(476,170);
setVisible(false);
}
});
content.add(new JScrollPane(stutable));
viewlistscorll=new JScrollPane(content);
rs.beforeFirst();
clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int i;
for (i=0;i
最后一个类Main函数
public class Main {
public static void main(String[] args) {
StuManage stumanage=new StuManage();
stumanage.setLocationRelativeTo(null);
stumanage.setVisible(true);
stumanage.setSize(500,170);
}
}