前言
转自:http://www.mobibrw.com/2016/4464参照IntelliJ IDEA 2016.1建立Strut2工程并使用Tomcat调试建立了项目后,然后按照IntelliJ IDEA 2016.1.1的Struts2项目中引入Junit4.12单元测试,引入Junit到项目之后,开始引入 Hibernate并且使用 H2作为数据存储,完成一个比较完整的示例服务器。
简单介绍一下 H2嵌入式数据库
H2是一个短小精干的嵌入式数据库引擎,主要的特性包括:
- 免费、开源、快速;
- 嵌入式的数据库服务器,支持集群;
- 提供 JDBC, ODBC访问接口,提供基于浏览器的控制台管理程序;
- Java编写,可使用 GCJ和 IKVM.NET编译;
- 短小精干的软件, 1M左右。
几个嵌入式数据库的对比:
实战
1.引入H2数据库
点击工程的" Project Structure"图标,如下图所示:
在弹出的界面中根据顺序,依次选择,选择从 Maven服务器下载
在弹出的界面中根据顺序依次操作,点击搜索图标之后,要等待比较长的一段时间,才能看到下面的 OK按钮可以点击。目前 H2最新的版本是 1.4.191,因此输入" com.h2database:h2:1.4.191"。详细操作如下图:
点击 OK按钮,关闭窗口后,稍等,会发现出现一个 Problems的提示,点击这个提示列表,如下图所示:
完成后点击 OK按钮关闭界面。
2.引入Hibernate框架
切换工程的视图到" Project"模式下
项目上面右击鼠标,选择" Add Framework Support ..."菜单,如下图:
在弹出的界面中选择" Hibernate",如下图所示
点击后,出现下载进度,等待进度完成,如下图:
下载完成后,再次点击工程的" Project Structure"图标,如下图:
同样在出现的界面中修复提示的 Problems,如下图:
增加" Hibernate"配置文件,点击工程的" Project Structure"图标,如下图:
增加" Hibernate"配置文件,如下图:
选择文件的路径,此处我们使用默认路径,点击 OK即可。
此时我们点击工程目录,会发现,已经新增了一个名字为 hibernate.cfg.xml的配置文件,如下图:
3.配置Hibernate与H2数据库通信
按下面所示的修改 hibernate.cfg.xml文件,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?
xml
version
=
'1.0'
encoding
=
'utf-8'
?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 驱动位置 -->
<property
name
=
"connection.driver_class"
>
org.h2.Driver
</property>
<!-- 文件模式 db.h2文件-->
<!-- <property name="connection.url">jdbc:h2:~/HibernateH2/db</property> -->
<!-- 内存模式 -->
<property
name
=
"connection.url"
>
jdbc:h2:mem:db
</property>
<!-- 用户名 下面是密码 -->
<property
name
=
"connection.username"
>
sa
</property>
<property
name
=
"connection.password"
>
sa
</property>
<!-- 使用的数据库方言 -->
<property
name
=
"dialect"
>
org.hibernate.dialect.H2Dialect
</property>
<property
name
=
"show_sql"
>
true
</property>
<!-- DB schema will be updated if needed 自动创建表结构-->
<property
name
=
"hbm2ddl.auto"
>
update
</property>
<property
name
=
"current_session_context_class"
>
thread
</property>
<!-- 引入的实体 -->
<mapping
class
=
"Simulator.Hibernate.Model.Visitor"
/>
</session-factory>
</hibernate-configuration>
|
此时会提示我们,找不到 Simulator.Hibernate.Model.Visitor这个类,因此我们创建这个类,如下图所示:
三个文件的源代码如下:
Visitor.Java中的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package
Simulator
.
Hibernate
.
Model
;
import
javax
.
persistence
.
*
;
import
java
.
io
.
Serializable
;
@Entity
@Table
public
class
Visitor
implements
Serializable
{
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
TABLE
,
generator
=
"tableGenerator"
)
@TableGenerator
(
name
=
"tableGenerator"
,
initialValue
=
1
,
allocationSize
=
1
)
@Column
(
unique
=
true
,
nullable
=
false
)
public
long
id
;
/*消息记录的ID*/
public
String
v
;
/*版本号*/
public
String
TimeStamp
;
/*消息记录的时间戳*/
}
|
代码解释一下, @Entry, @Table的注解来告知 Hibernate,这个是个数据库的表配置类,其中的每个成员变量对应数据库表的字段。
如下的注解
1
2
3
4
|
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
TABLE
,
generator
=
"tableGenerator"
)
@TableGenerator
(
name
=
"tableGenerator"
,
initialValue
=
1
,
allocationSize
=
1
)
@Column
(
unique
=
true
,
nullable
=
false
)
|
表示 id为整个表的自增主键。
VisitorDao.Java中的代码如下,这个文件提供了访问数据的接口定义:
1
2
3
4
5
6
7
8
9
10
|
package
Simulator
.Hibernate
.Dao
;
import
Simulator
.Hibernate
.Model
.Visitor
;
import
java
.util
.List
;
public
interface
VisitorDao
{
boolean
insert
(
Visitor
visitor
)
;
List
<
Visitor
>
getAll
(
)
;
}
|
VisitorDaoImpl.Java中的代码如下,这个文件对 VisitorDao中定义的接口进行了实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
package
Simulator
.
Hibernate
.
Impl
;
import
Simulator
.
Hibernate
.
Model
.
Visitor
;
import
org
.
hibernate
.
Query
;
import
org
.
hibernate
.
Session
;
import
org
.
hibernate
.
Transaction
;
import
org
.
hibernate
.
SessionFactory
;
import
org
.
hibernate
.
cfg
.
Configuration
;
import
org
.
hibernate
.
service
.
ServiceRegistry
;
import
org
.
hibernate
.
service
.
ServiceRegistryBuilder
;
import
java
.
util
.
ArrayList
;
import
java
.
util
.
List
;
public
class
VisitorDaoImpl
implements
Simulator
.
Hibernate
.
Dao
.
VisitorDao
{
@Override
public
boolean
insert
(
Visitor
visitor
)
{
Configuration
configuration
=
new
Configuration
(
)
;
configuration
.
configure
(
)
;
ServiceRegistry
serviceRegistry
=
new
ServiceRegistryBuilder
(
)
.
applySettings
(
configuration
.
getProperties
(
)
)
.
buildServiceRegistry
(
)
;
SessionFactory
sessionFactory
=
new
Configuration
(
)
.
configure
(
)
.
buildSessionFactory
(
serviceRegistry
)
;
try
{
Session
session
=
sessionFactory
.
openSession
(
)
;
try
{
Transaction
tas
=
session
.
beginTransaction
(
)
;
try
{
session
.
save
(
visitor
)
;
tas
.
commit
(
)
;
}
catch
(
Exception
ex
)
{
ex
.
printStackTrace
(
)
;
tas
.
rollback
(
)
;
}
}
finally
{
session
.
close
(
)
;
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
return
false
;
}
return
true
;
}
@Override
public
List
<Visitor>
getAll
(
)
{
Configuration
configuration
=
new
Configuration
(
)
;
configuration
.
configure
(
)
;
ServiceRegistry
serviceRegistry
=
new
ServiceRegistryBuilder
(
)
.
applySettings
(
configuration
.
getProperties
(
)
)
.
buildServiceRegistry
(
)
;
SessionFactory
sessionFactory
=
new
Configuration
(
)
.
configure
(
)
.
buildSessionFactory
(
serviceRegistry
)
;
try
{
Session
session
=
sessionFactory
.
openSession
(
)
;
try
{
Transaction
tas
=
session
.
beginTransaction
(
)
;
try
{
Query
query
=
session
.
createQuery
(
"from Visitor"
)
;
tas
.
commit
(
)
;
return
query
.
list
(
)
;
}
catch
(
Exception
e
)
{
tas
.
rollback
(
)
;
e
.
printStackTrace
(
)
;
}
}
finally
{
session
.
close
(
)
;
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
}
return
new
ArrayList
<>
(
)
;
}
}
|
这部分的代码需要着重解释一下
1
|
Query
query
=
session
.
createQuery
(
"from Visitor"
)
;
|
这个语句,注意,这个语句中的 "from Visitor"为 Visitor.Java中定义的类的名称,由 Hibernate内部进行变量,表之间的对应。
如上操作之后,就可以在任意的 Action中通过调用 VisitorDaoImpl实现对于数据库的写入,查询了。