天天看点

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();