项目参考自: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

我的第一个项目----Java图书管理系统相关推荐

  1. [项目] Java 图书管理系统 CMD 版 (附源码)

  2. 复习Java第一个项目学生信息管理系统 04(权限管理和动态挂菜单功能) python简单爬数据实例Java面试题三次握手和四次挥手生活【记录一个咸鱼大学生三个月的奋进生活】016

    记录一个咸鱼大学生三个月的奋进生活016 复习Java(学生信息管理系统04权限管理和动态挂菜单功能) 改写MainFrame的构造方法 新增LoginFrame的验证登录是否成功的代码 新增Logi ...

  3. java图书管理系统技术难度_Java图书管理系统练习程序(一)

    Java图书管理系统练习程序 第一部分 该部分主要实现命令行方式的界面与无数据库访问的练习,通过本练习.主要掌握Java的基础知识与面向对象程序设计思想.面向接口编程技术的知识与运用. 一.练习程序功 ...

  4. java图书管理系统目的_java_图书管理系统java版,本文的目的就是通过图书管理 - phpStudy...

    图书管理系统java版 本文的目的就是通过图书管理系统掌握数据库编程技术,能正确连接数据库,能对数据库中信息进行查询.插入.删除.修改. 内容:在数据库中创建一张书目信息表,包括书名.作者.出版社.出 ...

  5. 视频教程-手把手实现Java图书管理系统(附源码)-Java

    手把手实现Java图书管理系统(附源码) 南京大学软件工程硕士,曾就职于擎天科技.中软国际.华为等上市公司,擅长Java开发.Web前端.Python爬虫.大数据等领域技术. 全栈工程师,从事软件开发 ...

  6. [附源码]计算机毕业设计JAVA图书管理系统

    [附源码]计算机毕业设计JAVA图书管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(Intell ...

  7. Java图书管理系统练习程序(四)

    2019独角兽企业重金招聘Python工程师标准>>> Java图书管理系统练习程序(四) 本部分主要介绍List的基本操作与Java中泛型的使用. 一.Java中泛型的使用 泛型, ...

  8. javaWeb项目之图书管理系统(附视频讲解)

    javaWeb项目之图书管理系统(附视频讲解) 视频播放地址:javaWeb图书系统 本系统为"Swing项目之图书管理系统"(此源码已共享)的Web版,网页框架用采用EasyUI ...

  9. java图书管理系统源码

    java图书管理系统源码 系统主要功能 读者:登录注册,借阅还书,查询书籍,查看当前借阅信息以及历史借阅信息,查看.查询读者借阅榜以及借阅书籍借阅榜,问题反馈以及查询反馈结果等功能. 管理员:对图书. ...

最新文章

  1. 20060911: 新机器·流氓软件
  2. 解决在vue中axios请求超时的问题
  3. SQL Server 2008 阻止保存要求重新创建表的更改问题的设置方法
  4. php pdo 怎么循环,php – 在循环内绑定PDO语句的参数
  5. Python内置类型—序列
  6. Windows 10 版本信息
  7. AT2376-[AGC014D]Black and White Tree【结论,博弈论】
  8. 20175223 MySQL
  9. shell编程之进阶篇一表达式
  10. 信息量、熵、相对熵与交叉熵的理解
  11. Glib2:error: Installed (but unpackaged) files found(七)
  12. 【转】spring MVC入门示例(hello world demo)
  13. php中的常用魔术方法总结
  14. chrome浏览器设置思源黑体
  15. _ASSERTE(_CrtIsValidHeapPointer(block))
  16. python做题记录之切西瓜
  17. 本周AI热点回顾:政府数据将开放共享、生命游戏发明者逝世、百度Apollo对外发布“ACE 交通引擎”
  18. 循序渐进大数据组件之--【Zookeeper 03】进阶(选举机制以及ZBA协议)
  19. c语言1 qnan,什么是 1.#QNAN?
  20. 《鸟哥的Linux私房菜》Chapter6 20180806~20180810

热门文章

  1. 超强在线小游戏网源码 内置80个小游戏 上传空间直接用
  2. php zip 归档使用工具,PHP 压缩与归档扩展 Zip_编程学问网
  3. 关于微型计算机的原理 叙述正确的是,微型计算机原理练习附答案概念.doc
  4. 假装windows系统升级界面html源码
  5. iframe跨域通信的通用解决方案-第二弹!(终极解决方案)
  6. 在 Windows 7 中禁用IPv6协议/IPv6隧道
  7. PclZip:强大的PHP压缩与解压缩zip类
  8. JavaScript 字符串转换数字
  9. LocalDateTime日期转换错误:JSON parse error: Cannot deserialize value of type java.time.LocalDateTime
  10. epoll实现socket通信