天天看點

MyEclipse hibernate 配置

8.4 生成配置檔案hibernate.cfg.xml

Hibernate 運作時需要擷取一些底層實作的基本資訊,包括資料庫URL、資料庫使用者、資料庫使用者密碼、資料庫JDBC驅動類和資料庫dialect等。 Hibernate同時支援xml格式的配置檔案,以及傳統的properties檔案配置方式。本章采用基于xml格式檔案的配置方式,這些資訊都包含在預設名稱為hibernate.cfg.xml的檔案中。本節介紹如何在Eclipse中快速生成hibernate.cfg.xml檔案。

跟我做

(1)建立名稱為“Library”的Java工程。單擊【檔案】菜單,選擇【建立】|【其他】指令,打開如圖8-7所示的【建立】對話框。

(2)選擇【Hibernate Configuration File】選項,單擊【下一步】按鈕,在圖8-8的【輸入或選擇父檔案夾】文本框中選擇“Library”工程,單擊【下一步】按鈕,打開資料庫配置對話框。[img]http://book.csdn.net/BookFiles/440/img/image058.jpg[/img][img]http://book.csdn.net/BookFiles/440/img/image059.jpg[/img]

圖8-7 【建立】對話框 圖8-8 選擇工程名稱

(3)在資料源配置對話框中輸入如下資料庫配置資訊,如圖8-9所示。

● Database dialect:SQLServer

● Driver class:com.microsoft.jdbc.sqlserver.SQLServerDriver

● Connection URL:jdbc:microsoft:sqlserver://localhost:1433;databaseName=demo

● Username:sa(根據實際配置)

[img]http://book.csdn.net/BookFiles/440/img/image060.jpg[/img]

圖8-9 資料庫配置窗對話框

(4)單擊【完成】按鈕,在Library工程的根目錄下生成hibernate.cfg.xml檔案,其内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory >

<!--資料庫JDBC驅動類-->

<property name="hibernate.connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>

<!--資料庫密碼-->

<property name="hibernate.connection.password"></property>

<!--資料庫的URL-->

<property name="hibernate.connection.url">jdbc:microsoft:sqlserver://localhost:1433;databaseName=demo</property>

<!--資料庫的使用者名-->

<property name="hibernate.connection.username">sa</property>

<!--每個資料庫都有其對應的Dialet以比對其平台特性-->

<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>

</session-factory>

</hibernate-configuration>

hibernate.cfg.xml 檔案可以包含建構SessionFactory執行個體的所有配置資訊。當使用如下

代碼

SessionFactory sessions=new Configuration().configure().buildSessionFactory();

初始化 Hibernate時,Hibernate會在classpath中尋找檔案名為hibernate.cfg.xml的檔案。

%注意:如果運作時出現如圖8-10所示的錯誤資訊,這是因為在配置檔案中設定了session- factory的name屬性,這樣hibernate會試圖把這個sessionfactory注冊到jndi中去,進而報告錯誤。去掉name屬性即可,是以在hibernate.cfg.xml中不要設定session-factory的name屬性。

[img]http://book.csdn.net/BookFiles/440/img/image061.jpg[/img]圖8-10 配置session-factory name屬性後的出錯資訊

8.5 建立持久化對象

Hibernate 從本質上來講是一種“對象-關系型資料映射”(Object Relational Mapping 簡稱ORM)。POJO在這裡展現的就是ORM中Object層的語義,而映射(Mapping)檔案則是将對象(Object)與關系型資料(Relational)相關聯的紐帶,在Hibernate中,映射檔案通常以“.hbm.xml”作為字尾。

8.5.1 生成映射檔案和持久化對象

本小節介紹如何在Eclipse中根據資料庫中的表結構生成映射檔案和持久化對象。通過Hibernate Synchronizer插件可以友善地生成映射檔案和持久化對象,友善Hibernate應用的開發。

文本框: 圖8-11 【選擇透視圖】對話框跟我做

(1)單擊Eclipse的【視窗】菜單,選擇【打開透視圖】|【其他】指令,打開【選擇透視圖】對話框,如圖8-11所示。選擇【Hibernate Console】選項,單擊【确定】按鈕,打開Hibernate Console透視圖。

Hibernate Console透視圖包括Hibernate Configuration、Hibernate Dynamic Query Translator、Hibernate Entity Model和Hibernate Query Result等幾個視圖。

(2)右擊Hibernate Configuration視圖的空白區域,在快捷菜單中選擇【Add configuration】指令,打開【Create Hibernate Console Configuration】對話框,如圖8-12所示。

(3)單擊【Configuration file】文本框右側的按鈕并選擇“\Library\hibernate. cfg.xml”;單擊“Classpath”組中的按鈕将SQL Server資料庫的JDBC驅動類msbase.jar、mssqlserver.jar等加入到classpath中;在【Name】文本框中輸入 “Library”,單擊【完成】按鈕,建立名稱為“Library”的配置,如圖8-13所示。

圖8-12 生成hibernate Console Configuration 圖8-13 Hibernate Configuration視圖

文本框: 圖8-14 【Hibernate Code Generation】對話框(4)單擊工具欄中的按鈕右邊的下拉箭頭,在下拉菜單中選擇【Hibernate Code Generation】指令,打開如圖8-14所示的【Hibernate Code Generation】對話框。

(5)在【Hibernate Code Generation】對話框中的【Main】頁籤中輸入如下配置資訊:

● 名稱:codegeneration

● Console configuration:Library

● Output directory:\Library\src

● Package:library.hibernate

建立名稱為“codegeneration”的Hibernate Code Generation配置,生成的目标代碼存放在“\library\src”目錄下,其包名為“library.hibernate”。

(6)單擊【Exporters】頁籤選中如下各項,如圖8-15所示。

● Generate domain code(.java)

● JDK1.5 Constructs(generics,etc.)

● Generate DAO code(.java)

● Generate mappings(hbm.xml)

(7)單擊【運作】按鈕,在Library工程的“library.hibernate”包中生成如圖8-16所示的檔案。

圖8-15 Exporters配置 圖8-16 生成的映射檔案和持久化對象

8.5.2 對持久化對象的分析

BookBrowse.java、 Books.java和UserTable.java 3個生成的類是标準的JavaBean,Hibernate插件根據資料庫的表結構自動生成了3個持久化對象,對于每個屬性都有其對應的 getter/setter方法。

%注意:這3個類中的英文注釋是Hibernate插件自動生成的,為了便于讀者的了解,這裡加上了部分中文注釋。

(1)BookBrowse.java檔案是标準的 JavaBean對應于demo資料庫中的bookbrowse表,包括學生姓名、書名、歸還日期、借閱日期、備注和是否歸還等資訊。其代碼如下所示:

package library.hibernate;

// Generated 2006-8-5 16:17:23 by Hibernate Tools 3.1.0 beta3

import java.util.Date;

public class BookBrowse implements java.io.Serializable {

// Fields

//學生名字

private String studentName;

//書名

private String bookName;

//歸還日期

private Date returnDate;

//借閱日期

private Date borrowDate;

//備注,評論資訊

private String com;

//是否歸還

private String isReturned;

// Constructors

public BookBrowse() {

}

public BookBrowse(String studentName) {

this.studentName = studentName;

}

public BookBrowse(String studentName, String bookName, Date returnDate, Date borrowDate, String com, String isReturned) {

this.studentName = studentName;

this.bookName = bookName;

this.returnDate = returnDate;

this.borrowDate = borrowDate;

this.com = com;

this.isReturned = isReturned;

}

// Property accessors 取得學生姓名

public String getStudentName() {

return this.studentName;

}

//設定學生姓名

public void setStudentName(String studentName) {

this.studentName = studentName;

}

//取得書名字段的值

public String getBookName() {

return this.bookName;

}

//設定書名字段

public void setBookName(String bookName) {

this.bookName = bookName;

}

//取得歸還日期字段

public Date getReturnDate() {

return this.returnDate;

}

//設定歸還日期字段

public void setReturnDate(Date returnDate) {

this.returnDate = returnDate;

}

//取得借閱日期

public Date getBorrowDate() {

return this.borrowDate;

}

//設定借閱日期

public void setBorrowDate(Date borrowDate) {

this.borrowDate = borrowDate;

}

//取得備注資訊

public String getCom() {

return this.com;

}

//設定備注資訊

public void setCom(String com) {

this.com = com;

}

//取得是否歸還狀态

public String getIsReturned() {

return this.isReturned;

}

//設定是否歸還狀态

public void setIsReturned(String isReturned) {

this.isReturned = isReturned;

}

}

(2)Books.java類對應于demo資料庫中的books表,是标準的JavaBean,包括書名、出版社、作者、位址、出版日期和價格等相關資訊。其代碼如下所示:

package library.hibernate;

// Generated 2006-8-5 16:17:23 by Hibernate Tools 3.1.0 beta3

import java.util.Date;

public class Books implements java.io.Serializable {

// Fields

//書名

private String bookName;

//出版社

private String press;

//作者

private String author;

//位址

private String address;

//出版日期

private Date pressDate;

//價格

private Double price;

//備注

private String com;

//圖書數量

private Integer booksCount;

//已借閱數量

private Integer borrowedCount;

// Constructors

public Books() {

}

public Books(String bookName) {

this.bookName = bookName;

}

public Books(String bookName, String press, String author, String address, Date pressDate, Double price, String com, Integer booksCount, Integer borrowedCount) {

this.bookName = bookName;

this.press = press;

this.author = author;

this.address = address;

this.pressDate = pressDate;

this.price = price;

this.com = com;

this.booksCount = booksCount;

this.borrowedCount = borrowedCount;

}

// Property accessors

//取得書名屬性的值

public String getBookName() {

return this.bookName;

}

//設定書名屬性

public void setBookName(String bookName) {

this.bookName = bookName;

}

//取得出版社字段的值

public String getPress() {

return this.press;

}

//設定出版社字段

public void setPress(String press) {

this.press = press;

}

//取得作者資訊

public String getAuthor() {

return this.author;

}

//設定作者資訊

public void setAuthor(String author) {

this.author = author;

}

//取得位址資訊

public String getAddress() {

return this.address;

}

//設定位址資訊

public void setAddress(String address) {

this.address = address;

}

//取得出版日期

public Date getPressDate() {

return this.pressDate;

}

//設定出版日期

public void setPressDate(Date pressDate) {

this.pressDate = pressDate;

}

//取得價格資訊

public Double getPrice() {

return this.price;

}

//設定價格資訊

public void setPrice(Double price) {

this.price = price;

}

//取得備注資訊

public String getCom() {

return this.com;

}

//設定備注資訊

public void setCom(String com) {

this.com = com;

}

//取得圖書數量

public Integer getBooksCount() {

return this.booksCount;

}

//設定圖書數量

public void setBooksCount(Integer booksCount) {

this.booksCount = booksCount;

}

//取得已借閱圖書數量

public Integer getBorrowedCount() {

return this.borrowedCount;

}

//設定已借閱圖書數量

public void setBorrowedCount(Integer borrowedCount) {

this.borrowedCount = borrowedCount;

}

}

(3)UserTable.java類對應于 demo資料庫中的usertable表,包括使用者名、密碼和使用者權限3個屬性,是标準的JavaBean。其代碼如下所示:

package library.hibernate;

// Generated 2006-8-5 16:17:23 by Hibernate Tools 3.1.0 beta3

public class UserTable implements java.io.Serializable {

// Fields

//使用者名

private String userName;

//密碼

private String password;

//使用者權限

private String power;

// Constructors

public UserTable() {

}

public UserTable(String userName) {

this.userName = userName;

}

public UserTable(String userName, String password, String power) {

this.userName = userName;

this.password = password;

this.power = power;

}

// Property accessors

//取得使用者名字段

public String getUserName() {

return this.userName;

}

//設定使用者名字段

public void setUserName(String userName) {

this.userName = userName;

}

//取得密碼字段

public String getPassword() {

return this.password;

}

//設定密碼字段

public void setPassword(String password) {

this.password = password;

}

//取得使用者權限

public String getPower() {

return this.power;

}

//設定使用者權限

public void setPower(String power) {

this.power = power;

}

}

8.6 建立映射檔案

Hibernate之是以能夠判斷實體類和資料表之間的對應關系,是因為有XML映射檔案。通過Hibernate Code Generation既可以生成持久化對象也可以生成映射檔案。本節介紹在8.5節中生成的BookBrowse.hbm.xml、 Books.hbm.xml、UserTable.hbm.xml 3個映射檔案。

BookBrowse.hbm.xml描述了 BookBrowse類和bookbrowse表之間的映射關系,其内容如下所示:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- Generated 2006-8-5 16:17:23 by Hibernate Tools 3.1.0 beta3 -->

<hibernate-mapping>

<!--library.hibernate.BookBrowse 類和bookbrowse表對應關系描述-->

<classname="library.hibernate.BookBrowse"table="bookBrowse"schema="dbo"catalog=

"demo">

<!--studentName屬性對應StudentName字段-->

<id name="studentName" type="string">

<column name="StudentName" length="40" />

<generator class="assigned" />

</id>

<!--bookName屬性對應BookName字段 -->

<property name="bookName" type="string">

<column name="BookName" length="40" />

</property>

<!--returnDate屬性對應ReturnDate 字段-->

<property name="returnDate" type="timestamp">

<column name="ReturnDate" length="23" />

</property>

<!-- borrowDate屬性對應BorrowDate字段-->

<property name="borrowDate" type="timestamp">

<column name="BorrowDate" length="23" />

</property>

<!-- com屬性對應Com字段-->

<property name="com" type="string">

<column name="Com" length="40" />

</property>

<!-- isReturned屬性對應Is_Returned字段-->

<property name="isReturned" type="string">

<column name="Is_Returned" length="2" />

</property>

</class>

</hibernate-mapping>

Books.hbm.xml描述了Books類和 books表之間的映射關系,其内容如下所示:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- Generated 2006-8-5 16:17:23 by Hibernate Tools 3.1.0 beta3 -->

<hibernate-mapping>

<!--library.hibernate.Books類和books表對應關系描述-->

<class name="library.hibernate.Books" table="books" schema="dbo" catalog="demo">

<!-- bookName屬性對應BookName字段-->

<id name="bookName" type="string">

<column name="BookName" length="20" />

<generator class="assigned" />

</id>

<!-- press屬性對應Press字段-->

<property name="press" type="string">

<column name="Press" length="20" />

</property>

<!-- author屬性對應Author字段-->

<property name="author" type="string">

<column name="Author" length="20" />

</property>

<!-- address屬性對應address字段-->

<property name="address" type="string">

<column name="address" length="50" />

</property>

<!-- pressDate屬性對應PressDate字段-->

<property name="pressDate" type="timestamp">

<column name="PressDate" length="23" />

</property>

<!-- price屬性對應Price字段-->

<property name="price" type="java.lang.Double">

<column name="Price" precision="53" scale="0" />

</property>

<!-- com屬性對應Com字段-->

<property name="com" type="string">

<column name="Com" length="20" />

</property>

<!-- booksCount屬性對應books_count字段-->

<property name="booksCount" type="java.lang.Integer">

<column name="books_count" />

</property>

<!-- borrowedCount屬性對應borrowed_count字段-->

<property name="borrowedCount" type="java.lang.Integer">

<column name="borrowed_count" />

</property>

</class>

</hibernate-mapping>

UserTable.hbm.xml描述了 UserTable類和usertable表之間的對應關系,其内容如下

所示:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- Generated 2006-8-5 16:17:23 by Hibernate Tools 3.1.0 beta3 -->

<hibernate-mapping>

<!--library.hibernate.UserTable 類和usertable表對應關系描述-->

<class name="library.hibernate.UserTable" table="UserTable" schema="dbo"catalog="demo">

<!-- userName屬性對應UserName字段-->

<id name="userName" type="string">

<column name="UserName" length="40" />

<generator class="assigned" />

</id>

<!-- password屬性對應Password字段-->

<property name="password" type="string">

<column name="Password" length="40" />

</property>

<!-- power屬性對應Power字段-->

<property name="power" type="string">

<column name="Power" length="40" />

</property>

</class>

</hibernate-mapping>

</class>定義實體類和資料表之間的關系,name屬性library.hibernate.UserTable是實體類(用類全名)的名字,UserTable是對應的資料表。</id>定義了主鍵id字段所用的鍵值生成方法。</property>定義了實體類和表字段的關聯,name屬性定義了類的字段,column屬

性定義了資料庫表字段名。Hibernate通過這裡的設定建立起實體類和資料庫表之間的對應關系。

8.7 Hibernate操作資料庫的方法

通過Hibernate可以簡化對資料庫的操作,本節首先建立一個HibernateUtil類,用于管理session,然後介紹如何通過Hibernate實作資料庫的查詢、插入、删除和更新操作。

SessionFactory用來建立 Session執行個體,通過Configuration執行個體建構SessionFactory。Configuration執行個體根據目前的配置資訊,構造 SessionFactory執行個體并傳回。一旦SessionFactory構造完畢,即被賦予特定的配置資訊。

Session是持久層操作的基礎,相當于JDBC 的Connection。通過SessionFactory執行個體建構。Session執行個體提供的saveOrUpdate、delete和 createQuery方法分别實作了資料庫的插入更新、删除和查詢操作,簡化了資料庫的基本操作。

跟我做

(1)在“Library”工程的“src”檔案夾中建立“library.main”包,在“library.main”包中建立HibernateUtil.java檔案,并輸入如下内容:

package library.main;

import java.io.File;

import org.hibernate.*;

import org.hibernate.cfg.*;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {

try {

//hibernate.cfg.xml檔案

File file = new File(

"E:\\Eclipsebook\\eclipse\\workspace\\Library\\src\\hibernate.cfg.xml");

//根據hibernate.cfg.xml中的配置資訊建立SessionFactory

sessionFactory = new Configuration().configure(file)

.buildSessionFactory();

} catch (Throwable ex) {

//建立SessionFactory失敗資訊

System.err.println("Initial SessionFactory creation failed." + ex);

throw new ExceptionInInitializerError(ex);

}

}

//得到SessionFactory的靜态方法

public static SessionFactory getSessionFactory() {

return sessionFactory;

}

}

(2)在“Library”工程的“src”檔案夾中建立“library.test”包,建立Test.java檔案,在該Test.java檔案中測試資料庫的插入、更新、删除和查詢操作。

(3)插入和更新資料庫的基本操作。

//取得 SessionFactory執行個體

SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

//打開一個Session執行個體

Session session = sessionFactory.openSession();

//開始事務

Transaction tx = session.beginTransaction();

//建立UserTable類執行個體

UserTable userTable=new UserTable();

//設定userName屬性

userTable.setUserName("張三");

//設定password屬性

userTable.setPassword("123456");

//設定power屬性

userTable.setPower("圖書管理者");

//插入和更新資料庫

session.saveOrUpdate(userTable);

//送出事務

tx.commit();

//關閉會話

session.close();

(4)從資料庫中删除記錄的基本操作。

//取得 SessionFactory執行個體

SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

//打開一個Session執行個體

Session session = sessionFactory.openSession();

//開始事務

Transaction tx = session.beginTransaction();

//建立UserTable類執行個體

UserTable userTable=new UserTable();

//設定userName屬性

userTable.setUserName("張三");

//設定password屬性

userTable.setPassword("123456");

//設定power屬性

userTable.setPower("圖書管理者");

// 删除操作

// session.delete(userTable);

//送出事務

tx.commit();

//關閉會話

session.close();

(5)查詢資料庫的基本操作。

//取得 SessionFactory執行個體

SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

//打開一個Session執行個體

Session session = sessionFactory.openSession();

//開始事務

Transaction tx = session.beginTransaction();

// 查詢hql語句

String hql = "from UserTable where UserName='張三' and Password='123456'";

//執行查詢,查詢結果為Query執行個體

Query userList = session.createQuery(hql);

//将查詢結果放到一個list中

List list = userList.list();

//送出事務

tx.commit();

//關閉session

session.close();

8.8 系統主界面

系統主界面是整個系統的入口,所有系統功能都是通過主界面來實作的。主界面的運作效果圖如圖8-2所示,本節實作該主界面。

8.8.1 主界面窗體的建立

本小節将利用Swing中的圖形控件生成主界面的窗體、菜單等内容,并且為每個菜單項添加了事件監聽者。關于Swing的相關知識超出了本書介紹的範圍,讀者可以檢視相關資料,本小節假設讀者對Swing 有一定的了解。

跟我做

(1)在“Library”工程的“src”檔案夾中建立“library.main”包,建立LibraryWindow.java檔案,繼承Jframe類,并實作ActionListener接口。該檔案是整個圖書管理系統的入口,完成界面菜單的生成和菜單動作的響應等功能。

(2)編輯LibraryWindow.java檔案,在其構造函數中輸入如下代碼:

public LibraryWindow() {

super("圖書管理系統");

// --系統管理菜單--

menuBar = new JMenuBar();

systemMenu = new JMenu("系統管理");

// --使用者管理菜單--

userMGRMenu = new JMenu("使用者管理");

// --使用者登入菜單--

userLoginMenuItem = new JMenuItem("使用者登入");

// --添加使用者菜單--

userAddMenuItem = new JMenuItem("添加使用者");

// --修改使用者菜單--

userModifyMenuItem = new JMenuItem("修改使用者");

//删除使用者菜單

userDeleteMenuItem = new JMenuItem("删除使用者");

//退出菜單

exitMenuItem = new JMenuItem("退出");

// --将“使用者登入”子菜單項加入到“系統菜單”中--

systemMenu.add(userLoginMenuItem);

// --将“添加使用者”子菜單項加入到“使用者管理”菜單中--

userMGRMenu.add(userAddMenuItem);

// --将“修改使用者”子菜單項加入到“使用者管理”菜單中--

userMGRMenu.add(userModifyMenuItem);

// --将“删除使用者”子菜單項加入到“使用者管理”菜單中--

userMGRMenu.add(userDeleteMenuItem);

// --将“使用者管理”子菜單項加入到“系統管理”菜單中--

systemMenu.add(userMGRMenu);

// --将“退出”子菜單項加入到“系統管理”菜單中--

systemMenu.add(exitMenuItem);

// --為“使用者登入”菜單項添加動作監聽者--

userLoginMenuItem.addActionListener(this);

// --為“添加使用者”菜單項添加動作監聽者--

userAddMenuItem.addActionListener(this);

// --為“修改使用者”菜單項添加動作監聽者--

userModifyMenuItem.addActionListener(this);

// --為“删除使用者”菜單項添加動作監聽者--

userDeleteMenuItem.addActionListener(this);

// --為“退出”菜單項添加動作監聽者--

exitMenuItem.addActionListener(this);

// --将“系統管理”菜單項加入到菜單欄上--

menuBar.add(systemMenu);

// ---書籍管理菜單--

bookMGRMenu = new JMenu("書籍管理");

// --“添加書籍”菜單--

bookAddMenuItem = new JMenuItem("添加書籍");

// --“修改書籍”菜單--

bookModifyMenuItem = new JMenuItem("修改書籍");

// --“删除書籍”菜單--

bookDeleteMenuItem = new JMenuItem("删除書籍");

// --将“添加書籍”菜單加入到“書籍管理”菜單項中--

bookMGRMenu.add(bookAddMenuItem);

// --将“修改書籍”菜單加入到“書籍管理”菜單項中--

bookMGRMenu.add(bookModifyMenuItem);

// --将“删除書籍”菜單加入到“書籍管理”菜單項中--

bookMGRMenu.add(bookDeleteMenuItem);

// --将“添加書籍”菜單添加事件監聽者--

bookAddMenuItem.addActionListener(this);

// --将“修改書籍”菜單添加事件監聽者--

bookModifyMenuItem.addActionListener(this);

// --将“删除書籍”菜單添加事件監聽者--

bookDeleteMenuItem.addActionListener(this);

//将“書籍管理”菜單添加到菜單欄中

menuBar.add(bookMGRMenu);

// --借書管理菜單--

borrowBookMenu = new JMenu("借書管理");

//“書籍出借”菜單

borrowBookMenuItem = new JMenuItem("書籍出借");

//“出借資訊修改“菜單

borrowInfoMenuItem = new JMenuItem("出借資訊修改");

//将“書籍出借”菜單加入到“書籍管理”菜單中

borrowBookMenu.add(borrowBookMenuItem);

//将“出借資訊修改”菜單加入到“書籍管理”菜單中

borrowBookMenu.add(borrowInfoMenuItem);

//為“書籍出借”菜單添加事件監聽者

borrowBookMenuItem.addActionListener(this);

//為“出借資訊修改”菜單添加事件監聽者

borrowInfoMenuItem.addActionListener(this);

//将“借書管理”菜單加入到菜單欄中

menuBar.add(borrowBookMenu);

// --還書管理菜單--

returnBookMenu = new JMenu("還書管理");

//“書籍還入”菜單

returnBookMenuItem = new JMenuItem("書籍還入");

//“書籍還入資訊修改”菜單

returnInfoMenuItem = new JMenuItem("書籍還入資訊修改");

//将“書籍還入”菜單加入到“還書管理”菜單中

returnBookMenu.add(returnBookMenuItem);

//将“書籍還入資訊修改”菜單加入到“還書管理”菜單中

returnBookMenu.add(returnInfoMenuItem);

//為“書籍還入”菜單添加事件監聽者

returnBookMenuItem.addActionListener(this);

//為“書籍還入資訊修改”菜單添加事件監聽者

returnInfoMenuItem.addActionListener(this);

//将“還書管理”菜單加入到菜單欄中

menuBar.add(returnBookMenu);

// --資訊一覽菜單--

infoBrowseMenu = new JMenu("資訊查詢");

//”書籍清單”菜單

bookListMenuItem = new JMenuItem("書籍清單");

//“借閱情況表”菜單

borrowBookListMenuItem = new JMenuItem("借閱情況表");

//“使用者清單”菜單

userListMenuItem = new JMenuItem("使用者清單");

//将“書籍清單”菜單添加到“資訊一覽”菜單中

infoBrowseMenu.add(bookListMenuItem);

//将“出借書籍清單”菜單添加到“資訊一覽”菜單中

infoBrowseMenu.add(borrowBookListMenuItem);

//将“使用者清單”菜單添加到“資訊一覽”菜單中

infoBrowseMenu.add(userListMenuItem);

//為“書籍清單”菜單添加事件監聽者

bookListMenuItem.addActionListener(this);

//為“出借圖書清單”菜單添加事件監聽者

borrowBookListMenuItem.addActionListener(this);

//為“使用者清單”菜單添加事件監聽者

userListMenuItem.addActionListener(this);

//将“資訊一覽”菜單加入到菜單欄中

menuBar.add(infoBrowseMenu);

//為Window添加菜單欄

setJMenuBar(menuBar);

//圖檔Label

titleLabel = new JLabel(new ImageIcon(".\\pic.jpg"));

container = getContentPane();

container.setLayout(new BorderLayout());

panel1 = new JPanel();

panel1.setLayout(new BorderLayout());

panel1.add(titleLabel, BorderLayout.CENTER);

container.add(panel1, BorderLayout.CENTER);

setBounds(100, 50, 400, 300);

show();

// --設定初始功能:--

userMGRMenu.setEnabled(false);

bookMGRMenu.setEnabled(false);

borrowBookMenu.setEnabled(false);

returnBookMenu.setEnabled(false);

infoBrowseMenu.setEnabled(false);

}

生成了系統管理、書籍管理、借書管理、還書管理和資訊一覽5個菜單項,并且為其子菜單項添加了事件監聽者。

8.8.2 為每個菜單項添加響應事件

本小節将在8.8.1節的基礎上,為主界面的每個菜單項添加事件響應函數,并且控制每個新建立視窗的顯示位置。在actionPerformed(ActionEvent)方法中通過參數 ActionEvent對象的getActionCommand()方法可以得到使用者點選的菜單項,然後進行不同的處理。

跟我做

(1)右擊LibraryWindow類的任意空白區域,在快捷菜單中選擇【源代碼】|【覆寫/實作方法】指令,打開【覆寫/實作方法】對話框,選擇 “actionPerformed(ActionEvent)”,單擊【确定】按鈕,生成actionPerformed方法。

(2)編輯LibraryWindow.java檔案,在actionPerformed方法中輸入如下代碼:

// --設定每個菜單點選後出現的視窗和視窗顯示的位置--

public void actionPerformed(ActionEvent e) {

//“使用者登入”菜單的響應函數

if (e.getActionCommand() == "使用者登入") {

//建立使用者登入視窗

UserLogin userLoginFrame = new UserLogin(this);

Dimension frameSize = userLoginFrame.getPreferredSize();

Dimension mainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的位置和大小

userLoginFrame.setLocation((mainFrameSize.width - frameSize.width)

/ 2 + loc.x, (mainFrameSize.height - frameSize.height) / 2

+ loc.y);

userLoginFrame.pack();

userLoginFrame.show();

} else if (e.getActionCommand() == "添加使用者") {

//“添加使用者”菜單的響應函數

UserAdd UserAddFrame = new UserAdd();

Dimension FrameSize = UserAddFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

UserAddFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

UserAddFrame.pack();

UserAddFrame.show();

} else if (e.getActionCommand() == "修改使用者") {

//“修改使用者”菜單的響應函數

UserModify UserModifyFrame = new UserModify();

Dimension FrameSize = UserModifyFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

UserModifyFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

UserModifyFrame.pack();

UserModifyFrame.show();

} else if (e.getActionCommand() == "删除使用者") {

//初始化“删除使用者“視窗

UserDelete UserDeleteFrame = new UserDelete();

Dimension FrameSize = UserDeleteFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

UserDeleteFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

UserDeleteFrame.pack();

//顯示視窗

UserDeleteFrame.show();

} else if (e.getActionCommand() == "添加書籍") {

//“添加書籍”視窗

BookAdd BookAddFrame = new BookAdd();

Dimension FrameSize = BookAddFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

BookAddFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

BookAddFrame.pack();

//顯示添加書籍視窗

BookAddFrame.show();

} else if (e.getActionCommand() == "修改書籍") {

//初始化“修改書籍”視窗

BookModify BookModifyFrame = new BookModify();

Dimension FrameSize = BookModifyFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

BookModifyFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

BookModifyFrame.pack();

//顯示“修改書籍”視窗

BookModifyFrame.show();

} else if (e.getActionCommand() == "删除書籍") {

//初始化“删除書籍”視窗

BookDelete BookDeleteFrame = new BookDelete();

Dimension FrameSize = BookDeleteFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

BookDeleteFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

BookDeleteFrame.pack();

//顯示視窗

BookDeleteFrame.show();

} else if (e.getActionCommand() == "書籍出借") {

//初始化“書籍出借”視窗

BorrowBook BorrowBookFrame = new BorrowBook();

Dimension FrameSize = BorrowBookFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

BorrowBookFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

BorrowBookFrame.pack();

//顯示視窗

BorrowBookFrame.show();

} else if (e.getActionCommand() == "出借資訊修改") {

//初始化“出借資訊修改”視窗

BorrowInfo BorrowInfoFrame = new BorrowInfo();

Dimension FrameSize = BorrowInfoFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

BorrowInfoFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

BorrowInfoFrame.pack();

//顯示視窗

BorrowInfoFrame.show();

} else if (e.getActionCommand() == "書籍還入") {

//初始化“書籍還入”視窗

ReturnBook returnBookFrame = new ReturnBook();

Dimension FrameSize = returnBookFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

returnBookFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

returnBookFrame.pack();

//顯示視窗

returnBookFrame.show();

} else if (e.getActionCommand() == "書籍還入資訊修改") {

//初始化“書籍還入資訊修改”視窗

ReturnInfo returnInfoFrame = new ReturnInfo();

Dimension FrameSize = returnInfoFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

returnInfoFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

returnInfoFrame.pack();

//顯示視窗

returnInfoFrame.show();

} else if (e.getActionCommand() == "書籍清單") {

//初始化“書籍清單”視窗

BookList BookListFrame = new BookList();

Dimension FrameSize = BookListFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

BookListFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

BookListFrame.pack();

//顯示視窗

BookListFrame.show();

} else if (e.getActionCommand() == "借閱情況表") {

//初始化“借閱情況表”視窗

BorrowBookList BorrowBookListFrame = new BorrowBookList();

Dimension FrameSize = BorrowBookListFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

BorrowBookListFrame.setLocation(

(MainFrameSize.width - FrameSize.width) / 2 + loc.x,

(MainFrameSize.height - FrameSize.height) / 2 + loc.y);

BorrowBookListFrame.pack();

//顯示視窗

BorrowBookListFrame.show();

} else if (e.getActionCommand() == "使用者清單") {

//顯示“使用者清單”視窗

UserList UserListFrame = new UserList();

Dimension FrameSize = UserListFrame.getPreferredSize();

Dimension MainFrameSize = getSize();

Point loc = getLocation();

//設定視窗的大小和位置

UserListFrame.setLocation((MainFrameSize.width - FrameSize.width)

/ 2 + loc.x, (MainFrameSize.height - FrameSize.height) / 2

+ loc.y);

UserListFrame.pack();

//顯示視窗

UserListFrame.show();

} else if (e.getActionCommand() == "退出") {

this.dispose();

//系統退出

System.exit(0);

}

}

該方法為書籍管理系統的各個菜單項添加了事件響應函數,并設定了視窗的大小和

位置。

8.8.3 為系統增權重限控制

本小節為系統增權重限控制,進而保證系統的安全性,共分為系統管理者、書籍管理者和借閱管理者3個角色。通過Menu對象的setEnabled(true)方法,根據不同角色的權限配置設定設定各個菜單項的顯示與否。其中的系統管理者具有全部的權限。

跟我做

在“LibraryWindow.java”中建立 “setEnable”方法,編輯該方法,輸入如下代碼:

public void setEnable(String powerType) {

if (powerType.trim().equals("系統管理者")) {

//系統管理者具有全部的權限

userMGRMenu.setEnabled(true);

bookMGRMenu.setEnabled(true);

borrowBookMenu.setEnabled(true);

returnBookMenu.setEnabled(true);

infoBrowseMenu.setEnabled(true);

userListMenuItem.setEnabled(true);

} else if (powerType.trim().equals("書籍管理者")) {

//書籍管理者擁有書籍管理和資訊查詢權限

userMGRMenu.setEnabled(false);

bookMGRMenu.setEnabled(true);

borrowBookMenu.setEnabled(false);

returnBookMenu.setEnabled(false);

infoBrowseMenu.setEnabled(true);

userListMenuItem.setEnabled(false);

} else if (powerType.trim().equals("借閱管理者")) {

//借閱管理者擁有借書管理、還書管理和資訊查詢權限

userMGRMenu.setEnabled(false);

bookMGRMenu.setEnabled(false);

borrowBookMenu.setEnabled(true);

returnBookMenu.setEnabled(true);

infoBrowseMenu.setEnabled(true);

userListMenuItem.setEnabled(false);

} else if (powerType.trim().equals("else")) {

//其他角色沒有任何權限

userMGRMenu.setEnabled(false);

bookMGRMenu.setEnabled(false);

borrowBookMenu.setEnabled(false);

returnBookMenu.setEnabled(false);

infoBrowseMenu.setEnabled(false);

}

}

8.9 使用者管理

使用者管理包括使用者登入和使用者登入資訊維護兩大部分,使用者管理又包括添加使用者、删除使用者和修改使用者3部分功能。本節實作使用者管理功能。使用者管理功能是典型的資料庫操作,包括記錄的添加、删除和修改等操作。經過本節的學習可以熟練掌握通過Hibernate實作對資料庫的操作。

8.9.1 使用者登入功能的實作

根據實作了圖書管理系統的使用者登入類,根據使用者名和密碼查詢使用者相應的權限。根據查詢的權限結果,設定相應菜單項的顯示與否。取得使用者名和使用者密碼之後,通過如下代碼段從資料庫中查詢相應的使用者資訊,如果查詢的結果為空,說明該使用者沒有注冊,将提示使用者為非法使用者。

String hql = "from UserTable where UserName='"

+ userNameText.getText().trim() + "' and Password='"

+ passwordStr + "'";

// 執行查詢

Query userList = session.createQuery(hql);

跟我做

在“Library”工程的“src”檔案夾中建立 “library.user”包,并在其中建立“UserLogin.java”檔案,在該檔案中輸入如下代碼:

package library.user;

public class UserLogin extends JFrame implements ActionListener {

LibraryWindow libraryWindow;

JPanel panel1, panel2;

JLabel userNameLabel, passwordLabel;

JTextField userNameText;

JPasswordField passwordText;

JButton yesButton, cancelButton;

Container container;

ResultSet rs;

public UserLogin(LibraryWindow mainFrame) {

super("使用者登入");

this.libraryWindow = mainFrame;

// “使用者名”标簽

userNameLabel = new JLabel("使用者名", JLabel.CENTER);

// “密碼”标簽

passwordLabel = new JLabel("密碼", JLabel.CENTER);

// 使用者名輸入框

userNameText = new JTextField(10);

// 密碼輸入框

passwordText = new JPasswordField(10);

// “确定”按鈕

yesButton = new JButton("确定");

// “取消”按鈕

cancelButton = new JButton("取消");

// 為“确定”按鈕增加事件監聽者

yesButton.addActionListener(this);

// 為“取消”按鈕增加事件監聽者

cancelButton.addActionListener(this);

panel1 = new JPanel();

panel1.setLayout(new GridLayout(2, 2));

panel2 = new JPanel();

container = getContentPane();

container.setLayout(new BorderLayout());

panel1.add(userNameLabel);

panel1.add(userNameText);

panel1.add(passwordLabel);

panel1.add(passwordText);

container.add(panel1, BorderLayout.CENTER);

panel2.add(yesButton);

panel2.add(cancelButton);

container.add(panel2, BorderLayout.SOUTH);

// 設定視窗大小

setSize(300, 300);

}

public void actionPerformed(ActionEvent action) {

if (action.getSource() == cancelButton) {

// 如果單擊“取消”按鈕後執行的動作

libraryWindow.setEnable("else");

this.dispose();

} else {

// 如果單擊“确定”按鈕後執行的動作

char[] password = passwordText.getPassword();

// 将使用者輸入的密碼由字元數組轉換成字元串

String passwordStr = new String(password);

// 判斷使用者輸入的使用者名是否為空

if (userNameText.getText().trim().equals("")) {

JOptionPane.showMessageDialog(null, "使用者名不可為空!");

return;

}

// 判斷使用者輸入的密碼是否為空

if (passwordStr.equals("")) {

JOptionPane.showMessageDialog(null, "密碼不可為空!");

return;

}

// 取得SessionFactory

SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

// 打開session

Session session = sessionFactory.openSession();

// 建立一個事務

Transaction tx = session.beginTransaction();

// hsql執行語句

String hql = "from UserTable where UserName='"

+ userNameText.getText().trim() + "' and Password='"

+ passwordStr + "'";

// 執行查詢

Query userList = session.createQuery(hql);

// 将查詢結果放置到一個list連結清單中

List list = userList.list();

// 标記該使用者是否存在

boolean isExist = false;

// 如果list的長度為0,表示該使用者不存在

if (list.size() > 0)

isExist = true;

if (!isExist) {

// 提示使用者名和密碼不正确

JOptionPane.showMessageDialog(null, "使用者名不存在或者密碼不正确!");

libraryWindow.setEnable("else");

} else {

// 取得該使用者的權限級别

UserTable user = (UserTable) list.get(0);

// 設定權限

libraryWindow.setEnable(user.getPower().trim());

// 事務送出

tx.commit();

// 關閉session

session.close();

this.dispose();

}

}

}

}

文本框: 圖8-17 使用者登入視窗該類實作了使用者登入功能,其運作效果如圖8-17所示。根據使用者輸入的使用者名和密碼查詢資料庫中的UserTable表驗證該使用者是否是注冊使用者。

該類使用Hibernate從資料庫中查詢需要的資訊,通過驗證後根據使用者不同的權限設定其相應權限。

文本框: 圖8-18 新增使用者效果圖8.9.2 添加使用者類的實作

本小節實作增加使用者類,将新使用者資訊儲存到資料庫中,進而完成使用者的注冊。其運作效果如圖8-18所示。将新使用者的使用者名、密碼和登入權限等資訊送出到資料庫中儲存。

該類使用Hibernate實作了資料庫的插入或更新操作,通過本類可以看出Hibernate操作資料庫完全以面向對象的方式來實作。

跟我做

在 “Library”工程的“library.user”包中建立“UserAdd.java”檔案,在該檔案中輸入如下代碼:

package library.user;

public class UserAdd extends JFrame implements ActionListener {

Container container;

JPanel panel1, panel2;

JLabel userNameLabel, passwordLabel, passwordConfirmLabel, loginPrivelegeLabel;

JTextField userNameText;

JPasswordField passwordText, passwordConfirmText;

JComboBox loginPrivelegeComboBox;

JButton addButton, cancelButton;

public UserAdd() {

super("添加使用者");

container = getContentPane();

container.setLayout(new BorderLayout());

//“使用者名”标簽

userNameLabel = new JLabel("使用者名", JLabel.CENTER);

//“密碼”标簽

passwordLabel = new JLabel("密碼", JLabel.CENTER);

//“确認密碼”标簽

passwordConfirmLabel = new JLabel("确認密碼", JLabel.CENTER);

//“登入權限”标簽

loginPrivelegeLabel = new JLabel("登入權限", JLabel.CENTER);

//輸入使用者名的文本框

userNameText = new JTextField(10);

//輸入密碼的文本框

passwordText = new JPasswordField(10);

//密碼确認文本框

passwordConfirmText = new JPasswordField(10);

//選擇使用者權限

loginPrivelegeComboBox = new JComboBox();

loginPrivelegeComboBox.addItem("系統管理者");

loginPrivelegeComboBox.addItem("書籍管理者");

loginPrivelegeComboBox.addItem("借閱管理者");

//“添加”按鈕

addButton = new JButton("添加");

//“取消”按鈕

cancelButton = new JButton("取消");

//為“添加”按鈕加入事件監聽者

addButton.addActionListener(this);

//為“取消”按鈕加入事件監聽者

cancelButton.addActionListener(this);

panel1 = new JPanel();

panel1.setLayout(new GridLayout(4, 2));

panel1.add(userNameLabel);

panel1.add(userNameText);

panel1.add(passwordLabel);

panel1.add(passwordText);

panel1.add(passwordConfirmLabel);

panel1.add(passwordConfirmText);

panel1.add(loginPrivelegeLabel);

panel1.add(loginPrivelegeComboBox);

container.add(panel1, BorderLayout.CENTER);

panel2 = new JPanel();

panel2.add(addButton);

panel2.add(cancelButton);

container.add(panel2, BorderLayout.SOUTH);

//設定視窗的大小

setSize(300, 300);

}

public void actionPerformed(ActionEvent action) {

if (action.getSource() == cancelButton) {

// 單擊“取消”按鈕不作任何事情

this.dispose();

} else if (action.getSource() == addButton) {

// 單擊“添加”按鈕後将使用者資訊送出到資料庫中

if (userNameText.getText().trim().equals("")) {

// 判斷使用者名是否為空

JOptionPane.showMessageDialog(null, "使用者名不能為空!");

} else if (passwordText.getText().trim().equals("")) {

// 判斷密碼是否為空

JOptionPane.showMessageDialog(null, "密碼不能為空!");

} else if (!passwordText.getText().trim().equals(

passwordConfirmText.getText().trim())) {

// 判斷兩次輸入的密碼是否一緻

JOptionPane.showMessageDialog(null, "兩次輸入的密碼不一緻!");

} else {

// 取得SessionFactory

SessionFactory sessionFactory = HibernateUtil

.getSessionFactory();

// 打開session

Session session = sessionFactory.openSession();

// 建立一個事務

Transaction tx = session.beginTransaction();

繼續閱讀