第一个Java项目———Java实现简单图书管理系统(GUI)

2023-10-31

       暑假写了个图书管理系统,编译器用的是eclipse,加入了WindowBuilder插件做界面(做的特丑),数据库用的是MySQL。

       实现了图书的查询,借阅,归还,删除,增加。用户的删除,查询。分为管理员和用户。

源码地址(GitHub):GitHub - best-bo-cai/books_management: 我的第一个java小项目:图书管理系统编译器用的是eclipse,加入了WindowBuilder插件做界面(做的特丑),数据库用的是MySQL。 实现了图书的查询,借阅,归还,删除,增加。用户的删除,查询。分为管理员和用户。

一,程序整体框架

从项目开始,无从下手,随着学习的深入,慢慢的熟悉了开发流程,先把整体框架搭起来,这个过程可以减少后续的一些麻烦,做数据库前先想好需求,把数据库做出来,我用的Navicat,管理表方便。然后把model类(实体类)写出来,一般是一个表写一个,把他单独放在一个包里,然后实现功能,需要界面做界面,需要工具做工具。界面单独放在一个包frame(或view),工具单独放在一个包里util,还有数据库访问层Dao.以上均为个人理解。

二,建立数据库表并连接

1,这是建的数据库表,用了四个表:用户表,管理员表,图书表,借书记录表。

上面这个表有个问题,phone前多了个空格,后面出错好几次,在代码中加了空格才对,不细心导致的,要注意。

2,连接数据库操作放在了util包下,要用到JDBC

package com.java.util;

/**
 * 数据库工具类
 */
import java.sql.Connection;
import java.sql.DriverManager;

public class Connect {
	Connection con;
	/**
	 * 连接数据库
	 * @return
	 */
	public Connection loding() {//加载数据库
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			System.out.println("成功加载数据库驱动!");
		}
		catch(Exception e){
			System.out.println("加载数据库驱动出错!");
			e.printStackTrace();//在命令行打印异常信息在程序中出错的位置及原因
		}
		//连接数据库
		try {
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/book_admin?serverTimezone=UTC","root","147258369");//这里是MySQL数据库的用户名和密码
			System.out.println("成功连接数据库服务器");
		}
		catch(Exception e1){
			System.out.println("连接数据库服务器出现错误");
		}
		
		return con;
	}
	/**
	 * 关闭数据库
	 * @param con
	 * @throws Exception
	 */
	public void closeCon (java.sql.Connection con)throws Exception {//关闭数据库
        if(con!=null){
            con.close();
        }
    }
}

util包下还有另一个类,判断字符串是否为空的类

package com.java.util;
/**
 * 判断字符串是否为空
 * @author admin
 *
 */
public class StringNull {
	/**
	 * 判断是否为空
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(String str)  {
		if(str==null||"".equals(str.trim())) {
			return true;//1真
		}else {
			return false;//0假
		}
	}
	/**
	 * 判断是否不为空
	 * @param str
	 * @return
	 */
	public static boolean isNotEmpty(String str) {
		if(str!=null&&!"".equals(str.trim())) {
			return true;
		}else {
			return false;
		}
	}
}

三,界面

我的界面很简洁,因为难的不会,这不重要。

首先看看主界面,用的WindowBuilder插件做的。

注册界面,只能注册用户,不能注册管理员。

功能界面,写了两个界面,一个用户的,一个管理员的。

    查询界面,借阅界面,归还界面,开始没规划好,就放在了一个界面

删除功能,以删除界面演示,删除用户一样 

添加图书

查找图书

四,包及其下的类

1,model下的实体类

以图书类为例子,get/set方法和构造方法都可以自动生成,如下图,先鼠标右击(前提先写好成员变量)

哇 

package com.java.model;
/**
 * 图书信息
 * @author admin
 *
 */
public class Book {
	private int book_id;//图书编号
	private String book_name;//图书姓名
	private String book_writer;//作者
	private String book_publish;//出版社
	private String book_status;//状态
	
	public Book() {
		super();
	}
	
	public Book(int book_id) {
		super();
		this.book_id = book_id;
	}

	public Book(int book_id, String book_name, String book_writer, String book_publish, String book_status) {
		super();
		this.book_id = book_id;
		this.book_name = book_name;
		this.book_writer = book_writer;
		this.book_publish = book_publish;
		this.book_status = book_status;
	}

	public int getBook_id() {
		return book_id;
	}
	public void setBook_id(int book_id) {
		this.book_id = book_id;
	}
	public String getBook_name() {
		return book_name;
	}
	public void setBook_name(String book_name) {
		this.book_name = book_name;
	}
	public String getBook_writer() {
		return book_writer;
	}
	public void setBook_writer(String book_writer) {
		this.book_writer = book_writer;
	}
	public String getBook_publish() {
		return book_publish;
	}
	public void setBook_publish(String book_publish) {
		this.book_publish = book_publish;
	}
	public String getBook_status() {
		return book_status;
	}
	public void setBook_status(String book_status) {
		this.book_status = book_status;
	}
}

Dao包下的数据库访问层,以Book为例

package com.java.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.java.model.Book;
import com.java.util.StringNull;

/**
 * 
 * @author admin
 *
 */
public class BookDao {
	/**
	 * 查询图书
	 * @param con
	 * @param book
	 * @return
	 * @throws Exception
	 */
	public ResultSet query(Connection con,Book book)throws Exception{
		ResultSet resultUser = null;
		StringBuffer sql = new StringBuffer("select * from book");
		
		//数据库模糊查询
		if(StringNull.isNotEmpty(book.getBook_name())) {
			sql.append(" and book_name like '%"+book.getBook_name()+"%'");
		}
		 
		if(StringNull.isNotEmpty(book.getBook_writer())) {
			sql.append(" and book_writer like '%"+book.getBook_writer()+"%'");
		}
		
		if(StringNull.isNotEmpty(book.getBook_publish())) {
			sql.append(" and book_publish like '%"+book.getBook_publish()+"%'");
		}
		
		PreparedStatement pstmt = (PreparedStatement)con.prepareStatement(sql.toString().replaceFirst("and", "where"));
		return pstmt.executeQuery(); 
	}
	/**
	 * 查询图书
	 * @param con
	 * @param book
	 * @return
	 * @throws Exception
	 */
	public ResultSet query2(Connection con,Book book)throws Exception{
		ResultSet resultUser = null;
		String sql = "select * from book where book_id=?";
		PreparedStatement pstmt = (PreparedStatement)con.prepareStatement(sql);
		
		pstmt.setInt(1, book.getBook_id());
		
		return pstmt.executeQuery();
	}
	/**
	 * 图书信息修改
	 * @param con
	 * @param book
	 * @return
	 * @throws Exception
	 */
	public int update(Connection con,Book book)throws Exception {
		String sql = "update book set book_status=? where book_id=?";
		PreparedStatement pstmt = (PreparedStatement)con.prepareStatement(sql);
	
		pstmt.setString(1, book.getBook_status());
		pstmt.setInt(2, book.getBook_id());
		
		return pstmt.executeUpdate();
	}
	/**
	 * 添加图书信息
	 * @param con
	 * @param book
	 * @return
	 * @throws Exception
	 */
	public int add(Connection con,Book book)throws Exception{
		String sql  = "insert into book values(?,?,?,?,?)";
		PreparedStatement pstmt = (PreparedStatement)con.prepareStatement(sql);
		
		pstmt.setInt(1, book.getBook_id());
		pstmt.setString(2, book.getBook_name());
		pstmt.setString(3, book.getBook_writer());
		pstmt.setString(4, book.getBook_publish());
		pstmt.setString(5, book.getBook_status());
		
		return pstmt.executeUpdate();
	}
	public int delete(Connection con,int bookId) throws Exception{
		String sql = "delete from book where book_id = ?";
		PreparedStatement pstmt = con.prepareStatement(sql);
		pstmt.setInt(1, bookId);
		return pstmt.executeUpdate();
	}
}

frame包下的视图层和控制功能,以图书查询,借阅,归还界面为例,大部分代码是WindowBuilder插件生成的。

package com.java.frame;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JTextField;
import javax.swing.JFormattedTextField;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Vector;
import java.awt.event.ActionEvent;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import com.java.dao.BookDao;
import com.java.dao.BookInformationDao;
import com.java.model.Book;
import com.java.model.BookInformation;
import com.java.util.Connect;
import com.java.util.StringNull;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class QueryBookInterface extends JFrame {

	private JPanel contentPane;
	private JTextField book_nameTxt;
	private JTextField book_writerTxt;
	private JTextField book_publishTxt;
	private Connect conutil= new Connect();
	private BookDao bookDao= new BookDao();
	private BookInformationDao bookInformationDao = new BookInformationDao();
	public static String readerName;
	public static String adminName;

	/**
	 * Launch the application.
	 */
	JFrame frame = new JFrame();
	private JTable bookTable;
	private JPanel panel;
	private JLabel lblNewLabel;
	private JButton borrowButton;
	private JLabel label;
	private JLabel label_4;
	private JLabel label_5;
	private JTextField book_RBnameTxt;
	private JTextField book_RBwriterTxt;
	private JTextField book_RBpublishTxt;
	private JTextField book_RBstatusTxt;
	private JButton returnButton;
	private JTextField book_RBidTxt;
	/**
	 * Create the frame.
	 */
	public QueryBookInterface() {
		setTitle("\u56FE\u4E66\u7684\u67E5\u8BE2\uFF0C\u501F\u9605\uFF0C\u5F52\u8FD8");
		setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		setBounds(100, 100, 920, 686);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		
		JButton queryButton = new JButton("\u67E5\u8BE2");
		queryButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				queryBookTable(e);
			}
		});
		
		JLabel label_1 = new JLabel("\u56FE\u4E66\u540D\u5B57:");
		
		JLabel label_2 = new JLabel("\u56FE\u4E66\u4F5C\u8005\uFF1A");
		
		JLabel label_3 = new JLabel("\u51FA\u7248\u793E\uFF1A");
		
		book_nameTxt = new JTextField();
		book_nameTxt.setColumns(10);
		
		book_writerTxt = new JTextField();
		book_writerTxt.setColumns(10);
		 
		book_publishTxt = new JTextField();
		book_publishTxt.setColumns(10);
		
		JScrollPane scrollPane = new JScrollPane();
		
		panel = new JPanel();
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane.setHorizontalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_contentPane.createSequentialGroup()
							.addGap(42)
							.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
								.addComponent(label_2)
								.addComponent(label_1)
								.addComponent(label_3))
							.addGap(28)
							.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
								.addComponent(queryButton, GroupLayout.PREFERRED_SIZE, 132, GroupLayout.PREFERRED_SIZE)
								.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING, false)
									.addComponent(book_nameTxt)
									.addComponent(book_writerTxt)
									.addComponent(book_publishTxt, GroupLayout.PREFERRED_SIZE, 286, GroupLayout.PREFERRED_SIZE))))
						.addGroup(gl_contentPane.createSequentialGroup()
							.addContainerGap()
							.addComponent(panel, GroupLayout.PREFERRED_SIZE, 435, GroupLayout.PREFERRED_SIZE)))
					.addGap(34)
					.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 388, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(21, Short.MAX_VALUE))
		);
		gl_contentPane.setVerticalGroup(
			gl_contentPane.createParallelGroup(Alignment.TRAILING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_contentPane.createSequentialGroup()
							.addGap(42)
							.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE))
						.addGroup(gl_contentPane.createSequentialGroup()
							.addGap(84)
							.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
								.addComponent(label_1)
								.addComponent(book_nameTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
							.addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE)
							.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
								.addComponent(label_2)
								.addComponent(book_writerTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
							.addGap(51)
							.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
								.addComponent(label_3)
								.addComponent(book_publishTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
							.addGap(18)
							.addComponent(queryButton, GroupLayout.PREFERRED_SIZE, 36, GroupLayout.PREFERRED_SIZE)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(panel, GroupLayout.PREFERRED_SIZE, 277, GroupLayout.PREFERRED_SIZE)
							.addGap(11)))
					.addGap(21))
		);
		
		lblNewLabel = new JLabel("\u56FE\u4E66\u540D\u5B57\uFF1A");
		
		borrowButton = new JButton("\u501F\u9605");
		borrowButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				borrowBook();
			}
		});
		
		label = new JLabel("\u4F5C\u8005\uFF1A");
		
		label_4 = new JLabel("\u51FA\u7248\u793E\uFF1A");
		
		label_5 = new JLabel("\u72B6\u6001\uFF1A");
		
		book_RBnameTxt = new JTextField();
		book_RBnameTxt.setColumns(10);
		
		book_RBwriterTxt = new JTextField();
		book_RBwriterTxt.setColumns(10);
		
		book_RBpublishTxt = new JTextField();
		book_RBpublishTxt.setColumns(10);
		
		book_RBstatusTxt = new JTextField();
		book_RBstatusTxt.setColumns(10);
		
		returnButton = new JButton("\u5F52\u8FD8");
		returnButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				returnBook();
			}
		});
		
		JLabel label_6 = new JLabel("\u7F16\u53F7\uFF1A");
		
		book_RBidTxt = new JTextField();
		book_RBidTxt.setColumns(10);
		GroupLayout gl_panel = new GroupLayout(panel);
		gl_panel.setHorizontalGroup(
			gl_panel.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel.createSequentialGroup()
					.addGap(28)
					.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
						.addComponent(lblNewLabel)
						.addComponent(label)
						.addComponent(label_4)
						.addComponent(label_5)
						.addComponent(label_6))
					.addGap(32)
					.addGroup(gl_panel.createParallelGroup(Alignment.TRAILING)
						.addComponent(book_RBidTxt, GroupLayout.DEFAULT_SIZE, 286, Short.MAX_VALUE)
						.addGroup(gl_panel.createSequentialGroup()
							.addComponent(borrowButton)
							.addPreferredGap(ComponentPlacement.RELATED, 160, Short.MAX_VALUE)
							.addComponent(returnButton))
						.addComponent(book_RBwriterTxt, Alignment.LEADING, 286, 286, Short.MAX_VALUE)
						.addComponent(book_RBnameTxt, GroupLayout.DEFAULT_SIZE, 286, Short.MAX_VALUE)
						.addComponent(book_RBpublishTxt, Alignment.LEADING, 286, 286, Short.MAX_VALUE)
						.addComponent(book_RBstatusTxt, Alignment.LEADING, 286, 286, Short.MAX_VALUE))
					.addContainerGap())
		);
		gl_panel.setVerticalGroup(
			gl_panel.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel.createSequentialGroup()
					.addGap(22)
					.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
						.addComponent(lblNewLabel)
						.addComponent(book_RBnameTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(24)
					.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
						.addComponent(label)
						.addComponent(book_RBwriterTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(18)
					.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
						.addComponent(label_4)
						.addComponent(book_RBpublishTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(18)
					.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
						.addComponent(label_5)
						.addComponent(book_RBstatusTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(18)
					.addGroup(gl_panel.createParallelGroup(Alignment.TRAILING)
						.addComponent(book_RBidTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addComponent(label_6))
					.addPreferredGap(ComponentPlacement.RELATED, 17, Short.MAX_VALUE)
					.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
						.addComponent(returnButton)
						.addComponent(borrowButton))
					.addContainerGap())
		);
		panel.setLayout(gl_panel);
		
		bookTable = new JTable();
		bookTable.addMouseListener(new MouseAdapter() {
			@Override
			public void mousePressed(MouseEvent e) {
				bookTableMousePressed(e);
			}
		});
		bookTable.setFillsViewportHeight(true);
		bookTable.setModel(new DefaultTableModel(
			new Object[][] {
			},
			new String[] {
				"\u7F16\u53F7", "\u56FE\u4E66\u540D\u5B57", "\u4F5C\u8005", "\u51FA\u7248\u793E", "\u72B6\u6001"
			}
		) {
			boolean[] columnEditables = new boolean[] {
				false, false, false, false, false
			};
			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		scrollPane.setViewportView(bookTable);
		contentPane.setLayout(gl_contentPane);

		this.fillTable(new Book());//初始化图书信息
	}
	/**
	 * 归还图书函数
	 */
	protected void returnBook() {
		String bookId = this.book_RBidTxt.getText();
		String bookName = this.book_RBnameTxt.getText();
		String bookPublish =this.book_RBpublishTxt.getText();
		String bookWriter = this.book_RBwriterTxt.getText();
		String bookStatus = this.book_RBstatusTxt.getText();
		
		if(StringNull.isEmpty(bookId)) {
			JOptionPane.showMessageDialog(null, "图书信息不能为空!");
			return ;
		}
		
		Connection con = null;
		try {
			BookInformation bi = new BookInformation(Integer.parseInt(bookId));
			Book book = new Book(Integer.parseInt(bookId));
			book.setBook_status("0");//把图书状态改变为0
			
			con = conutil.loding();
			ResultSet rs = bookInformationDao.returnn(con,bi);//得到符合bookId的那一行。
			
			//读者对比,只有借此书的读者才能还此书
			if((rs.next() && rs.getString(2).equals(readerName))||((StringNull.isNotEmpty(adminName))&&rs.getString(5).equals("1"))) {
				bookInformationDao.delete(con, Integer.parseInt(bookId));//删除借书表里的哪一行数据
				bookDao.update(con, book);//更新图书表中的图书状态
				JOptionPane.showMessageDialog(null, "归还成功!");
				return ;
			}else{
				JOptionPane.showMessageDialog(null, "归还失败!");
				return ;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				conutil.closeCon(con);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}
	/**
	 * 接受用户ID,从其它类接受
	 * @param id
	 */
	public static void setReaderId(String name) {
		readerName = name;
	}
	public static void setAdminId(String name) {
		adminName = name;
	}
	/**
	 *  借书
	 */
	private void borrowBook() {
		String bookId = this.book_RBidTxt.getText();
		String bookName = this.book_RBnameTxt.getText();
		String bookPublish = this.book_RBpublishTxt.getText();
		String bookWriter = this.book_RBwriterTxt.getText();
		String bookStatus = this.book_RBstatusTxt.getText();
		
		if(StringNull.isEmpty(bookId)) {
			JOptionPane.showMessageDialog(null, "图书信息不能为空!");
			return;
		}
		
		if(bookStatus.equals("1")) {
			JOptionPane.showMessageDialog(null, "该图书已被借走了!");
			return;
		}
		
		Connection con = null;
		try {
			con = conutil.loding();
			
			BookInformation bi;
			if(StringNull.isNotEmpty(readerName)) {
				bi = new BookInformation(Integer.parseInt(bookId), readerName, null, null, "1");//读者
			}else {
				bi = new BookInformation(Integer.parseInt(bookId), adminName, null, null, "1");//管理员
			}
			
			Book book =new Book(Integer.parseInt(bookId), bookName, bookWriter, bookPublish, "1");
			
			int find = bookInformationDao.add(con, bi);
			int flag = bookDao.update(con, book);
			if(1 != find ||1 != flag) {
				JOptionPane.showMessageDialog(null, "借阅失败!");
				return;
			}else {
				JOptionPane.showMessageDialog(null, "借阅成功!");
				return;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "借阅失败!");
			return ;
		}finally {
			try {
				conutil.closeCon(con);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}
	
	/**
	 * 添加到面板中
	 * @param e
	 */
	private void bookTableMousePressed(MouseEvent e) {
		int row = bookTable.getSelectedRow();
		book_RBnameTxt.setText((String)bookTable.getValueAt(row, 1));
		book_RBwriterTxt.setText((String)bookTable.getValueAt(row, 2));
		book_RBpublishTxt.setText((String)bookTable.getValueAt(row, 3));
		book_RBstatusTxt.setText((String)bookTable.getValueAt(row, 4));
		book_RBidTxt.setText((String)bookTable.getValueAt(row, 0));
	}
	/**
	 * 图书信息查询
	 */
	private void queryBookTable(ActionEvent e) {
		//书名查询,作者,出版社
		String book_name = this.book_nameTxt.getText();
		String book_writer = this.book_writerTxt.getText();
		String book_publish = this.book_publishTxt.getText();
		
		Book book =new Book();
		book.setBook_name(book_name);
		book.setBook_writer(book_writer);
		book.setBook_publish(book_publish);
		
		this.fillTable(book);
	}
	/**
	 * 初始化图书信息
	 * @param book
	 */
	private void fillTable(Book book) {
		DefaultTableModel dtm = (DefaultTableModel) bookTable.getModel();
		dtm.setRowCount(0);
		Connection con = null;
		try {
			con = conutil.loding();
			ResultSet rs = bookDao.query(con, book);
			while(rs.next()) {
				Vector v = new Vector();
				v.add(rs.getString("book_id"));
				v.add(rs.getString("book_name"));
				v.add(rs.getString("book_writer"));
				v.add(rs.getString("book_publish"));
				if(rs.getString("book_status").equals("1")) {
					v.add("已借出");
				}else {
					v.add("未借出");
				}
				dtm.addRow(v);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				conutil.closeCon(con);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一个Java项目———Java实现简单图书管理系统(GUI) 的相关文章

  • Java中如何动态添加charsequence[]中的数据?

    初始化的一种方法charsequence is charsequence item abc def 但我不想以这种方式初始化它 有人可以建议其他方式吗 比如我们初始化的方式string arrays 首先 修复变量声明 charsequen
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • 术语“引用”的起源,如“通过引用传递”

    Java C 语言律师喜欢说他们的语言按值传递引用 这意味着 引用 是调用函数时复制的对象指针 同时 在 C 中 以及 Perl 和 PHP 中更动态的形式 引用是其他名称 或动态情况下的运行时值 的别名 我对这里的词源感兴趣 参考 一词的
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • IntSummaryStatistics的summaryStatistics方法

    为什么空 IntStream 上的 summaryStatistics 方法返回整数的最大和最小值作为流中存在的最大和最小 int 值 IntStream intStream IntStream of IntSummaryStatistic
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • 整数与 int 比较

    我是新来的java 我现在正在学习非原始整数类型java 我知道以下比较无效并引发编译错误 String str c Char chr c if str chr return true 上面的代码片段给了我 Test java lineNu
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 如何找到 Oracle 数据库的 URL?

    如何找到 Oracle 数据库的 URL 和端口 Example jdbc oracle thin host port dbName 用户名 密码 是否有我可以查看的 SQL 命令或日志 配置文件 对于甲骨文来说 有一个tnsnames o
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • 将 XML 从网站解析到 Android 设备

    我正在启动一个 Android 应用程序 它将解析来自网络的 XML 我创建了一些 Android 应用程序 但它们从未涉及解析 XML 我想知道是否有人对最佳方法有任何建议 这是一个例子 try URL url new URL your
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • Wildfly 10.1 消耗所有核心

    我们最近将银行应用程序从 java 1 6 升级到 1 8 将 jboss 4 x 升级到 wildfly 10 1 我们观察到 java 消耗了机器上可用的所有核心 10 有人可以告诉是什么原因吗 通常情况下 jboss 4 x 的最大
  • 有没有办法处理Java堆空间异常[重复]

    这个问题在这里已经有答案了 我正在寻找将文件输入流转换为大文件 文件大小为 100MB 并且抛出 java lang OutOfMemoryError Java Heap space import java io FileInputStre
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List

随机推荐

  • STM32--0.96寸OLED显示屏

    1 OLED屏幕介绍 OLED有机发光二极管又称为有机激光显示 OL ED显示技术具有自发光的特性 采用非常薄的有机材料涂层 和玻璃基板 当有电流通过时 这些有机材料就会发光 而且OLED显示屏幕可视角大 功耗低 OL ED由于同时具备自发
  • 基于python的12306自动抢票系统的设计与实现

    铁路售票系统12306网站作为一个广受人们的日常使用工具 受大极大的关注 铁路售票的管理者都主要考虑降低成本 提升售票服务满意度 一年一度的春运和节假日出行高峰期 给众多的出行群众者带来了极大的烦恼 也给用户购买火车票造成了巨大的不方便 本
  • 未来几年学什么设计更有前途?

    设计 是把一种设想通过合理的规划 周密的计划 通过各种感觉形式传达出来的过程 是设计师有目标有计划的进行技术性的创作与创意活动 设计的任务不只是为生活和商业服务 同时也伴有艺术性的创作 它是一个很大范围的概念 如果单问未来几年学什么设计更有
  • 朴素贝叶斯分类器(Naive Bayes Classifiers)

    原文地址 Naive Bayes Classifiers 本文讨论的是朴素贝叶斯分类器 Naive Bayes classifiers 背后的理论以及其的实现 朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的一种算法 它不是单一存在的 而是
  • 西门子工业无线IWLAN和漏波电缆RCoax的安装与配置方法

    1 目的 安装和配置西门子IWLAN工业无线通信 包括工业无线AP 客户端和RCoax漏波电缆 从而实现两个PLC的无线通信 智能IO设备 博途工控人平时在哪里技术交流博途工控人社群 博途工控人平时在哪里技术交流博途工控人社群 2 硬件布置
  • 基于Vue + Antd 搭建自己的博客后台管理系统

    博客后台管理 博客前台的项目地址 github com WqhForGitHu 前言 博客后台管理是基于 Vue Antd 实现的 Antd 确实是非常适合中后台应用的开发 有非常多的组件可以使用 非常多的组件可以使用 技术栈 Vue an
  • 将秒数转化为日期、时、分、秒

    1 说明 笔者最近在开发过程中 需要进行时间上的处理的地方比较多 有时候没有处理好导致出现各种的错误 这里主要是讲一下 如何时将秒数的时间转化为 yyyy MM dd HH mm ss 的格式 例如 2016 12 04 16 40 23的
  • 全备份、增量备份与差量备份

    基本概念 全备份 做的一个完整备份 差量备份 以上一次的全备份为基本做的备份 增量备份 以上一次全备份或增量备份为基本做的备份 看了概念以后是不是还是一头雾水 呵呵 正常 不过没关系 下面会举例说明 如果版本库不是很大 直接做全备份就好了
  • python--打字练习的成绩判定

    题目 模拟打字练习程序 假设original为原始内容 user Inputs为用户输入的内容 要求 用户输入的内容长度不得大于原始内容长度 若对应位置字符一致 则认为正确 否则 判定输入错误 最后成绩为 正确的字符数量 原始字符串长度 按
  • Jsoup解析Html获取内容

    在做自己的博客时遇到问题 文章列表需要文章内容的第一段作为列表的内容展示 但是编辑采用的是富文本编辑器 内容为html格式 这是上网搜到Jsoup可以解析html 希望能帮到需要的小伙陪 p span style font size 6 3
  • msvcr110.dll丢失的解决方法哪种好,推荐这个4种解决方法

    Msvcr110 dll是Microsoft Visual Studio 2012的运行时组件之一 这个DLL文件包含一些用于Windows操作系统的C 函数库 当程序需要这些函数时 它们会被加载到内存中 以便程序可以使用它们 当计算机提示
  • 程序员挣够了钱,到中年失业真的很可怕吗?

    最近一刷知乎全部都是大龄程序员失业危机 真的有这么可怕吗 程序员35岁就真的到了瓶颈期 我不这么认为 挣够了钱 当然不可怕 问题是没挣够啊 按题主的算法是 大城市薪资1w以上 45岁失业 工作20年可以挣够钱 那我们现在来算一下 20年12
  • 《HarmonyOS物联网应用开发》课程上线

    讲师简介 51CTO的学员们 大家好 我是51CTO学院的新晋讲师许思维 目前就职于江苏润和软件股份有限公司 任高级软件工程师一职 同时也是企业内训讲师 我擅长的领域包括Linux系统编程 单片机编程 以及Android App和Andro
  • multiple definition of `qMain(int, char**)'错误该怎么处理!

    原因 在 pro文件中重复使用了一些文件
  • ECMAScript5,6,7从基本语法到高级函数

    尚硅谷ES5 6 7教程 01 尚硅谷 ECMAScript入门介绍 01 尚硅谷 ECMAScript入门介绍
  • 下载chromium源码执行 generate_location_tags.py错误returned non-zero exit status 1

    今天下载chromium 碰到这个错误 以前也下载过 都很顺利 Error Command python3 src testing generate location tags py out src testing location tag
  • SVD分解的并行实现

    在之前的文章中 我对SVD进行了大致的了解 它在互联网高端领域中有广泛的应用 至于它的一些详细应 用以后再进一步学习 现在主要的问题是如何有效地实现SVD分解 接下来我会先用两种方法来实现SVD分 解 即基于双边Jacobi旋转的SVD和基
  • Jieba库的安装

    一 jieba库安装 jieba库是第三方库 不是安装包自带 需要通过pip指令安装 gt pip install jieba 或者 pip3 install jieba 方法一 直接安装 不建议使用 亲测安装很多python库的时候大家获
  • Hierarchical attentive knowledge graph embedding for personalized recommendation

    Hierarchical attentive knowledge graph embedding for personalized recommendation 文章目录 1 背景 2 模型 2 1 子图构建 2 2 Hierarchica
  • 第一个Java项目———Java实现简单图书管理系统(GUI)

    暑假写了个图书管理系统 编译器用的是eclipse 加入了WindowBuilder插件做界面 做的特丑 数据库用的是MySQL 实现了图书的查询 借阅 归还 删除 增加 用户的删除 查询 分为管理员和用户 源码地址 GitHub GitH