注:之前的一篇博客【JDBC】查询Student表是用纯JSP实现的,现在将Hibernate引入其中。Eclipse、MySQL、Hibernate3。
简介
Hibernate是当今比较流行的Java持久层框架之一。
Hibernate是对JDBC的轻量级封装,其主要功能是操作数据库。
Hibernate是一个开放源代码的ORM(Object Relational Mapping)框架,支持用面向对象思想来操作数据库。
实例
对用框架的学习,首先需要将其引入到项目中,一般引入的步骤都比较固定,做个笔记,以备查阅。
1、新建一个Web项目,引入Jar包
我们可以从官网下载Jar包,目前的最新版本是5.8.0,最新特性不太了解。这里使用的是hibernate-distribution-3.6.10.Final-dist版本,解压后将lib\required目录下的jar包、根目录的hibernate3.jar以及\lib\jpa目录下的jar包拷贝到Web项目的WebContent-WEB-INF\lib下即可(Hibernate基础JAR包)。
2、编写实体类
亦称持久化类,这里的持久化是指类的对象能够被持久化保存到数据库。Hibernate使用普通Java对象,即POJO(Plain Old Java Object)的编程模式来进行持久化。在src目录下创建一个cn.jujianfei.domain包,并在包中创建一个实体类Student,代码如下:
package cn.jujianfei.domain;
public class Student {
private Integer ID;
private Integer Sno;
private String Sname;
private String Saddress;
//getter和setter方法:略......
// 重写Object类的toString()方法
public String toString() {
return "Student [ ID =" + ID + ",Sno = " + Sno + ",Sname = " + Sname
+ ",Saddress =" + Saddress + "]";
}
}
3、编写映射文件Student.hbm.xml
实体类Student目前还不具备持久化操作的能力,而Hibernate需要知道实体类Student映射到数据库dbname中的哪个表,以及类中的哪个属性对应数据库表中的哪个字段,这些都需要在映射文件中配置。在Student类所在的包中创建一个Student.hbm.xml文件,该文件中定义了实体类Student的属性是如何映射到student表的列上的。代码如下:
<?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>
<!-- name代表的是实体类名,table代表的是表明 -->
<class name ="cn.jujianfei.domain.Student" table ="student">
<id name ="ID" column = "ID">
<generator class ="native" /> <!-- 主键生成策略 -->
</id>
<!-- 其他属性使用property标签来映射 -->
<property name ="Sno" column ="Sno" type= "integer" />
<property name ="Sname" column ="Sname" type ="string" />
<property name ="Saddress" column ="Saddress" type ="string" />
</class>
</hibernate-mapping>
4、编写核心配置文件hibernate.cfg.xml
Hibernate的映射文件反映了持久化类和数据库表的映射信息,而Hibernate的配置文件则主要用来配置数据库连接以及Hibernate运行时所需要的各个属性的值。在src下创建一个名称为hibernate.cfg.xml的文件,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 指定方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- 连接数据库的url -->
<property name="hibernate.connection.url">
jdbc:mysql:///dbname
</property>
<!-- 数据库的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库的密码 -->
<property name="hibernate.connection.password">jujianfei</property>
<!-- 其他配置 -->
<!-- 显示SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="format_sql">true</property>
<!-- 用来关联hbm配置文件 -->
<mapping resource="cn/jujianfei/domain/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
5、编写测试类来查询数据
public class StudentTest {
@Test
public void selectAll() {
// 1.加载hibernate.cfg.xml
Configuration config = new Configuration().configure();
// 2.获取SessionFactory
SessionFactory sf = config.buildSessionFactory();
// 3.得到一个Session
Session session = sf.openSession();
// 4.开启事务
Transaction t = session.beginTransaction();
// 5.操作
Student student = new Student();
String hql = "from Student";
Query query = session.createQuery(hql);
List<Student> students = query.list();
for(Student s:students){
System.out.println(s);
}
t.commit();
session.close();
sf.close();
}
}
6、查询结果
结语
Hibernate是开源的框架,那么则意味着它的更新速度也是很快的,我看的是16年出版的书,是基于Hibernate3来讲解的。目前已更新到Hibernate5.8,上面实例中的某些操作在最新版本中已被抛弃。在Hibernate3中,其优势主要有:封装了数据库访问层重复的代码,减少冗余,简化开发;一级缓存和快照的存在,访问数据库的次数减少,提高了运行效率;支持对关系型数据库的关联关系映射操作;数据检索方便,检索方式有:HQL,QBC、OID,SQL,导航对象图;最重要的一点,对于数据库的操作,并发访问的处理必不可少,Hibernate的事务管理和二级缓存也为并发问题提供了优秀的解决方案。