java:在JTabel中实现对数据库的增删改查
作者:互联网
本文将展示将数据库中表的数据呈现在java的JTabel中并实现查询,添加,删除的功能。
涉及内容包括jdbc连接数据库、JTable表格、滚动面板的设置、java实现sql增删改查语句等。
PS: 本文实现对数据库驱动等的连接是通过properties类来保存相关属性,也可以在方法中直接书写。博主调用数据库的表是博主当时的课程设计,是一个病人基本信息的表格。
下面是示例:
添加操作:
删除操作:
1.创建propertie类保存连接数据库相关属性
driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
url = jdbc:sqlserver://127.0.0.1:1433;DatabaseName=hospital
user = sa
password = Yj0717
在桌面创建文本文档写入其中信息,在添加至eclipse中
2. 创建Config类来调用我们在sqlserber.properties中写的相关信息
package cn.edu.hnucm.util;
import java.io.FileInputStream;
import java.util.Properties;
//配置类
public class Config {
private static Properties p = null;
static {
try {
p = new Properties();
// 加载配置文件
p.load(new FileInputStream("config/sqlserver.properties"));
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取键对应的值
public static String getValue(String key) {
return p.get(key).toString();
}
}
之后便可以使用其中的getValue()方法调用。
3.连接数据库并在其中书写增删改查executeQuery和executeUpdate方法
(1)连接数据库基本操作
package dbutil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import config.Config;
public class DBexecute {
Connection conn;
private PreparedStatement pstm;
private ResultSet rs;
public Connection getConnection() throws Exception{
String Driver = Config.getValues("driver");//数据库驱动
String url = Config.getValues("url");//数据库连接
String user = Config.getValues("user");//获取登录用户名
String password = Config.getValues("password");//获取登录密码
try {
Class.forName(Driver);
conn = DriverManager.getConnection(url,user,password);
return conn;
} catch (Exception e){
throw new SQLException("驱动错误或连接失败!");
}
}
书写execuQuery方法,之后可在主界面中调用方法实现查询。
//查询操作
public ResultSet executeQurey(String sql,String[] data){
try {
//得到preparaStatement语句
pstm = conn.prepareStatement(sql);
if (data!=null){
for(int i=0;i<data.length;i++){
pstm.setString(i+1, data[i]);//注意是i+1
}
}
//执行sql语句
rs = pstm.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//返回查询结果集
return rs;
}
executeUpdate方法,实现插入、删除,不可以实现查询
//插入、删除操作
public int executeUpdate(String sql,String[] data){
int count = 0;
try {
pstm = conn.prepareStatement(sql);
if(data!=null){
for(int i=0;i<data.length;i++){
pstm.setString(i+1, data[i]);
}
count = pstm.executeUpdate();
}
}catch (Exception e){
e.printStackTrace();
}
//返回修改成功的行数
return count;
}
还有最后一个closeAll方法,用于关闭所有数据流
public void closeAll() {
// 如果rs不空,关闭rs
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 如果pstm不空,关闭pstm
if (pstm != null) {
try {
pstm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 如果conn不空,关闭conn
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
接下来,便是主界面的书写,通过监听器来实现功能。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import dbutil.DBexecute;
public class JTableDemo extends JFrame{
//滚动面板
private JScrollPane sptable;
//表格
private JTable table;
//放置按钮的面板
private JPanel panel;
//设置按钮
private JButton btsave,btdelete,btadd,btflush;
//设置默认表格格式
private DefaultTableModel model;
public JTableDemo() {
//调用父类方法设置标题
super("数据库数据");
//设置表格
model = new DefaultTableModel();
table = new JTable(model);
//将表格放入滚动面板中
sptable = new JScrollPane(table);
//将滚动面板放入主面板中部
this.add(sptable,BorderLayout.CENTER);
btsave = new JButton("保存");
btadd = new JButton("添加");
btdelete = new JButton("删除");
btflush = new JButton("刷新");
panel = new JPanel();
panel.add(btadd);
panel.add(btsave);
panel.add(btdelete);
panel.add(btflush);
btsave.setVisible(false);
this.add(panel,BorderLayout.SOUTH);
//显示初始数据
showData();
//设置界面基本数据
this.setSize(1000,600);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//添加监听器,因为每个实现的功能不同,所以这里使用匿名内部类来实现
btadd.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
addData();
}
});
btsave.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
saveDate();
}
});
btdelete.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
deleteDate();
}
});
btflush.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
showData();
}
});
}
showData其实就是对数据库表的再一次查询,并显示数据放入table中,其中使用了Vector集合来实现。
private void showData() {
// TODO Auto-generated method stub
String sql = "select* from patient";
DBexecute db = new DBexecute();
try {
//连接数据库
db.getConnection();
//获取返回集
ResultSet rs = db.executeQurey(sql, null);
//获取列名
ResultSetMetaData rsmt = rs.getMetaData();
//获取列数
int count = rsmt.getColumnCount();
//创建一个Vector集合存放列名title
Vector<String> title = new Vector<>();
//存放列名
for(int i=1;i<=count;i++){
title.add(rsmt.getColumnLabel(i));
}
//存放集合(行数据)的集合
Vector<Vector<String>> data = new Vector<Vector<String>>();
//判断表中有无数据
int rowCount = 0;
//将数据放入data中
while(rs.next()){
rowCount++;
//设置一个集合存放行数据,在放入data中
Vector<String> rowData = new Vector<>();
for(int i = 1;i<=count;i++){
rowData.add(rs.getString(i));
}
data.add(rowData);
}
if(rowCount==0){
//若行为0即数据库表中没有数据,便将title列名放入table即可
model.setDataVector(null, title);
}else {
//若有数据,则将调用setDataVector将title插入data的第0列
model.setDataVector(data, title);
}
}catch (Exception e){
e.printStackTrace();
JOptionPane.showMessageDialog(this, "系统错误!请仔细检查!");
}
}
addData方法,在表格下方加入一行全为0的行,输入数据后在点击保存(即调用saveData方法实现插入操作)。
private void addData() {
// TODO Auto-generated method stub
int rowCount = model.getRowCount();
//最好使用Object[]
model.insertRow(rowCount, new String[]{"0","0","0","0","0","0","0","0","0","0","0","0"});
btadd.setVisible(false);
btsave.setVisible(true);
}
saveData方法,插入操作的核心。其主要已经在上文的executeUpdate方法中实现,需联合起来阅读代码并理解。
private void saveDate() {
// TODO Auto-generated method stub
int rowCount = table.getRowCount()-1;
//获取自己填写的数据
String name = table.getValueAt(rowCount, 0).toString();
String sex = table.getValueAt(rowCount, 1).toString();
String age = table.getValueAt(rowCount, 2).toString();
String bdate = table.getValueAt(rowCount, 3).toString();
String idate = table.getValueAt(rowCount, 4).toString();
String num = table.getValueAt(rowCount, 5).toString();
String address = table.getValueAt(rowCount, 6).toString();
String link = table.getValueAt(rowCount, 7).toString();
String flink = table.getValueAt(rowCount, 8).toString();
String doctor = table.getValueAt(rowCount, 9).toString();
String email = table.getValueAt(rowCount, 10).toString();
String ps = table.getValueAt(rowCount, 11).toString();
DBexecute db = new DBexecute();
try{
db.getConnection();
String sql = "insert patient values(?,?,?,?,?,?,?,?,?,?,?,?)";
int count = db.executeUpdate(sql,new String[]{name,sex,age,bdate,idate,num,address,link,flink,doctor,email,ps});
showData();
btadd.setVisible(true);
btsave.setVisible(false);
if(count == 1){
JOptionPane.showMessageDialog(this, "插入数据成功!");
}else {
JOptionPane.showMessageDialog(this, "插入数据失败!");
}
}catch(Exception e){
e.printStackTrace();
}finally {
db.closeAll();
}
}
最后一个删除操作,deleteData方法。
private void deleteDate() {
// TODO Auto-generated method stub
int index[] = table.getSelectedRows();
if(index==null){
JOptionPane.showMessageDialog(this, "请选择需要删除的数据!","删除",JOptionPane.PLAIN_MESSAGE);
}else{
try {
int k = JOptionPane.showConfirmDialog(this, "是否要删除这条记录?", "删除", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (k == JOptionPane.YES_OPTION) {
DBexecute db = new DBexecute();
try {
db.getConnection();
String sql = "delete from patient where name=?";
String name = table.getValueAt(index[0], 0).toString();
int count = db.executeUpdate(sql, new String[] { name });
showData();
if (count == 1) {
JOptionPane.showMessageDialog(this, "删除数据成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, "删除数据失败!", "失败", JOptionPane.WARNING_MESSAGE);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
db.closeAll();
}
}
} catch (Exception ee) {
JOptionPane.showMessageDialog(this, "抱歉!删除数据失败!【系统异常!】", "失败:", 0);
}
}
}
最后在主函数中调用即可。
public static void main(String[] args){
new JTableDemo();
}
标签:JTabel,java,String,sql,改查,rowCount,new,import,table 来源: https://blog.csdn.net/Xixicjj/article/details/121884410