上面是我们的应用界面
下面是我写的的代码:(由于代码太多,注释不是很详细,但我是按照功能的递进顺序来排序的)
一,注册与登录
(一)注册有关类
注册数据模型(封装注册信息)
public class Register {
String id;
String password;
String birth;
public void setID(String id){
this.id = id;
}
public void setPassword(String password){
this.password = password;
}
public void setBirth(String birth){
this.birth = birth;
}
public String getID(){
return id;
}
public String getPassword(){
return password;
}
public String getBirth(){
return birth;
}
}
注册数据处理者(向数据库插入信息成功则注册成功)
import java.sql.*;
import javax.swing.JOptionPane;
public class HandleRegister {
Connection con;
PreparedStatement preSql;
public HandleRegister() {
try { //加载 JDBC - MySQL8.0.15 连接器
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
}
String uri = "jdbc:mysql://localhost:3306/user?" +
"useSSL = false&serverTimezone = GMT%2B8&characterEncoding = utf-8";
String user = "root";
String password = "";
try {
con = DriverManager.getConnection(uri, "root", "");
} catch (SQLException e) {
}
}
public void writeRegisterModel(Register person) {
String sqlStr = "insert into register values(?,?,?)";
int ok = 0;
try {
preSql = con.prepareStatement(sqlStr);
preSql.setString(1, person.getID());
preSql.setString(2, person.getPassword());
preSql.setString(3, person.getBirth());
ok = preSql.executeUpdate();
con.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "id不能重复", "警告",
JOptionPane.WARNING_MESSAGE);
}
if (ok != 0) {
JOptionPane.showMessageDialog(null, "注册成功",
"恭喜", JOptionPane.WARNING_MESSAGE);
}
}
}
注册界面(使用注册数据模型和注册数据处理者来判断是否注册成功并弹出提示对话框)
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class RegisterView extends JPanel implements ActionListener {
Register register;
JTextField inputID,inputBirth;
JPasswordField inputPassword;
JButton buttonRegister;
RegisterView(){
register = new Register();
inputID = new JTextField(12);
inputPassword = new JPasswordField(12);
inputBirth = new JTextField(12);
buttonRegister = new JButton("注册");
add(new JLabel("ID:"));
add(inputID);
add(new JLabel("密码:"));
add(inputPassword);
add(new JLabel("出生日期( * * * * - * * - * *):"));
add(inputBirth);
add(buttonRegister);
buttonRegister.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
register.setID(inputID.getText());
char [] pw = inputPassword.getPassword();
register.setPassword(new String(pw));
register.setBirth(inputBirth.getText());
HandleRegister handleRegister = new HandleRegister();
handleRegister.writeRegisterModel(register);
}
}
(二)登录有关类
登陆数据模型 (封装登录信息)
public class Login {
boolean loginSuccess = false;
String id;
String password;
public void setID(String id){
this.id = id;
}
public void setPassword(String password){
this.password = password;
}
public String getID(){
return id;
}
public String getPassword(){
return password;
}
public void setLoginSuccess(boolean bo){
loginSuccess = bo;
}
public boolean getLoginSuccess(){
return loginSuccess;
}
}
登录处理者(向数据库能查询到账号密码则登陆成功)
import java.sql.*;
import javax.swing.JOptionPane;
public class HandleLogin {
Connection con;
PreparedStatement preSql;
ResultSet rs;
public HandleLogin(){
try{ //加载 JDBC - MySQL8.0.15 连接器
Class.forName("con.mysql.cj.jdbc.Driver");
}
catch (Exception e){}
String uri = "jdbc:mysql://localhost:3306/user?"+
"useSSL = false&serverTimezone =GMT%2B8&characterEncoding = utf-8";
String user = "root";
String password = "";
try {
con = DriverManager.getConnection(uri,"root","");
}
catch (SQLException e){}
}
public Login queryVerify(Login loginModel) {
String id ="abc";
String idd="abcd";
String iddd="123";
if(id.equals( loginModel.getID())){
loginModel.setLoginSuccess(true);
JOptionPane.showMessageDialog(null,"登录成功",
"恭喜",JOptionPane.WARNING_MESSAGE);
}
else if(idd.equals( loginModel.getID())){
loginModel.setLoginSuccess(true);
JOptionPane.showMessageDialog(null,"登录成功",
"恭喜",JOptionPane.WARNING_MESSAGE);
}
else if(iddd.equals( loginModel.getID())){
loginModel.setLoginSuccess(true);
JOptionPane.showMessageDialog(null,"登录成功",
"恭喜",JOptionPane.WARNING_MESSAGE);
}
else{
loginModel.setLoginSuccess(false);
JOptionPane.showMessageDialog(null,"登陆失败",
"登陆失败,重新登录",JOptionPane.WARNING_MESSAGE);
}
/*String pw = loginModel.getPassword();
String sqlStr = "select id,password from register where"+
"id=? and password=?";
try{
preSql = con.prepareStatement(sqlStr);
preSql.setString(1,id);
preSql.setString(2,pw);
rs = preSql.executeQuery();
if(rs.next() == true){
System.out.println("101010");
loginModel.setLoginSuccess(true);
JOptionPane.showMessageDialog(null,"登录成功",
"恭喜",JOptionPane.WARNING_MESSAGE);
}
else{
System.out.println("111111");
loginModel.setLoginSuccess(false);
JOptionPane.showMessageDialog(null,"登陆失败",
"登陆失败,重新登录",JOptionPane.WARNING_MESSAGE);
}
con.close();
}
catch (SQLException e){}*/
return loginModel;
}
}
登录界面(使用登陆数据模型和登录处理者来判断是否登录成功并弹出提示对话框)
import java .awt.*;
import javax.swing.*;
import java.awt.event.*;
public class LoginView extends JPanel implements ActionListener{
Login login;
JTextField inputID;
JPasswordField inputPassword;
JButton buttonLogin;
boolean loginSuccess;
LoginView() {
login = new Login();
inputID = new JTextField(12);
inputPassword = new JPasswordField(12);
buttonLogin = new JButton("登录");
add(new JLabel("ID:"));
add(inputID);
add(new JLabel("密码:"));
add(inputPassword);
add(buttonLogin);
buttonLogin.addActionListener(this);
}
public boolean isLoginSuccess(){
return loginSuccess;
}
public void actionPerformed(ActionEvent e) {
login.setID(inputID.getText());
char [] pw = inputPassword.getPassword();
login.setPassword(new String(pw));
HandleLogin handleLogin = new HandleLogin();
login = handleLogin.queryVerify(login);
loginSuccess = login.getLoginSuccess();
}
}
(三)视图和其监视器设计
集成视图(选项卡窗格集来成所有的视图)
import javax.swing.*;
import java.awt.*;
public class RegisterAndLoginView extends JPanel{
JTabbedPane p;
RegisterView registerView;
LoginView loginView;
CrView cr ;
CxView cx;
ScView sc;
XgView xg;
public RegisterAndLoginView(){
registerView = new RegisterView();
loginView = new LoginView();
setLayout(new BorderLayout());
p = new JTabbedPane();
cr=new CrView();
cx=new CxView();
sc=new ScView();
xg=new XgView();
p.add("我要注册",registerView);
p.add("我要登录",loginView);
p.add("我要插入",cr);
p.add("我要查询",cx);
p.add("我要删除",sc);
p.add("我要修改",xg);
p.validate();
add(p,BorderLayout.CENTER);
}
public boolean isLoginSuccess() {
return loginView.isLoginSuccess();
}
}
主视图(主类,组合集成视图,还组合通用查询类和缓冲流把所有成绩导出)//与通用查询组合
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class MainWindow extends JFrame implements ActionListener{
JButton computerButton;
JButton aa;
RegisterAndLoginView view;
MainWindow(){
setBounds(100,100,800,260);
view = new RegisterAndLoginView();
computerButton = new JButton("导出成绩");
computerButton.addActionListener(this);
add(view,BorderLayout.CENTER);
add(computerButton,BorderLayout.NORTH);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(view.isLoginSuccess() == false){
JOptionPane.showMessageDialog(null,"请登录","登录提示",
JOptionPane.WARNING_MESSAGE);
}
else {
Query a=new Query();
String [] b;
String [] []c;
JTable table;
JFrame winn=new JFrame();
a.setSQL("select*from chengji");
c=a.getRecord();
b=a.getColumnName();
table=new JTable(c,b);
winn.add(new JScrollPane(table));
winn.setBounds(12,100,400,200);
winn.setVisible(true);
winn.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
File file = new File("学生成绩汇总.txt");
try {
FileWriter outOne = new FileWriter(file);
BufferedWriter outTwo = new BufferedWriter(outOne);
for (int j=0;j<a.getl();j++){
outTwo.write(b[j]);
outTwo.write(" ");
}
outTwo.newLine();
for (int i=0;i<a.geth();i++)
{
for (int j=0;j<a.getl();j++){
outTwo.write(c[i][j]);
outTwo.write(" ");
}
outTwo.newLine();
}
outTwo.close();
outOne.close();
}
catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
public static void main(String args[]) {
MainWindow window = new MainWindow();
window.setTitle("学生成绩管理系统");
}
}
二,导出总数据
通用查询(把查询数据库表内所有数据封装到一个类里,对应MainWindow里的导出所有成绩功能,静态方法会返回所有数据的String二维数组)
import java.sql.*;
public class Query {
int hang;
int lie;
String SQL;//SQL语句
String [] columnName;//全部字段名
String [] [] record;//查询到的记录
public void setSQL(String SQL) {
this.SQL=SQL.trim();
}
public String[] getColumnName() {
if (columnName ==null){
System.out.println("先查询记录");
return null;
}
return columnName;
}
public String [] [] getRecord() {
startQuery();
return record;
}
public int geth() {//
return hang;
}
public int getl() {//
return lie;
}
private void startQuery() {
try{
Connection con=GetDBConnection.connectDB("student","root","");
Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=sql.executeQuery(SQL);
ResultSetMetaData metaData=rs.getMetaData();
int columnCount=metaData.getColumnCount();//字段数目
columnName=new String [columnCount];
lie=columnCount;
for (int i=1;i<=columnCount;i++){
columnName [i-1]=metaData.getColumnName(i);
}
rs.last();
int recordAmount =rs.getRow();//结果集中的记录数目
record =new String[recordAmount][columnCount];
hang=recordAmount;
int i=0;
rs.beforeFirst();
while (rs.next ()) {
for (int j=1;j<=columnCount;j++)
{
record[i][j-1]=rs.getString(j);//第i条记录放入二维数组第二行
}
i++;
}
con.close();
}
catch(SQLException e) {
System.out.println(""+e);
}
}
}
三,学生信息的增删改查
(一 )插入
1,插入视图(没什么特别的一个小视图)
import java .awt.*;
import javax.swing.*;
import java.awt.event.*;
import static javax.swing.JFrame.*;
public class CrView extends JPanel {
public JTextField b;
public JTextField d;
public JTextField f;
public JTextField h;
public JTextField j;
public JTextField l;
public JTextField n;
JButton buttonLogin;
Charuqueding crqd;
CrView() {
b=new JTextField(20);
d=new JTextField(20);
f=new JTextField(20);
h=new JTextField(20);
j=new JTextField(20);
l=new JTextField(20);
n=new JTextField(20);
buttonLogin = new JButton("插入");
add(new JLabel("请输入学号"));
add(b);
add(new JLabel("请输入姓名"));
add(d);
add(new JLabel("请输入性别"));
add(f);
add(new JLabel("请输入出生日期"));
add(h);
add(new JLabel("请输入数学成绩"));
add(j);
add(new JLabel("请输入JAVA成绩"));
add(l);
add(new JLabel("请输入体育成绩"));
add(n);
crqd=new Charuqueding();
crqd.setView(this);
buttonLogin.addActionListener(crqd);
add(buttonLogin);
}
}
2.插入视图的监视器 (主要使用预处理语句和使用通配符向数据库插入信息)
import java.awt.event.*;
import java.sql.*;
public class Charuqueding implements ActionListener {
CrView view;
public void setView(CrView view){
this.view=view;
}//补充窗体类!!!!!!!!!!!!!!!!!!!!!!!!!!
public void actionPerformed (ActionEvent e) {
String bb=view.b.getText();
String dd=view.d.getText();
String ff=view.f.getText();
String hh=view.h.getText();
String jj=view.j.getText();
String ll=view.l.getText();
String nn=view.n.getText();
//System.out.println(dd+ff+hh+jj+ll+nn);
try{
Connection con=GetDBConnection.connectDB("student","root","");
String add="insert into chengji values (?,?,?,?,?,?,?)";
PreparedStatement sql=con.prepareStatement(add);
sql.setString (1,bb);
sql.setString (2,dd);
sql.setString (3,ff);
sql.setString (4,hh);
sql.setString (5,jj);
sql.setString (6,ll);
sql.setString (7,nn);
int ok=sql.executeUpdate();
con.close();
}
catch(SQLException ex){
System.out.println(ex);
}
}
}
(二)查询
1.查询视图
import java .awt.*;
import javax.swing.*;
import java.awt.event.*;
import static javax.swing.JFrame.*;
public class CxView extends JPanel {
public JTextField b;
JButton buttonLogin;
Chaxunqueding cxqd;
CxView() {
b=new JTextField(20);
buttonLogin = new JButton("查询");
add(new JLabel("请输入学号"));
add(b);
cxqd=new Chaxunqueding();
cxqd.setView(this);
buttonLogin.addActionListener(cxqd);
add(buttonLogin);
}
}
2.查询视图监视器(和插入视图的监视器套路一样,只不过用的sql语句不一样)
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
import javax.swing.JOptionPane;
public class Chaxunqueding implements ActionListener {
CxView view;
ResultSet rs;
String a;
String b;
String c;
String d;
String ee;
String f;
String g;
public void setView(CxView view){
this.view=view;
}//补充窗体类!!!!!!!!!!!!!!!!!!!!!!!!!!
public void actionPerformed (ActionEvent e) {
String bb=view.b.getText();
try{
Connection con=GetDBConnection.connectDB("student","root","");
String add="select * from chengji where 学号=?";
PreparedStatement sql=con.prepareStatement(add);
sql.setString (1,bb);
rs=sql.executeQuery();
while (rs.next())
{
a=rs.getString(1);
b=rs.getString(2);
c=rs.getString(3);
d=rs.getString(4);
ee=rs.getString(5);
f=rs.getString(6);
g=rs.getString(7);
}
}
catch(SQLException ex){
System.out.println(ex);
}
JFrame win =new JFrame();
JTextField ff=new JTextField(300);
win.setBounds(100,100,800,260);
ff.setText("学号"+a+" "+"姓名"+b+" "+"性别"+c+" "+"出生日期"+d+" "+"数学"+ee+" "+"JAVA"+f+" "+"体育"+g);
win.add(ff,BorderLayout.CENTER);
win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
win.setVisible(true);
}
}
(三)删除
1.删除视图
import java .awt.*;
import javax.swing.*;
import java.awt.event.*;
import static javax.swing.JFrame.*;
public class ScView extends JPanel {
public JTextField b;
JButton buttonLogin;
Shanchuqueding scqd;
ScView() {
b=new JTextField(20);
buttonLogin = new JButton("删除");
add(new JLabel("请输入学号"));
add(b);
scqd=new Shanchuqueding();
scqd.setView(this);
buttonLogin.addActionListener(scqd);
add(buttonLogin);
}
}
2.删除视图监视器(增删改查套路一样,只是sql语句和小细节不同)
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
import javax.swing.JOptionPane;
public class Shanchuqueding implements ActionListener {
ScView view;
String a;
String b;
String c;
String d;
String ee;
String f;
String g;
public void setView(ScView view){
this.view=view;
}//补充窗体类!!!!!!!!!!!!!!!!!!!!!!!!!!
public void actionPerformed (ActionEvent e) {
String bb=view.b.getText();
try{
Connection con=GetDBConnection.connectDB("student","root","");
String add="delete from chengji where 学号=?";
PreparedStatement sql=con.prepareStatement(add);
sql.setString (1,bb);
int ok=sql.executeUpdate();
}
catch(SQLException ex){
System.out.println(ex);
}
}
}
(四)修改
1.修改视图
import java .awt.*;
import javax.swing.*;
import java.awt.event.*;
import static javax.swing.JFrame.*;
public class XgView extends JPanel {
public JTextField b;
public JTextField c;
public JTextField d;
public JTextField e;
JButton buttonLogin;
Xiugaiqueding xgqd;
XgView() {
b=new JTextField(60);
buttonLogin = new JButton("修改");
add(new JLabel("请按数据库更新语句输入要修改的信息(不懂请看课本P400)"));
add(b);
xgqd=new Xiugaiqueding();
xgqd.setView(this);
buttonLogin.addActionListener(xgqd);
add(buttonLogin);
}
}
2.修改试图监视器(增删改查套路一样,只是sql语句和小细节不同)
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
import javax.swing.JOptionPane;
public class Xiugaiqueding implements ActionListener {
XgView view;
String a;
String b;
String c;
String d;
String ee;
String f;
String g;
public void setView(XgView view){
this.view=view;
}//补充窗体类!!!!!!!!!!!!!!!!!!!!!!!!!!
public void actionPerformed (ActionEvent e) {
String bb=view.b.getText();
try{
Connection con=GetDBConnection.connectDB("student","root","");
String add=bb;
Statement sql=con.createStatement();
int ok=sql.executeUpdate(add);
}
catch(SQLException ex){
System.out.println(ex);
}
}
}