- 浏览: 687351 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (254)
- java分布式应用架构 (22)
- SSH框架整合 (6)
- java web 学习笔记 (49)
- java 学习笔记 (56)
- struts 2 学习 (6)
- Hibernate学习 (10)
- spring 学习 (2)
- 客户端编程(javascript) (4)
- IDE使用 (13)
- 生命 人生 (6)
- 系统维护 (3)
- 技术篇 (10)
- MySql (2)
- J2ME (1)
- java网络编程 (4)
- 数据库 (5)
- C/C++ (8)
- Oracle (7)
- 软件测试 (0)
- 软件的安装和部署 (0)
- Java快讯 (1)
- swt (1)
- Flex (1)
- 软件工程 (1)
- PostgreSQL (1)
- sql server2000 (2)
- 嵌入式数据库sqlite (5)
- J2EE (1)
- XML (1)
- ibatis3(MyBatis) (6)
- Linux&Unix (1)
- velocity (1)
- 回报社会 (4)
- 软件项目管理 (3)
- android研究 (3)
- C# (2)
- Objective-C (1)
- 音乐 (0)
- webx (1)
- JMS (1)
- maven软件项目管理 (1)
- 分布式服务 (0)
- 云平台 (0)
- 分布式存储 (1)
- 分布式系统架构 (0)
- 移动互联网 (1)
- ZooKeeper (1)
最新评论
-
liyys:
楼主,可不可以发这个项目的源码工程出来分享一下,少了几个类。楼 ...
仿照Hibernate实现一个SQLite的ORM框架 -
liyys:
少了一些类的源码没有粘贴出来
仿照Hibernate实现一个SQLite的ORM框架 -
honglei0412:
我使用的是这种方式获取db文件的目录但是 URL p = Fi ...
使用sqlite注意事项 -
honglei0412:
大侠 能不能说明下DbFile您是怎么做的吗?
使用sqlite注意事项 -
ahack:
刚写完mapping才发现早就有人写好了。仔细一看还都是针对的 ...
仿照Hibernate实现一个SQLite的ORM框架
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”工程,单击【下一步】按钮,打开数据库配置对话框。
图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(根据实际配置)
图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属性。
图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;
/**
* BookBrowse generated by hbm2java
*/
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() {
}
/** minimal constructor */
public BookBrowse(String studentName) {
this.studentName = studentName;
}
/** full constructor */
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;
/**
* Books generated by hbm2java
*/
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
/** default constructor */
public Books() {
}
/** minimal constructor */
public Books(String bookName) {
this.bookName = bookName;
}
/** full constructor */
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
/**
* UserTable generated by hbm2java
*/
public class UserTable implements java.io.Serializable {
// Fields
//用户名
private String userName;
//密码
private String password;
//用户权限
private String power;
// Constructors
/** default constructor */
public UserTable() {
}
/** minimal constructor */
public UserTable(String userName) {
this.userName = userName;
}
/** full constructor */
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;
/**
* 用户登录类,根据用户名和密码查询用户相应的权限
*
* @author lianhw
*
*/
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);
}
/**
* 动作响应方法,完成数据库的查询和权限的设置功能
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
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;
/**
* 增加用户类,将用户信息保存到数据库中
*
* @author lianhw
*
*/
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);
}
/**
* 动作响应方法,将新增的用户信息提交到数据库中
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
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();
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”工程,单击【下一步】按钮,打开数据库配置对话框。
图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(根据实际配置)
图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属性。
图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;
/**
* BookBrowse generated by hbm2java
*/
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() {
}
/** minimal constructor */
public BookBrowse(String studentName) {
this.studentName = studentName;
}
/** full constructor */
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;
/**
* Books generated by hbm2java
*/
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
/** default constructor */
public Books() {
}
/** minimal constructor */
public Books(String bookName) {
this.bookName = bookName;
}
/** full constructor */
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
/**
* UserTable generated by hbm2java
*/
public class UserTable implements java.io.Serializable {
// Fields
//用户名
private String userName;
//密码
private String password;
//用户权限
private String power;
// Constructors
/** default constructor */
public UserTable() {
}
/** minimal constructor */
public UserTable(String userName) {
this.userName = userName;
}
/** full constructor */
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;
/**
* 用户登录类,根据用户名和密码查询用户相应的权限
*
* @author lianhw
*
*/
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);
}
/**
* 动作响应方法,完成数据库的查询和权限的设置功能
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
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;
/**
* 增加用户类,将用户信息保存到数据库中
*
* @author lianhw
*
*/
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);
}
/**
* 动作响应方法,将新增的用户信息提交到数据库中
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
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();
发表评论
-
仿照Hibernate实现一个SQLite的ORM框架
2011-09-30 20:06 3201那么先来看看使用 实体对象 package test; ... -
Java处理UTF-8带BOM的文本的读写
2011-08-01 11:28 3033什么是BOM BOM(byte-order mark),即字 ... -
hibernate性能调优
2010-11-01 11:36 1025大体上,对于HIBERNATE性 ... -
HibernateTemplate 类 使用
2010-10-27 21:52 1192目的:使用HibernateTemplate执行execute ... -
hibernate对象状态
2010-05-23 10:47 1025hibernate对象状态图解: Hibernate ... -
什么时候要用到Serializable呢
2010-05-22 21:47 1803什么时候class 要实现Serializable这个接口呢? ... -
hibernate 的一个小例子(demo)
2010-05-20 19:21 1243实体类:Users.java package com.liuf ... -
描述Hibernate映射文件
2010-05-20 17:24 1110在向大家详细介绍Hibernate之前,首先让大家了解下调用J ... -
hibernate 映射文件配置
2010-05-20 17:19 987对象关系的映射是用一个XML文档来说明的。映射文档可以使用工具 ...
相关推荐
在myeclipse中配置hibernate 自动生成配置文件在myeclipse中配置hibernate 自动生成配置文件
- 创建Hibernate配置文件 - 使用自定义的SessionFactory - 从Database Explorer的表定义中生成Java类和Hibernate映射文件 - 使用HQL编辑器 - 创建使用Hibernate的小测试应用 - **前置条件**:建议先阅读...
在Myeclipse中配置Hibernate以连接Oracle10g数据库是一项常见的开发任务,这涉及到多个步骤,包括设置数据库连接、添加驱动、配置Hibernate项目以及生成相关的配置文件。以下是对这个过程的详细说明: 首先,你需要...
这包括设置Hibernate的库依赖,创建Hibernate配置文件(hibernate.cfg.xml),以及编写实体类并注解。此外,还会讲解如何生成数据库表结构,即逆向工程(Reverse Engineering)。 在了解基本配置后,教程会引导你...
Myeclipse 自动生成 Hibernate 配置文件及实体类映射 ORM 配置文件 Myeclipse 是一个功能强大的集成开发环境(IDE),它提供了许多实用的功能来简化软件开发过程。在这个示例中,我们将展示如何使用 Myeclipse 自动...
- **测试连接与操作**: 编写测试类,验证Hibernate配置是否正确,如查询、插入、更新和删除数据。 4. **包内文件详解**: - **dtd**: 这可能包含Hibernate的DTD(文档类型定义),例如`hibernate-mapping-3.0.dtd`...
MyEclipse作为一款强大的集成开发环境,提供了自动生成Hibernate配置文件的功能,帮助开发者快速构建项目。以下是使用MyEclipse自动生成Hibernate配置文件的详细步骤: 1. **创建数据库表**: 在开始之前,需要先...
### MyEclipse中Hibernate的基本配置步骤与理解 #### 一、引言 随着软件开发行业的不断发展,ORM(Object-Relational Mapping,对象关系映射)技术已成为连接对象模型与关系型数据库的重要桥梁之一。其中,...
- 在项目中创建Hibernate配置文件。 - 如何使用自定义的SessionFactory。 - 如何从Database Explorer中的表定义生成Java类和Hibernate数据库映射文件(.hbm文件)。 - 使用HQL编辑器进行查询操作。 - 创建并测试一个...
在MyEclipse中使用Hibernate进行开发,首先需要安装和配置Hibernate插件。教程可能会指导用户如何在MyEclipse中设置新的Hibernate项目,包括选择合适的JDBC驱动和配置数据库连接。接着,用户将学习如何创建实体类,...
3. **配置Hibernate.cfg.xml**:在src/main/resources目录下创建Hibernate配置文件,配置数据库连接信息以及实体类与表的映射关系。 4. **创建实体类**:根据数据库表结构,定义相应的JavaBean实体类,并设置getters...
书名:MyEclipse Hibernate 快速入门(电子书) 格式:HTML 作者:刘长炯 这个快速入门展示了使用 MyEclipse Enterprise Workbench 开发 Hibernate 的基本功能, 概念和技术. 我们将全程带领你来开发一个非常简单的 ...
### MyEclipse中配置Hibernate连接Oracle详解 #### 一、概述 本文主要介绍如何在MyEclipse集成开发环境中配置Hibernate框架来实现与Oracle数据库的连接。通过以下步骤,开发者能够快速搭建起基于Hibernate的数据库...
图文教程MyEclipse配置struts+hibernate+spring.doc 本文档主要讲述了如何在MyEclipse中配置struts、hibernate和spring三个框架,以实现一个完整的Web应用程序。下面是从本文档中提取的重要知识点: 1.struts框架...
本文将指导您如何在 MyEclipse 中使用 Hibernate,並详细介绍了创建数据库、配置数据库连接、初始化 Hibernate 开发环境、生成 POJO 及 hbm 映射文件等步骤。 创建数据库 在 MyEclipse 中,我们可以使用 SQL ...
【MyEclipse+Struts+Hibernate配置开发】是Java Web开发中常见的技术栈组合,主要用于构建企业级的、基于模型-视图-控制器(MVC)架构的应用程序。本篇文章将简要介绍如何配置和使用这些工具进行开发。 首先,**...
7. **检查Hibernate配置文件**:此时,您应该能看到Hibernate配置文件已经自动生成。 8. **生成实体类映射**: - 在`Myeclipse DataBase Explorer`视图中,选择数据库连接,并右键选择`Open Connection...`,输入...
结合以上四个技术,我们可以理解这个项目是如何工作的:用户通过浏览器发送请求到Struts2框架,Struts2根据配置文件解析请求并调用相应的业务逻辑(由Hibernate处理数据库操作)。完成操作后,Struts2会将结果返回给...
MyEclipse与Hibernate反向生成实体类和DAO MyEclipse是一个基于Eclipse平台的集成开发环境(IDE),它提供了很多实用的功能和插件来帮助开发者快速开发Java应用程序。Hibernate是一个流行的对象关系映射(ORM)框架...