我的第一個專案----Java圖書管理系統
一,功能
(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進行簡單的資料庫增刪改查
(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 block
e.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;
}
}
}
(四),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 stub
String 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 stub
this.userNameTxt.setText("");
this.passwordTxt.setText("");
}
}
**重點::
(1),Java視覺化程式設計
- windowbuilder外掛的安裝
- 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的實現方法不好而且很多並沒有實際用處
相關推薦
我的第一個專案----Java圖書管理系統
一,功能 (1),使用者登入 (2),圖書類別管理 (3),圖書管理 (4),退出 二,工具 (1),JAVA程式設計:eclipes(1.8 soon版本) (2),SQL:mysql (3),Jdbc: jar(mysql-connect
Java圖書管理系統-專案編寫
主目錄 ---------------------- 系統功能 資料庫設計 在Eclips中建立專案 編寫公共類 主窗體設計 管理員登入模組設計 圖書資訊管理模組設計 圖書借閱、歸還模組設計 圖
java圖書管理系統實現
題目:編寫java程式碼,實現對圖書的管理,包括增刪改查、借閱及歸還。 實現程式碼如下: import java.util.Scanner; public class BookTest { public static void main(String[] args) { Sca
java --圖書管理系統 增刪改查
import java.util.Scanner; public class Task1 { public static void main(String[] args) { int id=0;//初始化id。 String[][] books = new String[3][5
Java 圖書管理系統
剛開始接觸Java,寫一個圖書管理系統熟悉熟悉介面和資料庫的操作。剛開始寫介面的時候感覺介面這塊比較雜,好多都不會。比如給容器新增背景圖片,新增到容器中,再將容器加入面板後老是變成很小的一個圖片,在網上找了好多部落格都沒能解決,後來無意中才解決了這個問題。資料庫也遇到過問題,最後用exe
Java圖書管理系統
Java圖書管理系統 設計人:wangyunpeng_bio 專案需求 隨著計算機的普及和應用水平的提高,經過考察比較,決定利用自己的Java知識開發小型的圖書管理系統,方便圖書的管理。 圖書管理系統是典型的資訊管理系統。本次作業利用JAVA開發工具Eclipse和MySQ
Java圖書管理系統練習程式(六)
本部分內容,主要實現對資料庫的基本操作,並更換資料訪問部分,將原來的使用檔案儲存更換為資料庫進行資料的儲存 在專案中,要引入mysql的驅動程式 在專案根目錄下,建立lib資料夾,將mysql的驅動程式複製到lib目錄下,然後在專案中引用 一、建立資料庫與資料表 資料庫名稱:d
Java圖書管理系統練習程式(五)
Java圖書管理系統練習程式(五) 本部分內容,主要實現對檔案讀寫操作的修改,使用泛型類的方式,實現對不同檔案進行相同的讀寫操作。 一.建立書籍資訊類 1.首先在bean包中,建立Book類,描述書籍的相關資訊,程式碼如下: package sky.book.bean; imp
Java圖書管理系統練習程式(四)
Java圖書管理系統練習程式(四) 本部分主要介紹List的基本操作與Java中泛型的使用。 一、Java中泛型的使用 泛型,即“引數化型別”。一提到引數,最熟悉的就是定義方法時有形參,然後呼叫此方法時傳遞實參。那麼引數化型別怎麼理解呢?顧名思義,就是將型別由原來的具體的型別引數化,類似
Java圖書管理系統練習程式(三)
Java圖書管理系統練習程式(三) 本部分內容主要實現將使用者資訊寫入檔案中,並在程式執行時,將檔案中的使用者資訊讀入到記憶體中,實現使用者資訊的儲存。 將Java物件序列化後,可以將物件儲存在檔案中,或者在網路中直接進行傳輸。 如果要實現序列化,只需讓該類實現Serializable介
Java圖書管理系統練習程式(二)
Java圖書管理系統練習程式(二) 第二部分 本部分主要實現系統使用者這部分的功能,實現使用者的註冊、登入、修改密碼等功能 程式各類及呼叫關係如下圖所示 一、建立user實體類 User實體類:id、username、password、email package sky.bo
Java圖書管理系統練習程式(一)
Java圖書管理系統練習程式 第一部分 該部分主要實現命令列方式的介面與無資料庫訪問的練習,通過本練習、主要掌握Java的基礎知識與面向物件程式設計思想、面向介面程式設計技術的知識與運用。 一、練習程式功能分析 該練習程式主要用於學習Java的基礎程式設計知識與面向
貼出我第一個手機Java程式
{ private Display display =null; public Mobile() ...{ // TODO 自動生成建構函式存根 } protectedvoid destroyApp(boolean arg0) throws MIDletState
用SSM框架實現簡單的專案-《圖書管理系統》
$(function () { /*三條件動態查詢*/ $("#queryBooks").click(function () { $("#pageNum").val(1); $("
【WPF on .NET Core 3.0】 Stylet演示專案 - 簡易圖書管理系統(1)
.NET Core 3.0已經發布了,除了一大堆令人激動的功能以外,也增加了對WPF的正式支援, 那麼WPF在.NET Core 3.0下的開發體驗如何呢? 本文利用了Stylet框架開發.NET Core 3.0上的WPF應用程式.關於Stylet框架, 可能大家比較陌生, 它是一個輕量級(但是非常優秀!)
【WPF on .NET Core 3.0】 Stylet演示專案 - 簡易圖書管理系統(3) - 使用Conductor切換頁面
前兩章中, 我們已經實現了這個圖書管理系統的登入視窗, 並實施了完善的單元測試. 該是時候回過頭來關注我們的主視窗了. 一個功能豐富的系統一般會有多個頁面, 我們圖書管理系統雖然是"簡易"的, 但是同樣也有多個頁面. 所以這一章中, 我們來學習如何使用Stylet的Conductor來管理頁面的切換. 事實
【WPF on .NET Core 3.0】 Stylet演示專案 - 簡易圖書管理系統(4) - 圖書列表介面
在前三章中我們完成了登入視窗, 並掌握了使用Conductor來切換視窗, 但這些其實都是在為我們的系統打基礎. 而本章中我們就要開始開發系統的核心功能, 即圖書管理功能了. 通過本章, 我們會接觸到以下知識點: 使用Stylet內建IoC 使用ViewModel First解耦UI 讓我們開始吧! 關於
JAVA小白學習的第一個程式碼—圖書管理系統
小白在實訓的學習實訓的第二週開始寫圖書管理系統程式碼,接下來是記錄學習的過程。 建立了一個Library 類和Booktest類 建立Library類對圖書管理系統 建立方法,然後在寫構造方法 package com.lenovo.w
第一個專案--學生管理系統的一點收穫
就在上週末,我們的第一個小專案(學生管理系統)終於結束了,回憶起這將就3周的經歷,突然有了一種成就感,感覺在不知不覺中就學到了好多的東西。現在就把我在這次實踐中的一些小小的心得寫出來跟大家一起分享。 首先學到的是關於Servlet的學習,關
Java web專案 圖書管理系統借書部分程式碼
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %> <%@ page import="com.dao.Bor