学习Hibernate需要了解两个基础知识:
一、什么是ORM?
首先Hibernate是一种开源的ORM(Object/Relational Mapping)框架。那么什么是ORM呢?所谓的ORM指的是对象关系映射,所以Hibernate会在Java对象和关系数据库之间建立某种映射,以达到存取Java对象的目的,是实现持久化存储的一种解决方案。
注意:持久化存储指的是:将内存中的数据存储在关系型数据库、磁盘文件,XML数据文件中等。
其次Hibernate不仅可以管理Java类到数据库的映射,还提供了数据库查询和获取数据的方法,可以减少开发人员使用SQL和JDBC处理的数据处理时间。
二、Hibernate对于数据库的基本的操作流程以及配置文件(我使用的是MySQL数据库)。
Hibernate对数据库的操作主要通过配置文件hibernate.cfg.xml来操作数据库,配置文件示例代码如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<!-- 表示使用mysql 数据库驱动类 -->
<propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- jdbc 的连接url 和数据库(使用我们之前新建的hibernate)-->
<propertyname="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- 数据库用户名 -->
<propertyname="connection.username">root</property>
<!-- 密码(这里为空) -->
<propertyname="connection.password">root123</property>
<!-- JDBC connection pool (use the built-in) -->
<!-- <property name="connection.pool_size">1</property>-->
<!-- 数据库使用的方言 -->
<propertyname="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed SQL tostdout -->
<!-- 设置打印输出sql 语句为真 -->
<propertyname="show_sql">true</property>
<!-- 设置格式为sql -->
<propertyname="format_sql">true</property>
<!-- 第一次加载hibernate 时根据实体类自动建立表结构,以后自动更新表结构 -->
<propertyname="hbm2ddl.auto">update</property>
<!-- 映射文件 -->
<!-- <mapping resource="com/hz/hibernate/entity/User.hbm.xml"/> -->
<mappingclass="com.hz.hibernate.entity.Person"/>
</session-factory>
</hibernate-configuration>
在了解了这两个Hibernate中做需要的基础知识之后,我们正式的学Hibernate相关的知识。
Hibernate的缓存
Hibernate的缓存指的是为了降低应用程序对物理数据源访问的次数来提升应用程序的运行性能的一种策略。缓存实质上帮我们来提升应用程序访问数据库的效率和应用程序运速度的。
Hibernate缓存的一般的工作原理:
一、Hibernate的一级缓存的使用
Hibernate一级缓存成为Session缓存或者是会话缓存;通过Session从数据查询实体类时会把实体在内存中存储起来,下一次查询统一实体时不再从数据中获取,从而在内存中获取;一级缓存的生命周期和Session相同的,Session销毁,它也就是随之销毁。
一般情况下,根据项目实际的需要,Session的生命周期是可以自己设置的,修改的位置在项目文件下在web.xml文件中修改:
session-config>
<session-timeout>30</session-timeout>
</session-config>
Hibernate的一级缓存是无法取消的,提供了两个API进行管理:
Evict(指定对象):将某个对象从Session的一级缓存中清除(清除缓存中的制定对象);
Clear():用于将一级缓存中的所有对象清除。
二、Hibernate的二级缓存的使用
Hibernate的二级缓存指的是:每个Session共用缓存;全局缓存,应用级缓存;二级缓存中的数据可使用范围是当前应用的所有回话。它可插拔式缓存,默认是EHCache。
Hibernate二级缓存的配置:
1、添加二级缓存对应的jar包;
2、在Hibernate的配置文件中添加Provider类的描述
3、添加二级缓存的属性配置文件
4、在需要被缓存的表述所对应的映射文件中添加<cache/>标签
Hibernate中二级缓存的应用场景:
1、很少被修改的数据;
2、不是很重要的书库,允许偶尔并发的数据;
3、不会被并发访问的数据;
4、参考数据。
三、Hibernate一二级缓存的对比和总结
1、Hibernate的缓存能提高检所效率;
2、Hibernate的缓存分为一级缓存和二级缓存;一级缓存是会话级缓存;二级缓存是应用级缓存;
3、Hibernate的缓存在提高检索的同时,也会增加服务器的消耗,所以要注意缓存的使用策略。
Hibernate的增删改查:
Hibernate的增删改查几乎是操作Hibernate的API来完成对数据库的操作,主要掌握Hibernate的五种基本的配置即可,示例代码如下:
package com.hz.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hz.hibernate.entity.User;
public class TestAdd {
//@SuppressWarnings("unchecked")
public static void main(String[] args) {
//获取hibernate配置信息
Configuration configuration=new Configuration().configure();
//根据configuration建立sessionFactory
SessionFactory sessionFactory=configuration.buildSessionFactory();
//开启session(相当于开启jdbc的connnection)
Session session=sessionFactory.openSession();
//创建并开启事务对象
session.beginTransaction();
//在此处完成增删改查的操作
//新建对象,并赋值
User user = new User();
user.setId(1);
user.setUsername("zkx");
user.setPassword("zkx501");
//保存对象
session.save(user);
//提交事务
session.getTransaction().commit();
//关闭session和sessionFactory
session.close();
sessionFactory.close();
}
}
Hibernate映射:
使用 EJB注解映射的方式。Enterprise JavaBean, EJB是一个用来构筑企业级应用的服务器端可被管理组件。EJB注解表达了和Hibernate持久化实体对象同样的概念。
Hibernate映射需要配置两个文件:
Entity.hbm.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 映射对应的 package -->
<hibernate-mappingpackage="com.hz.hibernate.entity">
<!-- 实体类和数据库中的表对应(如果没有这个表则新建) -->
<classname="User"table="user_info">
<!-- id主键和其他属性对应表中相应的字段(这些都是在 User.java实体类中定义的) -->
<idname="id"column="user_id"/>
<propertyname="username"column="user_username"></property>
<propertyname="password"column="user_password"></property>
</class>
</hibernate-mapping>
Hibernate.cfg.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<!-- 表示使用mysql 数据库驱动类 -->
<propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- jdbc 的连接url 和数据库(使用我们之前新建的hibernate)-->
<propertyname="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- 数据库用户名 -->
<propertyname="connection.username">root</property>
<!-- 密码(这里为空) -->
<propertyname="connection.password">root123</property>
<!-- JDBC connection pool (use the built-in) -->
<!-- <property name="connection.pool_size">1</property>-->
<!-- 数据库使用的方言 -->
<propertyname="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed SQL tostdout -->
<!-- 设置打印输出sql 语句为真 -->
<propertyname="show_sql">true</property>
<!-- 设置格式为sql -->
<propertyname="format_sql">true</property>
<!-- 第一次加载hibernate 时根据实体类自动建立表结构,以后自动更新表结构 -->
<propertyname="hbm2ddl.auto">update</property>
<!-- 映射文件 -->
<mapping resource="com/hz/hibernate/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>