最近数据库老师要求组一个小组并且完成一个题目
我们组选择的是学生选课系统,恰巧这学期刚好在学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;
}
}