近来基本将Hibernate进行了一个理解和应用,虽然现在使用SSH框架的企业很少了,但是三大框架主流思维还是相对较为相似,Hibernate上手难度较低,更容易理解,同时也是通过XML进行配置的典型框架,我认为还是有必要进行一个了解。
Hibernate是一个持久层框架,其思想为ORM(Object Relational Maps)对象关系映射。能够通过XML文件进行配置,同时其框架为我们提供了多种优化手段,能够极大提高开发效率同时也使维护变的更加方便。
对象关系映射(ORM)
对象关系映射是Hibernate中最为重要的一种思想。简单理解来说,ORM即将我们数据库中的数据表与Java中的实体类进行相对应,将Java实体类中的属性与表中的字段相关联,能够通过操作对象来完成对数据库中数据的更改。其最明显的优势就是能够以面向对象的思维方式来处理数据库问题。
之前使用JDBC处理数据库时,操作过于底层同时也不够灵活,如果需要更改查询条件,我们必须将SQL语句进行更改,这样的操作似乎也不太符合面向对象设计的理念,而在Hibernate框架中,我们可以通过更改对象的方式,框架将自动为我们完成数据库信息的更新和变动。
简单来说,Hibernate将给我们带来如下几个优势
-
JDBC操作繁琐,ORM简洁明了
-
SQL语句编写复杂,且不是面向对象的思维,ORM改善了这种方法并提供了自己的优化,并只需要对对象操作即可
-
可将对象与表之间建立联系,简化了编程思维
-
ORM解决了跨数据库平台优势,当更换数据库时,不需要重构代码(可移植性好)
-
ORM为轻量级框架,使用更加灵活
Hibernate关系映射
Hibernate中我们可以实现几种关系映射,如下
-
实体类与数据表关系映射(属性映射,类映射)
-
一对一映射
-
一对多映射
-
多对多映射
Hibernate XML关系配置
在使用Hibernate前,我们需要对Hibernate进行一些关系配置,其中主要分为实体类与表的映射配置与Hibernate框架配置两个XML的使用。
关于Hibernate框架配置
文件名命名为hibernate.cfg.xml,可以进行更改,但是需要更改配置,一般都使用默认名称。
首先我们需要引入hibernate.cfg.xml的约束
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
然后我们引入使用Hibernate的几个必要的标签
<hibernate-configuration>
<session-factory>
<!-- 数据库基本配置 -->
<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
//数据库名称
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
//数据库用户名
<property name="hibernate.connection.username">root</property>
//数据库密码
<property name="hibernate.connection.password">root</property>
<!-- Hibernate 方言配置 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
前几项类似于我们配置JDBC的驱动配置,而方言配置是Hibernate将用户的操作转化为SQL语句时,使用哪种数据库语言,通过这一方法,我们能够实现更换数据库时保证源码不进行重构。
这几项完成后,需要引入类与表的关联的XML文件,代码如下
<mapping resource="demo1/Customer.hbm.xml"/>
这样能够让Hibernate加载到我们类表关联的配置文件,文件路径为全路径名称。其中还有一些可选配置例如
是否打印SQL语句到控制台上
<property name="hibernate.show_sql">true</property>
SQL语句是否进行格式化
<property name="hibernate.format_sql">true</property>
该类语句可以到Hibernate官方提供的API中进行查询
关于类与表映射配置
这是Hibernate的核心内容,通过XML配置完成后,框架完成解析,将我们对于对象的每一步操作自动转化为SQL语句,XML文件配置正确与否将直接影响到我们程序能否进行使用。
基本过程如下
- 引入约束文件
- 建立表与实体类的映射
- 建立表与主键的对应
- 建立表中字段与类中普通属性的对应
约束文件如下
<!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="demo1.Customer" table="cst_customer">
<!-- 建立类中属性与表中主键对应-->
<id name="cust_id" column="cust_id">
//其中native为一种主键自增长方式,之后进行详细描述
<generator class="native"></generator>
</id>
<!-- 建立类中普通属性与表中字段-->
<property name="cust_name" column="cust_name" />
<property name="cust_source" column="cust_source" />
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
</class>
</hibernate-mapping>
此时,我们就建立了一个实体类与表映射的XML文件。
此时我们来看下如Hibernate如何让我们不使用SQL语句即可完成对数据库的操作。
public class HibernateDemo1 {
@Test
public void function() {
//加载核心配置文件
Configuration configuration = new Configuration();
configuration.configure();
//创建session-factory对象,类似于JDBC连接池,维护缓存等内容
SessionFactory SessionFactory = configuration.buildSessionFactory();
//通过session-factory获取到session对象,类似于jdbc中connection对象
Session session = SessionFactory.openSession();
//手动开启事务,在Hibernate5中不需要手动开启,为了保证兼容
Transaction transcation = session.beginTransaction();
//编写代码
Customer customer = new Customer();
customer.setCust_name("张三");
//将对象保存
session.save(customer);
//事务提交
transcation.commit();
//释放资源
session.close();
SessionFactory.close();
}
}
我们能够看到,代码中没有出现SQL语句,而是通过SAVE方法将对象进行保存即完成了对数据库的一个操作,这实际上也体现了框架的一种面向对象的思维方式,摈弃以往JDBC传统的思维方法,将实现细节进行封装,只需要我们关注业务本身即对象层面操作即可。
关于其中内容一些注释
- 操作需要我们使用session进行处理,例如增删改查
- session代表数据库连接对象,是线程不安全的,不能够定义为全局变量
- 在使用完成后需要我们及时关闭session资源