我的第一个项目----Java图书管理系统

 2023-09-05 阅读 146 评论 0

摘要:项目参考自:http://www.java1234.com/a/yuanchuang/swing2/ 项目视频及代码下载地址:链接:http://pan.baidu.com/s/1pLpQw2J 密码:cncv 项目开发环境的搭建:http://pan.baidu.com/s/1ntzhAmH#list/path=%2F 一,功能 (1

项目参考自:http://www.java1234.com/a/yuanchuang/swing2/
项目视频及代码下载地址:链接:http://pan.baidu.com/s/1pLpQw2J 密码:cncv
项目开发环境的搭建:http://pan.baidu.com/s/1ntzhAmH#list/path=%2F

一,功能

(1),用户登录
(2),图书类别管理
(3),图书管理
(4),退出

二,工具

(1),JAVA编程:eclipes(1.8 soon版本)
(2),SQL:mysql
(3),Jdbc: jar(mysql-connector-java-5.1.40-bin.jar)

三,效果展示

(1),登录

这里写图片描述

(2),主界面

这里写图片描述

(3),图书类别添加

这里写图片描述

(4),图书类别管理

这里写图片描述

(5),图书添加

这里写图片描述

(6),图书管理

这里写图片描述

(7),关于作者

这里写图片描述

四,数据库设计

这里写图片描述

(1),t_user表

这里写图片描述

(2),t_bookType表

这里写图片描述

(3),t_book表

这里写图片描述

(四),Java层次分析:

(1),逻辑图

这里写图片描述

(2),包结构

这里写图片描述

(五),数据库层级分析:

1, ER分析

这里写图片描述

2, 数据

用户: 用户编号,用户名,密码
图书类别:图书类别编号,图书类别名称
图书:图书编号,图书名称,图书作者,图书价格,图书描述,图书类别(外键)

图书类别与图书之间根据图书类别相互关联

3,数据库表的建立
(1),t_use 用户信息表
(2),t_bookType 图书类别管理表
(3),t_book 图书信息管理表

4,数据库表的关联(外键的关联)

这里写图片描述

(六),主要Java代码分析:

(1),Dao 类(以BookDao为例)

package com.java1234.dao;import java.sql.ResultSet;
import java.sql.SQLException;import com.java1234.model.Book;
import com.java1234.model.BookType;
import com.java1234.util.StringUtil;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;/*** 图书Dao类* @author H_Pioneer**/
public class BookDao {/*** 图书添加* @param con* @param book* @return* @throws Exception*/public int add(Connection con,Book book)throws Exception{String sql="insert into t_book values(null,?,?,?,?,?,?)";PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);pstmt.setString(1, book.getBookName());pstmt.setString(2, book.getAuthor());pstmt.setString(3, book.getSex());pstmt.setFloat(4, book.getPrice());pstmt.setInt(5, book.getBookTypeId());pstmt.setString(6, book.getBookDesc());return pstmt.executeUpdate();}/*** 图书信息查询* @param con* @param book* @return* @throws Exception*/public ResultSet list(Connection con,Book book)throws Exception{StringBuffer sb=new StringBuffer("select * from t_book b,t_bookType bt where b.bookTypeId=bt.id");if(StringUtil.isNotEmpty(book.getBookName())){sb.append(" and b.bookName like '%"+book.getBookName()+"%'");}if(StringUtil.isNotEmpty(book.getAuthor())){sb.append(" and b.author like '%"+book.getAuthor()+"%'");}if(book.getBookTypeId()!=null && book.getBookTypeId()!=-1){sb.append(" and b.bookTypeId="+book.getBookTypeId());}PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sb.toString());return pstmt.executeQuery();}/*** 图书信息删除* @param con* @param id* @return* @throws SQLException*/public int delete(Connection con,String id)throws Exception{String sql="delete from t_book where id=?";PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);pstmt.setString(1, id);return pstmt.executeUpdate();}/*** 图书信息修改* @param con* @param book* @return* @throws Exception*/public int update(Connection con,Book book)throws Exception{String sql="update t_book set bookName=?,author=?,sex=?,price=?,bookDesc=?,bookTypeId=? where id=?";PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);pstmt.setString(1, book.getBookName());pstmt.setString(2, book.getAuthor());pstmt.setString(3, book.getSex());pstmt.setFloat(4, book.getPrice());pstmt.setString(5, book.getBookDesc());pstmt.setInt(6, book.getBookTypeId());pstmt.setInt(7, book.getId());return pstmt.executeUpdate();}/*** * @param con* @param bookTypeId* @return* @throws Exception*/public boolean existBookByBookTypeId(Connection con,String bookTypeId)throws Exception{String sql="select * from t_book where bookTypeId=?";PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);pstmt.setString(1, bookTypeId);ResultSet rs = pstmt.executeQuery();String string = new String();return rs.next();}
}

*重点内容::

JDBC进行简单的数据库增删改查

详细参考:http://www.cnblogs.com/wuyuegb2312/p/3872607.html

(2),Model类(以BookModel为例)

package com.java1234.model;/*** 图书实体类* @author H_Pioneer**/
public class Book {private int id; //编号private String bookName;  //图书名称private String author;  //作者private String sex;  //性别private float price;  //价格private Integer bookTypeId;  //图书类别private String bookTypeName;  //图书类别名称private String bookDesc;  //备注public Book(int id2, String bookName, String author, String sex, float price, Integer bookTypeId, String bookDesc) {super();this.id = id2;this.bookName = bookName;this.author = author;this.sex = sex;this.price = price;this.bookTypeId = bookTypeId;this.bookDesc = bookDesc;}public Book(String bookName, String author, Integer bookTypeId) {super();this.bookName = bookName;this.author = author;this.bookTypeId = bookTypeId;}public Book(String bookName, String author, String sex, float price, Integer bookTypeId, String bookDesc) {super();this.bookName = bookName;this.author = author;this.sex = sex;this.price = price;this.bookTypeId = bookTypeId;this.bookDesc = bookDesc;}public Book() {super();// TODO Auto-generated constructor stub}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public Integer getBookTypeId() {return bookTypeId;}public void setBookTypeId(Integer bookTypeId) {this.bookTypeId = bookTypeId;}public String getBookTypeName() {return bookTypeName;}public void setBookTypeName(String bookTypeName) {this.bookTypeName = bookTypeName;}public String getBookDesc() {return bookDesc;}public void setBookDesc(String bookDesc) {this.bookDesc = bookDesc;}}

**重点内容::

(1),接口类的构造方法

(2),get,set方法

快捷键:
Shift+Alt+S –> Generate Getters and Setters –>选择你需要的get,set参数

(3),构造函数的使用
快捷键:
(1),Shift+Alt+S –>generate constructor using fields–>使用字段生成
(2),Shift+Alt+S –>generate constructors from…..–>不使用字段从父类获取

(三),Util类

package com.java1234.util;import java.sql.DriverManager;import com.mysql.jdbc.Connection;/*** 数据库工具类* @author H_Pioneer**/public class DbUtil {private String dbUrl = "jdbc:mysql://localhost:3306/db_book";//也可以写成private String dbUrl = "jdbc:mysql:///db_book";private String dbUserName = "root";private String dbPassword = "123456";private String jdbcName = "com.mysql.jdbc.Driver";/*** 获取数据库连接* @return* @throws Exception*/public Connection getCon()throws Exception{Class.forName(jdbcName);Connection con = (Connection) DriverManager.getConnection(dbUrl,dbUserName,dbPassword);//链接数据库return con;}/*** 关闭数据库连接* @param con* @throws Exception*/public void closeCon (java.sql.Connection con)throws Exception {if(con!=null){con.close();}}/*** * @param args*/public static void main(String[] args) {DbUtil dbUtil = new DbUtil();try {dbUtil.getCon();System.out.println("数据库连接成功");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();    //在命令行打印异常信息在程序中出错的位置及原因。System.out.println("数据库连接");}}}

数据库工具类

package com.java1234.util;import org.junit.Test;import com.mysql.jdbc.StringUtils;/*** 字符串工具类* @author H_Pioneer**/
public class StringUtil {/*** 判断是否为空* @param str* @return*/public static boolean isEmpty(String str){if(str==null||"".equals(str.trim())){return true;}else{return false;}}/*** 判断不为空* @param str* @return*/public static boolean isNotEmpty(String str){if(str!=null&&!"".equals(str.trim())){return true;}else{return false;}}
}

**重点::
工具类的使用
(1)
字符串工具类的总结:
http://www.cnblogs.com/DreamDrive/p/5760588.html
(2)
数据库工具类的总结:
http://kettas.iteye.com/blog/1222519

(四),Frm类(以登录和图书类别添加为例)

package com.java1234.view;import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.EmptyBorder;import com.java1234.dao.UserDao;
import com.java1234.model.User;
import com.java1234.util.DbUtil;
import com.java1234.util.StringUtil;
import com.mysql.jdbc.Connection;public class LogOnFrm extends JFrame {private JPanel contentPane;private final JTextField textField = new JTextField();private JPasswordField passwordTxt;private DbUtil dbUtil = new DbUtil();private UserDao userDao = new UserDao();private JTextField userNameTxt;/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {LogOnFrm frame = new LogOnFrm();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public LogOnFrm() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setAlwaysOnTop(true);setTitle("管理员登录");setBounds(100, 100, 450, 300);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);JLabel label = new JLabel("图书管理系统");label.setFont(new Font("黑体", Font.BOLD, 25));label.setIcon(new ImageIcon(LogOnFrm.class.getResource("/images/logo.png")));JLabel lblNewLabel = new JLabel("用户名:");lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 13));lblNewLabel.setIcon(new ImageIcon(LogOnFrm.class.getResource("/images/userName.png")));JLabel lblNewLabel_1 = new JLabel("密  码:");lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 13));lblNewLabel_1.setIcon(new ImageIcon(LogOnFrm.class.getResource("/images/password.png")));textField.setColumns(10);passwordTxt = new JPasswordField();JButton btnNewButton = new JButton("登录");btnNewButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {loginActionPerformed(e);    }});btnNewButton.setFont(new Font("宋体", Font.PLAIN, 13));btnNewButton.setIcon(new ImageIcon(LogOnFrm.class.getResource("/images/login.png")));JButton btnNewButton_1 = new JButton("重置");btnNewButton_1.setFont(new Font("宋体", Font.PLAIN, 13));btnNewButton_1.setIcon(new ImageIcon(LogOnFrm.class.getResource("/images/reset.png")));btnNewButton_1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {resetValueActionPerformed(e);}});userNameTxt = new JTextField();userNameTxt.setColumns(10);GroupLayout gl_contentPane = new GroupLayout(contentPane);gl_contentPane.setHorizontalGroup(gl_contentPane.createParallelGroup(Alignment.LEADING).addGroup(gl_contentPane.createSequentialGroup().addContainerGap().addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING).addGroup(gl_contentPane.createSequentialGroup().addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING).addGroup(gl_contentPane.createSequentialGroup().addComponent(textField, GroupLayout.PREFERRED_SIZE, 0, GroupLayout.PREFERRED_SIZE).addGap(223)).addGroup(gl_contentPane.createSequentialGroup().addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING, false).addComponent(lblNewLabel_1, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(btnNewButton, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addGap(50)).addGroup(gl_contentPane.createSequentialGroup().addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 93, GroupLayout.PREFERRED_SIZE).addGap(36))).addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING).addComponent(btnNewButton_1).addGroup(Alignment.LEADING, gl_contentPane.createParallelGroup(Alignment.TRAILING, false).addComponent(passwordTxt, Alignment.LEADING).addComponent(userNameTxt, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 114, Short.MAX_VALUE))).addGap(63)).addGroup(gl_contentPane.createSequentialGroup().addComponent(label, GroupLayout.PREFERRED_SIZE, 320, GroupLayout.PREFERRED_SIZE).addContainerGap()))));gl_contentPane.setVerticalGroup(gl_contentPane.createParallelGroup(Alignment.LEADING).addGroup(gl_contentPane.createSequentialGroup().addGap(18).addComponent(label).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(textField, GroupLayout.PREFERRED_SIZE, 0, GroupLayout.PREFERRED_SIZE).addGap(14).addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE).addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE).addComponent(userNameTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(45).addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE).addComponent(passwordTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addComponent(lblNewLabel_1, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE)).addGap(27).addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE).addComponent(btnNewButton_1, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE).addComponent(btnNewButton)).addContainerGap(13, Short.MAX_VALUE)));contentPane.setLayout(gl_contentPane);//设置居中显示this.setLocationRelativeTo(null);}/*** 登录事件处理* @param e*/protected void loginActionPerformed(ActionEvent e) {// TODO Auto-generated method stubString userName = this.userNameTxt.getText();String password = new String(this.passwordTxt.getPassword());if(StringUtil.isEmpty(userName)){JOptionPane.showMessageDialog(null,"用户名不能为空");return;}if(StringUtil.isEmpty(password)){JOptionPane.showMessageDialog(null,"密码不能为空");return;}User user = new User(userName,password);Connection con = null;try{con = dbUtil.getCon();User currentUser=userDao.login(con, user);if(currentUser!=null){//JOptionPane.showMessageDialog(null,"登录成功");   dispose();new MainFrm().setVisible(true);}else{JOptionPane.showMessageDialog(null,"用户名密码错误");}}catch(Exception e1){e1.printStackTrace();}}/*** 重置事件处理* @param evt*/private void resetValueActionPerformed(ActionEvent evt) {// TODO Auto-generated method stubthis.userNameTxt.setText("");this.passwordTxt.setText("");}
}

**重点::

(1),Java可视化编程

  1. windowbuilder插件的安装
  2. Window Builder→SWT Designer→SWT→Application Window→Next→窗口名→默认→Finish→s自动生成代码→Design

这里写图片描述

(2),对于按钮等添加事件如何与数据接口联系

对于JFrame,JLable,JTable等,右击可以选择重命名或者添加事件即可返回代码之中,一般我们会把操作进行封装,对事件进行相应的处理

(七),整个项目的分析与不足

1.MVC3层架构有问题(这个只有dao层)

正常的应该是dao层就接口不是实现类,现在的dao是正常的daoImpl,dao的实现类

2.实体类(com.java1234.model包下的)可以是entity,domain

应该尽量用entity或model,少用domain

3 DbUtil和StringUtil的实现方法不好而且很多并没有实际用处

转载于:https://www.cnblogs.com/H---/p/8835672.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/967.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息