hibernate框架
hibernate是什么
hibernate是一个开放源代码的对象关系映射(ORM)框架,他对jdbc进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用面相对象的编程思维来操作数据库
hibernate可以在java的客户端程序使用也可以在servlet中使用。
hibernate是一个持久层的ORM框架。
以后会学到服务层的框架spring。
什么是对象关系映射(ORM)
ORM映射:Object Relational Mapping
- O:面向对象领域的Object(JavaBean对象)
- R:关系数据库领域的Relational(表的结构)
- M:映射Mapping(XML的配置文件)
简单一句话:Hibernate使程序员通过操作对象的方式来操作数据库表记录
在这里老师还模拟了一下他的实现,基本上就是使用反射来得到个个数据然后赋值,不过hibernate肯定复杂的多。
事前准备
首先我们肯定需要导入hibernate的jar包
我们在官网上下载zip的包,然后解压,找到\hibernate-release-5.2.11.Final\lib\required将下面的所有jar包导入,另外还有mysql的数据库驱动,然后我们就可以在eclipse中开始hibernate的入门之旅了。
建立实体类并配置文件
因为是将数据库和实体类映射,所以我们需要先建立实体类,这里有一点需要注意,就是实体类的所有属性都尽量使用包装类,不要使用基本变量类型。
在这里我们简单的创建一个Person类,属性如下
private String pid;
private String name;
private Integer age;
private String address;
分别建立get,set方法,有参构造,无参构造,重写toString方法。对于所有的实体类都是如此。
然后建立数据库,建表语句如下
CREATE TABLE person (
pid VARCHAR(255) NOT NULL,
NAME VARCHAR(255),
age INTEGER,
address VARCHAR(255),
PRIMARY KEY (pid)
);
对于hibernate来说,他需要知道,这个类是怎么和数据库相关联的,主键如何生成,是那个类,等等问题,所以我们需要在domain包下创建一个xml的配置文件来告诉hibernate如何映射。
一般来说我们将配置文件命名为
类名.hbm.xml
尽管配置文件命名随便,但是我们推荐这种写法,比如
Persoon.hbm.xml
我们建立好xml之后,就打开,编辑。
另外,关于映射文件的所有细节我们可以打开,
hibernate-core-5.2.11.Final.jar
下的/org/hibernate/hibernate-mapping-3.0.dtd
这里使用的是3.0版本。
首先将
<!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="com.meng.domain.Person" table="person">
里面的name属性填类的全名称,table填数据库中的表名。
下面是一个
<id name="pid" column="pid">
<generator class="native"></generator>
</id>
其中id定义的是主键,和数据库中对应的列,然后里面的gengrator设置的是主键的增长方式,我们使用native本地数据库的模式。
然后这个标签下面就是属性和列名之间的映射
<property name="name" column="name"></property>
<property name="age" column="age"></property>
<property name="address" column="address"></property>
然后关闭class,mapping即可
这样我们的类配置文件就完成了。
配置hibernate核心配置文件
hibernate知道了怎么映射,但是我们还没有连接上数据库,我们还需要配置连接数据库。
我们在src下面建立一个hibernate.cfg.xml
这个名称是固定的。
同样,我们可以在同样的包下面/org/hibernate/hibernate-configuration-3.0.dtd
找到所有的配置项
我们首先在这里面将
<!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>
<!-- 1必选参数 4个基本参数加一个方言参数-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate02</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 2选填参数 -->
<!-- 显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.current_session_context_class">thread</property>
<!-- 3映射文件 -->
<mapping resource="com/meng/domain/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>
这里有5个必填的参数,也就是连接数据库的四个参数加上数据库方言,每个数据库方言都不一样,我们使用的是mysql。
选填参数很复杂,这里不再详细介绍。
到此为止,我们已经配置完成了。
那么我们应该如何使用hibernate操作数据库呢?还是像原来一样得到Connection连接吗,很明显不可能。
通过hibernate操作数据
这里涉及到许多类
Configuration类和作用
Configuration对象用于配置并且启动hibernate,我们通过configuration对象,加载我们之前配置的配置文件,然后可以获取SessionFactory对象
Configuration有两种,我们采用的是xml的方式,这种方式优点是不用手动加载映射文件。
另外一种方式是properties方式。
我们采用的xml方式加载使用
`Configuration configuration = new Configuration().configure();`
就可以得到config对象
SessionFactory对象
一个工厂类,用于生成Session对象,一个数据库对应一个sessionFactory对象的实例,并且它是线程安全的,他的对象中保存了当前数据库的配置信息和所有映射关系以及预定义的sql语句,同时sessionFactory还负责维护hibernate的二级缓存。
一般来说一个应用使用一个SessionFactory,最好是在应用启动的时候就完成初始化。
我们可以通过他的openSession()
方法来得到一个session实例,或者通过getCurrentSession()
获取当前线程绑定的session。通过ThreadLocal实现的。原来我们写过这个栗子。
Session接口
Session接口是hibernate中使用最频繁的接口,也被称为持久化管理器。提供了和持久化相关的操作,比如修改删除加载和查询实体对象。
session是应用程序与数据库之间交互操作的一个单线程对象, 他是线程不安全的。
所有的持久化对象都必须在session的管理下才可以进行持久化操作。
常用的方法:
* save(obj)
* delete(obj)
* get(Class,id)
* update(obj)
* saveOrUpdate(obj) – 保存或者修改(如果没有数据,保存数据。如果有,修改数据)
* createQuery() – HQL语句的查询的方式
这里有Hql语句,可以简单的理解为,hql语句中查询的是实体类名,而且区分大小写,其他的差不多,另外就是query的各种设置变量的方法,具体可以参见hibernate的官方文档。
最简单的方法就是直接给“from Person”可以查询出来所有的对象。
Transaction接口
事务接口,在数据库操作中,肯定需要涉及到事务的操作。
我们通过session的beginTransaction可以得到事务
然后就是事务的commit提交事务,和roolback回魂事务。
hibernate下的事务默认不提交,需要手动提交
如果没有开启事务,那么每个session的操作都想当于一个独立的事务。