数据库
首页 > 数据库> > java:在JTabel中实现对数据库的增删改查

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