ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-12-12 14:59:12  阅读:148  来源: 互联网

标签:JTabel java String sql 改查 rowCount new import table


        本文将展示将数据库中表的数据呈现在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有