zoukankan      html  css  js  c++  java
  • 《Java EE编程技术》综合应用系统开发_作业管理系统_Struts2_Hibernate_设计报告

    《Java EE编程技术》综合应用系统开发_作业管理系统_Struts2_Hibernate_设计报告

    目录

    一、连接数据源: 1

    二、hibernate的引入与整合: 4

    1. 首先导入必须的jar包: 4

    2. 在module中引入hibernate tools工具: 5

    3. 接下来即可自动生成配置hibernate.cfg.xml。 5

    4. 目录结构: 6

    ①hibernate.cfg.xml: 7

    ②StudentEntity: 9

    ③映射文件StudentEntity.hbm.xml: 11

    5. 在项目中采用hibernate方式操作后部分结构变化如下(整合): 13

     

    (这里下面的文档结构由于格式原因,序号标题等产生了一些问题,请见谅)

    对于struts2相关内容及项目的设计实现流程请参见《Java EE编程技术》综合应用系统开发_作业管理系统_Struts2_设计报告,这里不再赘述,本文主要讲解hibernate的配置和使用以及struts2+hibernate整合思路。

    一、连接数据源:

    为方便使用我们先连接数据源(即使用IDE方式直接与数据库进行连接,以便于我们更加直观的使用数据库):

    选择MySQL输入相应的用户名、密码、URL

    (jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai)等配置信息即可。

    二、hibernate的引入与整合:

    1. 首先导入必须的jar包:

    1. 在module中引入hibernate tools工具:

    1. 接下来即可自动生成配置hibernate.cfg.xml。

     

    此时选择自动生成实体和对应的配置文件:

     

    1. 目录结构:

    对应的实体类和配置文件已经生成完毕。

    (根据软件工程思想,这属于逆向工程)(由于数据库我们已经建立完毕,因此这里采用的是逆向的,如果我们一开始确立的对象是java对象,我们也可以利用hibernate生成对应的数据库表文件,则称为正向):

    正向工程:Java实体类 ---->mapping---- > DB数据库关系表

    逆向工程:先创建DB数据库关系表,用工具生成生成mapping 和Java实体类。

    此时配置文件中内容如下(部分):

    ①hibernate.cfg.xml:

    注意自动生成后的配置文件还需要添加一些属性:

    例如:

        <!-- 运行时是否打印 SQL -->

        <property name="show_sql">true</property>

        <!-- 运行时是否格式化 SQL -->

        <property name="format_sql">true</property>

        <!-- 生成数据表的策略 -->

    <property name="hbm2ddl.auto">update</property>

    ......

    <?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.url">
          <![CDATA[jdbc:mysql://localhost:3306/homework?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai]]></property>
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        
        <!-- 设定一些其他配置 -->
        <!-- 运行时是否打印 SQL -->
        <property name="show_sql">true</property>
        <!-- 运行时是否格式化 SQL -->
        <property name="format_sql">true</property>
        <!-- 生成数据表的策略 -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 设置 Hibernate 的事务隔离级别 -->
        <property name="connection.isolation">2</property>
        <!-- 删除对象后, 使其 OID 置为 null -->
        <property name="use_identifier_rollback">true</property>
        <!-- 配置 C3P0 数据源 -->
        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="c3p0.acquire_increment">2</property>
        <property name="c3p0.idle_test_period">2000</property>
        <property name="c3p0.timeout">2000</property>
        <property name="c3p0.max_statements">1000</property>
        <!-- 设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数 -->
        <property name="hibernate.jdbc.fetch_size">1000</property>
        <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 -->
        <!-- 需要关联的 hibernate 映射文件 .hbm.xml -->
    
        <mapping resource="entity_hibernate/PublishEntity.hbm.xml"/>
        <mapping class="entity_hibernate.PublishEntity"/>
        <mapping resource="entity_hibernate/StudentEntity.hbm.xml"/>
        <mapping class="entity_hibernate.StudentEntity"/>
        <mapping class="entity_hibernate.SubmitEntity"/>
        <mapping resource="entity_hibernate/SubmitEntity.hbm.xml"/>
        <mapping resource="entity_hibernate/TeacherEntity.hbm.xml"/>
        <mapping class="entity_hibernate.TeacherEntity"/>
        <!-- <property name="connection.username"/> -->
        <!-- <property name="connection.password"/> -->
    
        <!-- DB schema will be updated if needed -->
        <!-- <property name="hibernate.hbm2ddl.auto">update</property> -->
      </session-factory>
    </hibernate-configuration>
    
    

    ②StudentEntity:

    package entity_hibernate;
    
    import javax.persistence.*;
    import java.util.Objects;
    
    @Entity
    @Table(name = "student", schema = "homework", catalog = "")
    public class StudentEntity {
        private int sId;
        private String sPassword;
        private String sName;
        private String sCollege;
        private String sDepartment;
        private Integer sClass;
        private String sSex;
        private String sEmail;
    
        @Id
        @Column(name = "s_id", nullable = false)
        public int getsId() {
            return sId;
        }
    
        public void setsId(int sId) {
            this.sId = sId;
        }
    
        @Basic
        @Column(name = "s_password", nullable = true, length = 20)
        public String getsPassword() {
            return sPassword;
        }
    
        public void setsPassword(String sPassword) {
            this.sPassword = sPassword;
        }
    
        @Basic
        @Column(name = "s_name", nullable = true, length = 20)
        public String getsName() {
            return sName;
        }
    
        public void setsName(String sName) {
            this.sName = sName;
        }
    
        @Basic
        @Column(name = "s_college", nullable = true, length = 30)
        public String getsCollege() {
            return sCollege;
        }
    
        public void setsCollege(String sCollege) {
            this.sCollege = sCollege;
        }
    
        @Basic
        @Column(name = "s_department", nullable = true, length = 30)
        public String getsDepartment() {
            return sDepartment;
        }
    
        public void setsDepartment(String sDepartment) {
            this.sDepartment = sDepartment;
        }
    
        @Basic
        @Column(name = "s_class", nullable = true)
        public Integer getsClass() {
            return sClass;
        }
    
        public void setsClass(Integer sClass) {
            this.sClass = sClass;
        }
    
        @Basic
        @Column(name = "s_sex", nullable = true, length = 10)
        public String getsSex() {
            return sSex;
        }
    
        public void setsSex(String sSex) {
            this.sSex = sSex;
        }
    
        @Basic
        @Column(name = "s_email", nullable = true, length = 30)
        public String getsEmail() {
            return sEmail;
        }
    
        public void setsEmail(String sEmail) {
            this.sEmail = sEmail;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            StudentEntity that = (StudentEntity) o;
            return sId == that.sId &&
                    Objects.equals(sPassword, that.sPassword) &&
                    Objects.equals(sName, that.sName) &&
                    Objects.equals(sCollege, that.sCollege) &&
                    Objects.equals(sDepartment, that.sDepartment) &&
                    Objects.equals(sClass, that.sClass) &&
                    Objects.equals(sSex, that.sSex) &&
                    Objects.equals(sEmail, that.sEmail);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(sId, sPassword, sName, sCollege, sDepartment, sClass, sSex, sEmail);
        }
    }
    
    

    ③映射文件StudentEntity.hbm.xml:

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    
        <class name="entity_hibernate.StudentEntity" table="student" schema="homework">
            <id name="sId">
                <column name="s_id" sql-type="int(11)"/>
            </id>
            <property name="sPassword">
                <column name="s_password" sql-type="varchar(20)" length="20" not-null="true"/>
            </property>
            <property name="sName">
                <column name="s_name" sql-type="varchar(20)" length="20" not-null="true"/>
            </property>
            <property name="sCollege">
                <column name="s_college" sql-type="varchar(30)" length="30" not-null="true"/>
            </property>
            <property name="sDepartment">
                <column name="s_department" sql-type="varchar(30)" length="30" not-null="true"/>
            </property>
            <property name="sClass">
                <column name="s_class" sql-type="int(10)" not-null="true"/>
            </property>
            <property name="sSex">
                <column name="s_sex" sql-type="varchar(10)" length="10" not-null="true"/>
            </property>
            <property name="sEmail">
                <column name="s_email" sql-type="varchar(30)" length="30" not-null="true"/>
            </property>
        </class>
    </hibernate-mapping>
    
    

    对于上述配置完毕后,我们只需修改dao层的一些方法即可,对于简单的SQL语句我们可以直接采用native方式进行,无需修改。

    1. 在项目中采用hibernate方式操作后部分结构变化如下(整合):

    这里为了降低耦合度,dao层采用接口方式,分别利用JDBC或者c3p0进行实现,这里引入hibernate后又有了不同的实现方式,但是由于接口的透明性,我们隐藏了对上层服务的实现细节,因此如果整合hibernate只需增加更改hibernate实现即可。

     

    需要注意的内容HibernateUtil:

    package db_util;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    
    public final class HibernateUtil {
       private static SessionFactory sessionFactory;
       private static ThreadLocal<Session> session = new ThreadLocal<Session>();
    
       private HibernateUtil() {
       }
    
       static {
          // 第一步:读取Hibernate的配置文件 hibernamte.cfg.xml文件
          Configuration configuration = new Configuration().configure();
          // 第二步:创建服务注册构建器对象,通过配置对象中加载所有的配置信息
          StandardServiceRegistryBuilder regbulider = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
          // 创建注册服务
          ServiceRegistry serviceRegistry = regbulider.build();
          // 第三步:创建会话工厂
          sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    
       }
    
       public static Session getThreadLocalSession() {
          Session s = (Session) session.get();
          if (s == null) {
             s = sessionFactory.openSession();
             session.set(s);
          }
          return s;
       }  
    
       public static void closeSession() {
          Session s = (Session) session.get();
          if (s != null) {
             s.close();
             session.set(null);
          }
       }
    
    }

    本项目无需采用Hibernate的高级特性,也无需使用HQL语言进行数据库操作,但是使用hibernate可以大大简化实现过程。

    hibernate为我们提供了大量接口,除上述接口外还有如Transaction接口:

    commit():提交事务,transaction.commit()。

    rollback():撤销事务操作,transaction.rollback()。

    wasCommitted():检查事务是否提交,transaction.wasCommitted()。

     

    Query接口等等:

    使用Query接口提供的方法,可以方便地查询数据库中的数据,它主要通过HQL(Hibernate Query Language)查询数据。

     

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    阿里HBase高可用8年“抗战”回忆录
    Service Mesh 初体验
    阿里云HBase推出普惠性高可用服务,独家支持用户的自建、混合云环境集群
    Ververica Platform-阿里巴巴全新Flink企业版揭秘
    深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?
    AI加持的阿里云飞天大数据平台技术揭秘
    Nacos 常见问题及解决方法
    数据上云,应该选择全量抽取还是增量抽取?
    一文带你了解 Flink Forward 柏林站全部重点内容
    Oracle数据库中序列(SEQUENCE)的用法详解
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/14387292.html
Copyright © 2011-2022 走看看