IntelliJ IDEA 2016.1.2建立Struts2+Spring+Hibernate+H2数据库项目

前言


参照IntelliJ IDEA 2016.1建立Strut2工程并使用Tomcat调试建立了项目后,然后按照IntelliJ IDEA 2016.1.1的Struts2项目中引入Junit4.12单元测试,引入Junit到项目之后,开始引入Hibernate并且使用H2作为数据存储,完成一个比较完整的示例服务器。

简单介绍一下H2嵌入式数据库
H2是一个短小精干的嵌入式数据库引擎,主要的特性包括:

  1. 免费、开源、快速;
  2. 嵌入式的数据库服务器,支持集群;
  3. 提供JDBC,ODBC访问接口,提供基于浏览器的控制台管理程序;
  4. Java编写,可使用GCJIKVM.NET编译;
  5. 短小精干的软件,1M左右。

几个嵌入式数据库的对比:
a9d3fd1f4134970ad4b3ee3a93cad1c8a6865de7

实战


1.引入H2数据库

点击工程的"Project Structure"图标,如下图所示:

configure_project_structure

在弹出的界面中根据顺序,依次选择,选择从Maven服务器下载

new_project_library_from_maven

在弹出的界面中根据顺序依次操作,点击搜索图标之后,要等待比较长的一段时间,才能看到下面的OK按钮可以点击。目前H2最新的版本是1.4.191,因此输入"com.h2database:h2:1.4.191"。详细操作如下图:

DownloadLibraryFromMavenRepositoryH2

点击OK按钮,关闭窗口后,稍等,会发现出现一个Problems的提示,点击这个提示列表,如下图所示:

ChooseModules

ProjectStructureH2ProblemsFix

完成后点击OK按钮关闭界面。

2.引入Hibernate框架

切换工程的视图到"Project"模式下

ModelSwitchToProject

项目上面右击鼠标,选择"Add Framework Support ..."菜单,如下图:

AddFrameworkSupportMenuHibernate

在弹出的界面中选择"Hibernate",如下图所示

AddFrameworkSupportMenuHibernateDownload

点击后,出现下载进度,等待进度完成,如下图:

AddFrameworkSupportMenuHibernateDownloadWaiting

下载完成后,再次点击工程的"Project Structure"图标,如下图:

ProjectStructureForHibernate

同样在出现的界面中修复提示的Problems,如下图:

ProjectStructureForHibernateFix

增加"Hibernate"配置文件,点击工程的"Project Structure"图标,如下图:

ProjectStructureForHibernate

增加"Hibernate"配置文件,如下图:ProjectStructureForHibernateAddConfigureFile

选择文件的路径,此处我们使用默认路径,点击OK即可。

ProjectStructureForHibernateAddConfigureFilePathSelect

此时我们点击工程目录,会发现,已经新增了一个名字为hibernate.cfg.xml的配置文件,如下图:

HibernateConfigureFile

3.配置Hibernate与H2数据库通信

按下面所示的修改hibernate.cfg.xml文件,如下:

<?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这个类,因此我们创建这个类,如下图所示:

HibernateVisitorModel

三个文件的源代码如下:

Visitor.Java中的代码如下:

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,这个是个数据库的表配置类,其中的每个成员变量对应数据库表的字段。
如下的注解

@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="tableGenerator")
@TableGenerator(name="tableGenerator",initialValue=1,allocationSize=1)
@Column(unique=true, nullable=false)

表示id为整个表的自增主键。

VisitorDao.Java中的代码如下,这个文件提供了访问数据的接口定义:

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中定义的接口进行了实现:

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

这部分的代码需要着重解释一下

Query query = session.createQuery("from Visitor");

这个语句,注意,这个语句中的"from Visitor"Visitor.Java中定义的类的名称,由Hibernate内部进行变量,表之间的对应。

如上操作之后,就可以在任意的Action中通过调用VisitorDaoImpl实现对于数据库的写入,查询了。

参考链接


Frequently Asked Questions

发布者

《IntelliJ IDEA 2016.1.2建立Struts2+Spring+Hibernate+H2数据库项目》上有2条评论

    1. 这个是一个系列,在前言中标明使用 "IntelliJ IDEA 2016.1建立Strut2工程并使用Tomcat调试" 这部分中进行的spring的引入。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注