介绍:
本项目只是一个简单图形化界面项目,该项目运用面向对象,JDBC连接MySQL数据库实现增、删、改、查,用于学习使用
技术栈:
开发工具:eclipse,Navicat,MySQL
开发语言:Java,MySQL
开发插件:swing,JFarm,mysql-connector-java-8.0.28.jar
开发过程:
1.建立数据库
首先我们先创建好对应的数据库,这是一个项目管理的一个数据库
要求:
具体代码:
/*
Navicat Premium Data Transfer
Source Server : A1
Source Server Type : MySQL
Source Server Version : 50628
Source Host : localhost:3306
Source Schema : project_db
Target Server Type : MySQL
Target Server Version : 50628
File Encoding : 65001
Date: 29/12/2023 11:19:23
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tb_prj
-- ----------------------------
DROP TABLE IF EXISTS `tb_prj`;
CREATE TABLE `tb_prj` (
`prj_id` int(11) NOT NULL AUTO_INCREMENT,
`prj_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`prj_cycle` int(11) NOT NULL,
`prj_count` int(11) NOT NULL,
`prj_manager` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`prj_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of tb_prj
-- ----------------------------
INSERT INTO `tb_prj` VALUES (16, '苍穹外卖', 2, 1, '张三');
SET FOREIGN_KEY_CHECKS = 1;
2.创建Java项目,并创建四个包
注意,这里我使用的是8.0版本,加载驱动时需要写cj
连接过具体代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBconnection {
static {
try {
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection connection = null;
try { // 获取jdbc,端口号,账号和密码
return connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/project_db?serverTimezone=GMT%2B8", "root", "1234");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
// 释放资源
public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
DBconnection conn = new DBconnection();
System.out.println(conn);
}
}
3.封装
写完了具体连接过程,接下来就需要封装字段,生成get和set,toString方法
package Project;
public class Project {
private int prjId;
private String prjName;
private int prjCycle;
private int prjCount;
private String prjManager;
public int getPrjId() {
return prjId;
}
public void setPrjId(int prjId) {
this.prjId = prjId;
}
public String getPrjName() {
return prjName;
}
public void setPrjName(String prjName) {
this.prjName = prjName;
}
public int getPrjCycle() {
return prjCycle;
}
public void setPrjCycle(int prjCycle) {
this.prjCycle = prjCycle;
}
public int getPrjCount() {
return prjCount;
}
public void setPrjCount(int prjCount) {
this.prjCount = prjCount;
}
public String getPrjManager() {
return prjManager;
}
public void setPrjManager(String prjManager) {
this.prjManager = prjManager;
}
@Override
public String toString() {
return "Project [prjId=" + prjId + ", prjName=" + prjName + ", prjCycle=" + prjCycle + ", prjCount=" + prjCount
+ ", prjManager=" + prjManager + "]";
}
}
4.执行语句
第四步最为关键,里面写入了实现刚才和SQL语句和存放SQL的数据
具体代码如下:
package Dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import DBconnection.DBconnection;
import Project.Project;
public class ProjectDao {
//查询
public ArrayList<Project>Query(String name){
//准备需要访问数据的对象
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
//存数数据的内容
ArrayList<Project>list=new ArrayList<Project>();
try {
//查询sql
String sqlString="select * from tb_prj where prj_name like ?";
//获取对象
connection=DBconnection.getConnection();
statement=connection.prepareStatement(sqlString);
statement.setString(1, "%"+name+"%");
//执行查询sql 并且返回resultset结果集
resultSet=statement.executeQuery();
while (resultSet.next()) {
Project project=new Project();
project.setPrjId(resultSet.getInt("prj_id"));
project.setPrjName(resultSet.getString("prj_name"));
project.setPrjCycle(resultSet.getInt("prj_cycle"));
project.setPrjCount(resultSet.getInt("prj_count"));
project.setPrjManager(resultSet.getString("prj_manager"));
//数据库里面每一条记录都要转化为单独的对象
list.add(project);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBconnection.close(connection, statement, resultSet);
}
return list;
}
//新增
public boolean add(Project project){
//准备需要访问数据的对象
Connection connection=null;
PreparedStatement statement=null;
try {
//新增sql
String sqlString="insert into tb_prj values(null,?,?,?,?)";
//获取对象
connection=DBconnection.getConnection();
statement=connection.prepareStatement(sqlString);
//替换问号 上面有几个问号 下面就有几个值
statement.setString(1, project.getPrjName());
statement.setInt(2, project.getPrjCycle());
statement.setInt(3, project.getPrjCount());
statement.setString(4, project.getPrjManager());
//执行语句并且返回
return statement.executeUpdate()>0;
} catch (Exception e) {
e.printStackTrace();
}finally {
DBconnection.close(connection, statement, null);
}
return false;
}
//删除
public boolean del(int id){
//准备需要访问数据的对象
Connection connection=null;
PreparedStatement statement=null;
try {
//删除sql
String sqlString="delete from tb_prj where prj_id=?";
//获取对象
connection=DBconnection.getConnection();
statement=connection.prepareStatement(sqlString);
//替换问号
statement.setInt(1, id);
return statement.executeUpdate()>0;
} catch (Exception e) {
e.printStackTrace();
}finally {
DBconnection.close(connection, statement, null);
}
return false;
}
}
这里我只写入了增、删、查,修改可根据自己的需要自行写入,(原理都是一样的,修改一下SQL语句,照葫芦画瓢也可以做哈哈哈)
5.写入窗体
写入窗体事件,也就是最后一步,这里注意,eclipse默认是没有JFrame插件的,需要我们自行去安装,具体步骤网上都有教程,这里就不一一演示了。
这里有两个要求,一个查看,一个新增,那么就需要两个界面了,我们首先写入第一个页面
查看页面:
查看页面只需要写入三个按钮就即可,数据都是对应数据库上的数据,具体代码如下:
package swing;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import java.awt.GridLayout;
import java.util.ArrayList;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import Dao.ProjectDao;
import Project.Project;
import javax.swing.JButton;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Demo {
private JFrame frame;
/**
* Launch the application.
*/
//列头
private static String[] head= {"序号","项目名称","项目周期","参与人数","项目负人"};
//数据源
private static Object[][]data;
private JTable table;
//查询
public static void init(String name) {
//创建数据库访问对象
ProjectDao dao=new ProjectDao();
//调用数据库访问方法 返回结果
ArrayList<Project> list=dao.Query(name);
//设置数据源 有N条记录 有5个字段
data= new Object [list.size()][5];
//把我们的数据循环的录入到data中
for (int i = 0; i < list.size(); i++) {
data[i][0]=list.get(i).getPrjId();
data[i][1]=list.get(i).getPrjName();
data[i][2]=list.get(i).getPrjCycle();
data[i][3]=list.get(i).getPrjCount();
data[i][4]=list.get(i).getPrjManager();
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Demo window = new Demo();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Demo() {
init("");
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setTitle("\u9879\u76EE\u7BA1\u7406\u7A97\u53E3");
frame.setBounds(100, 100, 864, 738);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JButton btnNewButton = new JButton("\u5237\u65B0");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//刷新
init("");
table.setModel(new DefaultTableModel(
data,
head
));
table.updateUI();
}
});
btnNewButton.setFont(new Font("宋体", Font.BOLD, 25));
btnNewButton.setBounds(78, 603, 172, 64);
frame.getContentPane().add(btnNewButton);
JButton btnNewButton_1 = new JButton("\u5220\u9664");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//删除
//1.删除的时候 先判定是否选择了一行
int rows=table.getSelectedRow();
if (rows==-1) {
JOptionPane.showMessageDialog(null, "删除必须选中一行");
}else {
int result=JOptionPane.showConfirmDialog(null, "是否确认删除","选择一个选项",JOptionPane.YES_NO_CANCEL_OPTION);
if (result==0) {
//选中行中的第一列
int id=(int) table.getValueAt(rows, 0);
ProjectDao dao=new ProjectDao();
if (dao.del(id)) {
JOptionPane.showMessageDialog(null, "删除成功");
}else {
JOptionPane.showMessageDialog(null, "删除失败");
}
//重点 不管结果如何 最后要刷新我们都数据
}
init("");
table.setModel(new DefaultTableModel(data, head));
table.updateUI();
}
}
});
btnNewButton_1.setFont(new Font("宋体", Font.BOLD, 25));
btnNewButton_1.setBounds(369, 603, 172, 64);
frame.getContentPane().add(btnNewButton_1);
JButton btnNewButton_2 = new JButton("\u65B0\u589E");
btnNewButton_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AddMain addMain=new AddMain();
addMain.frame.setVisible(true);
}
});
btnNewButton_2.setFont(new Font("宋体", Font.BOLD, 25));
btnNewButton_2.setBounds(614, 603, 172, 64);
frame.getContentPane().add(btnNewButton_2);
JPanel panel = new JPanel();
panel.setBounds(10, 0, 840, 541);
frame.getContentPane().add(panel);
panel.setLayout(new GridLayout(1, 0, 0, 0));
JScrollPane scrollPane = new JScrollPane();
panel.add(scrollPane);
table = new JTable();
//一定要将我们都数据绑定上去
table.setModel(new DefaultTableModel(
data,
head
));
scrollPane.setViewportView(table);
}
}
写入第一个界面,当我们点击新增时,就会跳转到新增选项卡界面
这里面面具体的跳转时间上面代码都已经写好了,我们只需要把新增选项卡界面写出来就行了
新增选项卡界面具体的代码实现如下:
package swing;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.JTextField;
import Dao.ProjectDao;
import Project.Project;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class AddMain {
JFrame frame;
private JTextField textField_name;
private JTextField textField_cycle;
private JTextField textField_count;
private JTextField textField_manager;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
AddMain window = new AddMain();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public AddMain() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setTitle("\u65B0\u589E\u9879\u76EE\u4FE1\u606F");
frame.setBounds(100, 100, 660, 667);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JLabel lblNewLabel = new JLabel("\u9879\u76EE\u540D\u79F0:");
lblNewLabel.setFont(new Font("宋体", Font.BOLD, 25));
lblNewLabel.setBounds(68, 42, 138, 48);
frame.getContentPane().add(lblNewLabel);
textField_name = new JTextField();
textField_name.setBounds(229, 42, 210, 48);
frame.getContentPane().add(textField_name);
textField_name.setColumns(10);
JLabel lblNewLabel_1 = new JLabel("\u9879\u76EE\u5468\u671F:");
lblNewLabel_1.setFont(new Font("宋体", Font.BOLD, 25));
lblNewLabel_1.setBounds(68, 128, 138, 48);
frame.getContentPane().add(lblNewLabel_1);
textField_cycle = new JTextField();
textField_cycle.setColumns(10);
textField_cycle.setBounds(229, 128, 158, 48);
frame.getContentPane().add(textField_cycle);
JLabel lblNewLabel_1_1 = new JLabel("\u53C2\u4E0E\u4EBA\u6570:");
lblNewLabel_1_1.setFont(new Font("宋体", Font.BOLD, 25));
lblNewLabel_1_1.setBounds(68, 214, 138, 48);
frame.getContentPane().add(lblNewLabel_1_1);
textField_count = new JTextField();
textField_count.setColumns(10);
textField_count.setBounds(229, 214, 158, 48);
frame.getContentPane().add(textField_count);
JLabel lblNewLabel_1_1_1 = new JLabel("\u9879\u76EE\u8D1F\u8D23\u4EBA:");
lblNewLabel_1_1_1.setFont(new Font("宋体", Font.BOLD, 25));
lblNewLabel_1_1_1.setBounds(68, 299, 144, 48);
frame.getContentPane().add(lblNewLabel_1_1_1);
textField_manager = new JTextField();
textField_manager.setColumns(10);
textField_manager.setBounds(229, 299, 210, 48);
frame.getContentPane().add(textField_manager);
JButton btnNewButton = new JButton("\u786E\u5B9A");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//新增数据
Project project=new Project();
project.setPrjName(textField_name.getText());
project.setPrjCycle(Integer.parseInt(textField_cycle.getText()));
project.setPrjCount(Integer.parseInt(textField_count.getText()));
project.setPrjManager(textField_manager.getText());
ProjectDao dao=new ProjectDao();
if (dao.add(project)) {
JOptionPane.showConfirmDialog(null, "新增成功");
}else {
JOptionPane.showConfirmDialog(null, "新增失败");
}
}
});
btnNewButton.setFont(new Font("宋体", Font.BOLD, 23));
btnNewButton.setBounds(68, 438, 144, 60);
frame.getContentPane().add(btnNewButton);
JButton btnNewButton_1 = new JButton("\u53D6\u6D88");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
btnNewButton_1.setFont(new Font("宋体", Font.BOLD, 23));
btnNewButton_1.setBounds(329, 438, 144, 60);
frame.getContentPane().add(btnNewButton_1);
}
}
OK,写到这就基本上全部写完了,接下来就是功能的测试
功能测试:
1.查看数据:
当点击运行按钮,默认就会打开查看页面
新增:
当点击新增按钮,就会显示新增选项卡:
新增成功
删除:
为了防止误删,当点击删除时,需要选择数据,还会有一个是否确认
完结:
好了,以上就是项目管理系统的全部代码实现过程了,喜欢的小伙伴可以点赞和收藏!!!