近来基本将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的约束
然后我们引入使用Hibernate的几个必要的标签
com.mysql.jdbc.Driver
//数据库名称
jdbc:mysql:///hibernate_day01
//数据库用户名
root
//数据库密码
root
org.hibernate.dialect.MySQLDialect
前几项类似于我们配置JDBC的驱动配置,而方言配置是Hibernate将用户的操作转化为SQL语句时,使用哪种数据库语言,通过这一方法,我们能够实现更换数据库时保证源码不进行重构。
这几项完成后,需要引入类与表的关联的XML文件,代码如下
这样能够让Hibernate加载到我们类表关联的配置文件,文件路径为全路径名称。其中还有一些可选配置例如
是否打印SQL语句到控制台上
true
SQL语句是否进行格式化
true
该类语句可以到Hibernate官方提供的API中进行查询
关于类与表映射配置
这是Hibernate的核心内容,通过XML配置完成后,框架完成解析,将我们对于对象的每一步操作自动转化为SQL语句,XML文件配置正确与否将直接影响到我们程序能否进行使用。
基本过程如下
约束文件如下
之后进行其他映射建立
//name为类的全路径名,table为表的名称,必须对应一致
//其中native为一种主键自增长方式,之后进行详细描述
此时,我们就建立了一个实体类与表映射的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传统的思维方法,将实现细节进行封装,只需要我们关注业务本身即对象层面操作即可。
关于其中内容一些注释