前言
参照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
实现对于数据库的写入,查询了。
标题党么,小兄弟,说好的spring呢?
这个是一个系列,在前言中标明使用 "IntelliJ IDEA 2016.1建立Strut2工程并使用Tomcat调试" 这部分中进行的spring的引入。