《Java EE编程技术》综合应用系统开发_作业管理系统_Struts2_Hibernate_设计报告
目录
2. 在module中引入hibernate tools工具: 5
3. 接下来即可自动生成配置hibernate.cfg.xml。 5
③映射文件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的引入与整合:
此时选择自动生成实体和对应的配置文件:
对应的实体类和配置文件已经生成完毕。
(根据软件工程思想,这属于逆向工程)(由于数据库我们已经建立完毕,因此这里采用的是逆向的,如果我们一开始确立的对象是java对象,我们也可以利用hibernate生成对应的数据库表文件,则称为正向):
正向工程:Java实体类 ---->mapping---- > DB数据库关系表。
逆向工程:先创建DB数据库关系表,用工具生成生成mapping 和Java实体类。
此时配置文件中内容如下(部分):
注意自动生成后的配置文件还需要添加一些属性:
例如:
<!-- 运行时是否打印 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>
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);
}
}
<?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方式进行,无需修改。
这里为了降低耦合度,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)查询数据。