数据库小组作业-学生选课系统(java+java swing+mysql实现)

本文档记录了一次使用Java Swing创建学生选课系统界面,并结合MySQL数据库实现登录、查询和导航功能的过程。项目采用Maven管理,通过Navicat连接MySQL数据库,使用JTable展示数据,实现了界面的布局和事件处理。
摘要由CSDN通过智能技术生成

最近数据库老师要求组一个小组并且完成一个题目
我们组选择的是学生选课系统,恰巧这学期刚好在学java,所以就用java swing来写界面,数据库使用mysql
注:开发中使用的idea版本为2020.3.1,mysql版本为8.0.24,navicat版本为15
这个博客会保持更新以便将整个过程完整展现

前期准备工作

打开idea选择新建一个maven项目,maven项目会使我们管理java项目更加方便,然后点开maven项目中的pom.xml文件,在其中添加以下代码

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.24</version>
</dependency>

其中第三行的版本需要根据自己下载的mysql版本来进行填写,在写入这段代码后可以看见
在这里插入图片描述
当External Libraries下出现了Maven:mysql:mysql-connector-java:8.0.24的时候就证明数据库驱动导入成功了

在src下的java下新建一个包view,用于存储界面以及界面渲染等等的类
在view包下新建一个类LoginView作为登陆界面的类
然后放入以下代码

package org.example.student.view;

import org.example.handler.LoginHandler;

import javax.swing.*;
import java.awt.*;

public class LoginView extends JFrame {
    JLabel nameLabel = new JLabel("学生选课系统",JLabel.CENTER);

    SpringLayout springLayout = new SpringLayout();
    JPanel centerPanel = new JPanel(springLayout);
    JLabel userNameLabel = new JLabel("用户名:");
    JTextField userTxt = new JTextField();
    JLabel pwdLabel = new JLabel("密码:");
    JPasswordField pwdField = new JPasswordField();
    JButton loginBtn = new JButton("登陆");
    JButton resetBtn = new JButton("重置");



//    SystemTray systemTray;
//    TrayIcon trayIcon;

    LoginHandler loginHandler;

    public LoginView() {
        super("学生选课系统");

        loginHandler = new LoginHandler(this);

        Container contentPane = getContentPane();



        nameLabel.setFont(new Font("华文行楷",Font.PLAIN,40));
        nameLabel.setPreferredSize(new Dimension(0,80));


        Font centerFont = new Font("楷体", Font.PLAIN, 20);
        userNameLabel.setFont(centerFont);
        userTxt.setPreferredSize(new Dimension(200,30));
        pwdLabel.setFont(centerFont);
        pwdField.setPreferredSize(new Dimension(200,30));
        loginBtn.setFont(centerFont);
        resetBtn.setFont(centerFont);
        //把组件加入面板
        centerPanel.add(userNameLabel);
        centerPanel.add(userTxt);
        centerPanel.add(pwdLabel);
        centerPanel.add(pwdField);
        loginBtn.addActionListener(loginHandler);
        centerPanel.add(loginBtn);
        resetBtn.addActionListener(loginHandler);
        centerPanel.add(resetBtn);


        layoutCenter();//登陆页面布局的函数



        contentPane.add(nameLabel,BorderLayout.NORTH);
        contentPane.add(centerPanel,BorderLayout.CENTER);



//        if(SystemTray.isSupported())
//        {
//            systemTray = SystemTray.getSystemTray();
//
//        }


//        //自定义图标
//        URL imgUrl = LoginView.class.getClassLoader().getResource("mulan.png");
//        assert imgUrl != null;
//        setIconImage(new ImageIcon(imgUrl).getImage());

        setSize(600,400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }

    private void layoutCenter() {
        //登陆界面布局

        Spring childWidth=Spring.sum(Spring.sum(Spring.width(userNameLabel),Spring.width(userTxt)),Spring.constant(20));
        int offsetX = childWidth.getValue() / 2;

        springLayout.putConstraint(SpringLayout.WEST,userNameLabel,-offsetX,SpringLayout.HORIZONTAL_CENTER,centerPanel);
        springLayout.putConstraint(SpringLayout.NORTH,userNameLabel,20,SpringLayout.NORTH,centerPanel);

        //userTxt
        springLayout.putConstraint(SpringLayout.WEST,userTxt,20,SpringLayout.EAST,userNameLabel);
        springLayout.putConstraint(SpringLayout.NORTH,userTxt,0, SpringLayout.NORTH,userNameLabel);

        //pwdLabel
        springLayout.putConstraint(SpringLayout.EAST,pwdLabel,0,SpringLayout.EAST,userNameLabel);
        springLayout.putConstraint(SpringLayout.NORTH,pwdLabel,20,SpringLayout.SOUTH,userNameLabel);

        //pwdField
        springLayout.putConstraint(SpringLayout.WEST,pwdField,20,SpringLayout.EAST,pwdLabel);
        springLayout.putConstraint(SpringLayout.NORTH,pwdField,0,SpringLayout.NORTH,pwdLabel);

        //LoginBtn
        springLayout.putConstraint(SpringLayout.WEST,loginBtn,50,SpringLayout.WEST,pwdLabel);
        springLayout.putConstraint(SpringLayout.NORTH,loginBtn,20,SpringLayout.SOUTH,pwdLabel);

        //resetBtn
        springLayout.putConstraint(SpringLayout.WEST,resetBtn,50,SpringLayout.EAST,loginBtn);
        springLayout.putConstraint(SpringLayout.NORTH,resetBtn,0,SpringLayout.NORTH,loginBtn);
    }

    public static void main(String[] args) {
        new LoginView();
    }

    public JTextField getUserTxt() {
        return userTxt;
    }

    public void setUserTxt(JTextField userTxt) {
        this.userTxt = userTxt;
    }

    public JPasswordField getPwdField() {
        return pwdField;
    }

    public void setPwdField(JPasswordField pwdField) {
        this.pwdField = pwdField;
    }
}


然后新建另一个类MainView,为主界面类

package org.example.student.view;



import org.example.handler.MainViewHandler;
import org.example.req.StudentRequest;
import org.example.res.TableDTO;
import org.example.service.StudentService;
import org.example.service.impl.StudentServiceImpl;
import org.example.student.view.ext.MainViewTable;
import org.example.student.view.ext.MainViewTableModel;
import org.example.util.DimensionUtil;

import javax.swing.*;
import java.awt.*;
import java.util.Vector;

public class MainView extends JFrame {//继承了JFrame才能使用GUI的控件

    JPanel northPanel = new JPanel();//new FlowLayout(FlowLayout.LEFT)
    /*
    JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,是一种轻量级容器,可以加入到JFrame窗体中。
    JPanel默认的布局管理器是FlowLayout,其自身可以嵌套组合,在不同子容器中可包含其他组件(component),
    如JButton、JTextArea、JTextField 等,功能是对窗体上的这些控件进行组合,相当于C++和C#中的Panel类。
    就是一个可以放控件的面板,相当于html中的div
    * */



    JButton addBtn = new JButton("选课");//选课按钮,这里只新建了按钮的文本信息
//    JButton updateBtn = new JButton("修改");
    JButton delBtn = new JButton("退课");
    JButton searchBtn = new JButton("查询");



    JTextField searchTxt = new JTextField(10);/*
    JTextField 是一个轻量级组件,它允许编辑单行文本。 JTextField 应与 java.awt.TextField 具有源代码兼容性,理应如此。
    此组件具有 java.awt.TextField 类中没有的功能。
    JTextField(int columns)
    构造一个具有指定列数的新的空TextField。
    */
    JPanel southPanel = new JPanel();//new FlowLayout(FlowLayout.RIGHT)
    JButton preBtn = new JButton("上一页");
    JButton nextBtn = new JButton("下一页");




    MainViewTable mainViewTable = new MainViewTable();//设置了JTable的初始化

    //当前第几页
    private  int pageNow = 1;
    //每一页有几条记录
    private  int pageSize = 10;


    MainViewHandler mainViewHandler;



    public MainView(){
        /*
        * 设置主窗口的初始化属性
        * */
        super("兰州理工大学选课系统");//调用父类的构造方法 JFrame(String a) 构造方法  创建一个窗体对象,并指定标题

        Container contentPane = getContentPane();
        //获取内容面板,因为JFrame不能直接添加组件,需要用getContentPane()函数获取内容面板,再在内容面板上进行添加组件。

        mainViewHandler = new MainViewHandler(this);


        //放置为北边的组件
        layoutNorth(contentPane);
        //设置中间的
        layoutCenter(contentPane);
        //放置南边的组件
        layoutSouth(contentPane);





        //根据屏幕大小设置主界面大小
//        setBounds(DimensionUtil.getBounds());
        //设置窗体完全充满整个屏幕的可见大小
//        setExtendedState(JFrame.MAXIMIZED_BOTH);


        setSize(1500,600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(true);
        setVisible(true);
    }

    private void layoutCenter(Container contentPane) {
        Vector<Vector<Object>> data = getVectors();


//        Vector<Vector<Object>> data = new Vector<>();
//
//
//        Vector<Object> rowVector1 = new Vector<>();
//        rowVector1.addElement("1");
//        rowVector1.addElement("1017");
//        rowVector1.addElement("高等数学");
//        rowVector1.addElement("许嵩");
//        rowVector1.addElement("必修");
//        rowVector1.addElement("3");
//        rowVector1.addElement("理学院");
//
//
//        Vector<Object> rowVector2 = new Vector<>();
//        rowVector2.addElement("2");
//        rowVector2.addElement("2067");
//        rowVector2.addElement("大学英语");
//        rowVector2.addElement("萨芬");
//        rowVector2.addElement("必修");
//        rowVector2.addElement("2");
//        rowVector2.addElement("外语学院");
//
//
//        Vector<Object> rowVector3 = new Vector<>();
//        rowVector3.addElement("3");
//        rowVector3.addElement("8412");
//        rowVector3.addElement("大学物理");
//        rowVector3.addElement("张宇");
//        rowVector3.addElement("选修");
//        rowVector3.addElement("4");
//        rowVector3.addElement("理学院");
//
//
//        data.addElement(rowVector1);
//        data.addElement(rowVector2);
//        data.addElement(rowVector3);
        MainViewTableModel mainViewTableModel = MainViewTableModel.assembleModel(data);
        mainViewTable.setModel(mainViewTableModel);
        mainViewTable.renderRule();

        JScrollPane jScrollPane = new JScrollPane(mainViewTable);
        contentPane.add(jScrollPane,BorderLayout.CENTER);
    }

    private Vector<Vector<Object>> getVectors() {
        StudentService studentService = new StudentServiceImpl();
        StudentRequest request = new StudentRequest();
        request.setPageNow(pageNow);
        request.setPageSize(pageSize);
        request.setSearchKey(searchTxt.getText().trim());
        TableDTO tableDTO = studentService.retrieveStudents(request);
        return tableDTO.getData();
    }

    private void layoutSouth(Container contentPane) {
        //添加事件监听
        preBtn.addActionListener(mainViewHandler);
        nextBtn.addActionListener(mainViewHandler);

        southPanel.add(preBtn);
        southPanel.add(nextBtn);
        contentPane.add(southPanel,BorderLayout.SOUTH);
    }
//
//    private void showPreNext(int totalCount) {
//        if(pageNow == 1) {
//            preBtn.setVisible(false);
//        }else {
//            preBtn.setVisible(true);
//        }
        int pageCount=0;
        if(totalCount % pageSize == 0) {
            pageCount = totalCount / pageSize;
        } else {
            pageCount = totalCount / pageSize + 1;
        }
        if(pageNow == pageCount) {
            nextBtn.setVisible(false);
        }else {
            nextBtn.set
        }
//    }







    private void layoutNorth(Container contentPane) {
        //增加事件监听
        addBtn.addActionListener(mainViewHandler);
//      updateBtn.addActionListener(mainViewHandler);
        delBtn.addActionListener(mainViewHandler);
        searchBtn.addActionListener(mainViewHandler);


        northPanel.add(addBtn);
//      northPanel.add(updateBtn);
        northPanel.add(delBtn);
        northPanel.add(searchTxt);
        northPanel.add(searchBtn);//查询按钮
        contentPane.add(northPanel,BorderLayout.NORTH);
    }

    public static void main(String[] args) {
        new MainView();
    }

    public void setPageNow(int pageNow) {
        this.pageNow = pageNow;
    }

    public int getPageNow() {
        return pageNow;
    }

    public void reloadTable() {
        Vector<Vector<Object>> data = getVectors();
//        StudentService studentService = new StudentServiceImpl();
//        StudentRequest request = new StudentRequest();
//        request.setPageNow(pageNow);
//        request.setPageSize(pageSize);
//        request.setSearchKey(searchTxt.getText().trim());
//        TableDTO tableDTO = studentService.retrieveStudents(request);
//        Vector<Vector<Object>> data = tableDTO.getData();

        MainViewTableModel.updataModel(data);
        mainViewTable.renderRule();
    }
}

在View包下新建一个ext包,用于存储主界面表格的渲染规则等
在ext下新建MainViewTable类
放入以下代码

package org.example.student.view.ext;

import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.util.Vector;

public class MainViewTable extends JTable {//继承表格

    //构造函数
    public MainViewTable(MainViewTableModel mainViewTableModel){//这里创建了一个管理数据的对象

        super(mainViewTableModel);//通过调用父类的构造方法与之绑定

        //设置表头
        JTableHeader tableHeader = getTableHeader();
        tableHeader.setFont(new Font(null,Font.BOLD,25));
        tableHeader.setForeground(Color.RED);

        //设置表格体
        setFont(new Font(null,Font.PLAIN,20));
        setForeground(Color.BLACK);
        setGridColor(Color.BLACK);
        setRowHeight(50);

        //设置确定多行选择
        getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

    }

    public MainViewTable() {
//        super(mainViewTableModel);
        //设置表头
        JTableHeader tableHeader = getTableHeader();
        tableHeader.setFont(new Font(null,Font.BOLD,30));
        tableHeader.setForeground(Color.RED);


        //设置表格体
        setFont(new Font(null,Font.PLAIN,20));
        setForeground(Color.BLACK);
        setGridColor(Color.BLACK);
        setRowHeight(40);
        //设置多行选择
        getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    }
//    public void setDataModel(MainViewTableModel mainViewTableModel){
//        this.setModel(mainViewTableModel);
//    }
//


    public  void renderRule() {
        //设置表格列的渲染方式
        Vector<String> columns = MainViewTableModel.getColumns();//columns是一格Vector集合 得到列数,在这里接收TableModel回传的数据

        MainViewCellRender render = new MainViewCellRender();//配置一个自定义的本地渲染器

        for (int i=0;i < columns.size();i++){

            TableColumn column = getColumn(columns.get(i));

            column.setCellRenderer(render);//设置本地渲染器

            if(i==0){
                column.setPreferredWidth(100);//将此列的首选宽度设置为 preferredwidth。如果 preferredwidth 超出最小或最大宽度,
                // 则将其调整为合适的界限值。

                column.setMaxWidth(100);//设置最大宽度
                column.setResizable(false);//设置可更改大小
            }
        }
    }

}

新建MainViewCellRender类

package org.example.student.view.ext;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;

public class MainViewCellRender extends DefaultTableCellRenderer {
    /*
    * JTable负责管理表格的可视外观,在绘制每个单元格时,调用getCellRenderer(int row,int col)获得当前单元格的渲染器,即得到一个Component,
    * 然后将其绘制展现。TableCellRenderer是一个接口,只有一个方法:
    * */

    /*
    * Component getTableCellRendererComponent(JTable table,
                                        Object value,
                                        boolean isSelected,
                                        boolean hasFocus,
                                        int row,
                                        int column)
    * */
    //在每一行的每一列显示之前都会调用
    @Override//覆盖父类方法
    public Component getTableCellRendererComponent(JTable table,
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus,
                                                   int row,
                                                   int column) {
        if(row%2==0){
            setBackground(Color.LIGHT_GRAY);
        }
        else{
            setBackground(Color.white);
        }

        setHorizontalAlignment(DefaultTableCellRenderer.CENTER);//设置表格中内容居中

        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        //返回用于绘制单元格的组件。此方法用于在绘制前适当地配置渲染器。
    }
    /*
    * 其中,row和column标识一个单元格。也就是说,可以根据row和column的不同(单元格也就不同),获得不同的填充组件,
    * 这样只需要在该方法内进行相应的逻辑判断。
    * */
}

新建MainViewTableModel类

package org.example.student.view.ext;

import javax.swing.table.DefaultTableModel;
import java.util.Vector;

/*
总结:MainViewTableModel这个类继承DefaultTableModel,是对表格数据进行管理的类,并且使用了很多父类的方法,同时也重写了一部分父类的办法达到个性化
*/
public class MainViewTableModel extends DefaultTableModel {
    /*

    DefaultTableModel是 TableModel 的一个实现,它使用一个 Vector 来存储单元格的值对象,该 Vector 由多个 Vector 组成。
    通过DefaultTableModel可以对表格进行数据的增删改,

    比较常用的,比如
    getColumnName(int column) 返回列名称。
    getRowCount() 返回此数据表中的行数。
    getColumnCount() 返回此数据表中的列数。
    getValueAt(int row, int column 返回 row 和 column 处单元格的属性值。
    setValueAt(Object aValue, int row, int column) 设置 column 和 row 处单元格的对象值。
    insertRow(int row, Object[] rowData) 在模型中的 row 位置插入一行。
    removeRow(int row) 移除模型中 row 位置的行。
    * */

    static Vector<String> columns = new Vector<>();//创建一个静态Vector来存储表头

    static {

        columns.addElement("编号");
        columns.addElement("课程号");
        columns.addElement("课程名称");
        columns.addElement("授课老师");
        columns.addElement("课程类别");
        columns.addElement("学分");
        columns.addElement("所属院系");
    }
    //addElement是Vector的方法,static静态代码块初始化类的静态数组数据


    MainViewTableModel(){
        super(null,columns);
    }
    //构造函数,构造了一个没有数据的空表

    private static MainViewTableModel mainViewTableModel = new MainViewTableModel();


    public static MainViewTableModel assembleModel(Vector<Vector<Object>> data){//返回值为ainViewTableModel类
        mainViewTableModel.setDataVector(data,columns);//通过将 data 和 columnNames 传递到 setDataVector 方法来初始化该表。
        return mainViewTableModel;//这个mainViewTableModel就是主界面的JTable表格
    }
    /*
    * DefaultTableModel(Object[][] data, Object[]columnNames)
      构造一个 DefaultTableModel,并通过将 data 和 columnNames 传递到 setDataVector 方法来初始化该表。
    * */

    public static void updataModel(Vector<Vector<Object>> data){
        mainViewTableModel.setDataVector(data,columns);
    }//更新表格数据

    public static Vector<String> getColumns() {
        return columns;
    }//返回columns集合,通过TableModel管理数据再回传给Table

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }
    //重写对于表格的可编辑性判断,这里均return false即表格所有数据均不可编辑
}


至此,界面类已经写完
在java下再次新建包handler,用于管理界面中的事件
在handler下新建LoginHanler和MainViewHanler类,分别写入如下代码

package org.example.handler;

import org.example.entity.AdminDo;
import org.example.service.AdminService;
import org.example.service.impl.AdminServiceImpl;
import org.example.student.view.LoginView;
import org.example.student.view.MainView;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class LoginHandler implements ActionListener {

    private LoginView loginView;
    public LoginHandler(LoginView loginView) {
        this.loginView = loginView;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton jButton = (JButton) e.getSource();
        String text = jButton.getText();
        if("重置".equals(text)) {
            loginView.getUserTxt().setText("");
            loginView.getPwdField().setText("");

        }
        else if("登陆".equals(text)){
            String user = loginView.getUserTxt().getText();
            char[] chars = loginView.getPwdField().getPassword();
            if(user == null || "".equals(user.trim()) ||
                    chars == null ) {
                JOptionPane.showMessageDialog(loginView,"用户名密码没有填写!");
                return;
            }
            String pwd = new String(chars);
            System.out.println(user + ":" + pwd);

//            if((user == null || "".equals(user.trim())) || pwd == null || "".equals(pwd.trim())) {
//
//            }
            //查询db
            AdminService adminService = new AdminServiceImpl();
            AdminDo adminDo = new AdminDo();
            //adminDo是一个做登陆验证的类,传入的user和pwd参数是登录界面的文本输入框里的内容转化成的string类型的参数
            adminDo.setUserName(user);
            adminDo.setPwd(pwd);

            boolean flag = adminService.validataAdmin(adminDo);

            if(flag)
            {
                //跳转到主界面并且销毁登录界面
                new MainView();
                loginView.dispose();
            }
            else
            {
                JOptionPane.showMessageDialog(loginView,"用户名密码错误");
            }
        }
    }
}

package org.example.handler;

import org.example.student.view.LoginView;
import org.example.student.view.MainView;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MainViewHandler implements ActionListener {
    /*
    * 通常是在进行某一个操作的时候触发某项功能。
    场景举例:当前有个按钮,通过给按钮增加监听事件,之后进行浏览本地路径,添加相应的路径名称,之后进行特定的内容操作。
    * 此时如果按钮不增加监听,那么就无法实现打开文件浏览功能。
    备注:常用方法是addActionListener。
    * */

    private MainView mainView;

    public MainViewHandler(MainView mainView) {//传入一个界面对象,用于管理界面的响应动作
        this.mainView = mainView;
    }

    @Override//覆盖父类方法
    public void actionPerformed(ActionEvent e) {
        JButton jButton =(JButton) e.getSource();//将所有按钮事件绑定

        String text = jButton.getText();//按钮文本的获取

        if("选课".equals(text)) {
            JOptionPane.showMessageDialog(mainView,"选课成功!");
            return;

        }else if("修改".equals(text)) {

        }else if("退课".equals(text)) {
            JOptionPane.showMessageDialog(mainView,"退课成功!");
            return;

        }else if("查询".equals(text)) {
            mainView.setPageNow(1);
            mainView.reloadTable();

        }else if("上一页".equals(text)) {
            mainView.setPageNow(mainView.getPageNow() - 1);
            mainView.reloadTable();
        }else if("下一页".equals(text)) {
            mainView.setPageNow(mainView.getPageNow() + 1);
            mainView.reloadTable();
        }
    }
}
/*
以上覆盖方法是管理了主界面中所有按钮的操作,做出相应的响应动作
* */

事件处理写完,在java下新建包service
新建两个接口AdminService和StudentService,在service包下新建impl包,在impl包下新建两个类AdminServiceImpl和StudentServiceImpl分别实现上面的两个接口
AdminService:

package org.example.service;

import org.example.entity.AdminDo;

public interface AdminService {
    boolean validataAdmin(AdminDo adminDo);
}

StudentService:

package org.example.service;

import org.example.req.StudentRequest;
import org.example.res.TableDTO;

public interface StudentService {

    TableDTO retrieveStudents(StudentRequest request);

}

AdminServiceImpl:

package org.example.service.impl;

import org.example.entity.AdminDo;
import org.example.service.AdminService;
import org.example.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class AdminServiceImpl implements AdminService {
    @Override
    public boolean validataAdmin(AdminDo adminDo) {
        String userName = adminDo.getUserName();
        String pwdParam = adminDo.getPwd();
        //登陆时校验
//        if(userName == null || "".equals(userName.trim())){
//
//        }

        String sql="select pwd from manager where user_name = ?";
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        try{
            conn = DBUtil.getConn();//获取数据库的连接
            if(conn==null){
                return false;
            }
            ps = conn.prepareStatement(sql);//与sql这条sql语句绑定

            ps.setString(1,adminDo.getUserName());//给出前面sql语句中?的值,用于查找语句

            resultSet = ps.executeQuery();//执行sql语句,不需要参数的原因是因为已经绑定
            /*
            * 方法executeQuery
                这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。

               方法executeUpdate
                用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如
                * CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。
                * executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。
                * 对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

               方法execute:
                用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能
            * */

            while(resultSet.next()){
                String pwd = resultSet.getString(1);//getString表示以 Java 编程语言中String的形式获取此 ResultSet对象的当前行中指定列的值

                if(adminDo.getPwd().equals(pwd)){//比较查找出来的密码
                    return true;
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.closeRs(resultSet);
            DBUtil.closePs(ps);
            DBUtil.closeConn(conn);


        }

        return false;
    }
}
/*
* 这个程序的验证方法是根据用户输入的用户名在数据库中进行查找,然后比对相应账户的密码,验证成功即可进入,失败则不可,这个方法有效的防止了sql攻击
* */

StudentServiceImpl:

package org.example.service.impl;

import org.example.req.StudentRequest;
import org.example.res.TableDTO;
import org.example.service.StudentService;
import org.example.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

public class StudentServiceImpl implements StudentService {
    @Override
    public TableDTO retrieveStudents(StudentRequest request) {
        StringBuilder sql = new StringBuilder();
        sql.append("select * from student ");
        if(request.getSearchKey() !=null && !"".equals(request.getSearchKey().trim())) {
            sql.append("where course_name like '%"+request.getSearchKey().trim()+"%'");
        }
        sql.append("order by id asc limit ").append(request.getStart()).append(",")
                .append(request.getPageSize());
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        TableDTO returnDTO = new TableDTO();
        try {
            conn = DBUtil.getConn();
            ps = conn.prepareStatement(sql.toString());
            rs = ps.executeQuery();
            //查询记录
            returnDTO.setData(fillData(rs));
            

            sql.setLength(0);
            sql.append("select count(*) from student ");
            if(request.getSearchKey() !=null && !"".equals(request.getSearchKey().trim())) {
                sql.append(" where course_name like '%"+request.getSearchKey().trim()+"%'");
            }
            ps = conn.prepareStatement(sql.toString());
            rs = ps.executeQuery();

            while(rs.next()) {
                int count = rs.getInt(1);
                returnDTO.setTotalCount(count);
            }
            return returnDTO;

        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.closeRs(rs);
            DBUtil.closePs(ps);
            DBUtil.closeConn(conn);
        }

        return null;
    }

    private Vector<Vector<Object>> fillData(ResultSet rs) throws SQLException {
        Vector<Vector<Object>> data = new Vector<>();
        while(rs.next()) {
            //处理查出的每一条记录
            Vector<Object> oneRecord = new Vector<>();
            int id = rs.getInt("id");
            int name = rs.getInt("course_no");
            String no = rs.getString("course_name");
            String homeTown = rs.getString("course_teacher");
            String cnScore = rs.getString("course_class");
            int enSocre = rs.getInt("course_credit");
            String mathScore = rs.getString("course_faculty");
//            int totalScore = cnScore + enSocre + mathScore;
            oneRecord.addElement(id);
            oneRecord.addElement(name);
            oneRecord.addElement(no);
            oneRecord.addElement(homeTown);
            oneRecord.addElement(cnScore);
            oneRecord.addElement(enSocre);
            oneRecord.addElement(mathScore);
//            oneRecord.addElement(totalScore);

            data.addElement(oneRecord);

        }
        return data;
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个粉刷匠1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值