什么是hibernate框架(开放源代码的对象关系映射框架)
-
概念
- Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。
-
特点
- 将对数据库的操作转换为对Java对象的操作,从而简化开发。通过修改一个“持久化”对象的属性从而修改数据库表中对应的记录数据。
- 提供线程和进程两个级别的缓存提升应用程序性能。
- 有丰富的映射方式将Java对象之间的关系转换为数据库表之间的关系。
- 屏蔽不同数据库实现之间的差异。在Hibernate中只需要通过“方言”的形式指定当前使用的数据库,就可以根据底层数据库的实际情况生成适合的SQL语句。
- 非侵入式:Hibernate不要求持久化类实现任何接口或继承任何类,POJO即可。
-
hibernate 体系概要图
-
ORM(Object Relational Mapping)是对象到关系的映射,它的作用是在关系数据库和对象之间做一个自动映射,将数据库中数据表映射成为对象,也就是持久化类,对关系型数据以对象的形式进行操作,减少应用开发过程中数据持久化的编程任务。可以把ORM理解成关系型数据和对象的一个纽带,开发人员只需关注纽带的一端映射的对象即可。ORM原理如下图示。
-
核心API
- Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。
- Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。 - SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。 - Transaction
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。 - Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。 - Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。 - Configuration
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
简单案例入门
-
步骤一
我这里的表结构如下
-
步骤二,创建表对应的实体类
/* * 这是hibernate持久层框架的数据库表的一个映射实体类 * 该类中的属性对应着表里的每个字段 * 并生成它的get set方法,必须要有它的无参构造器 *这个实体类映射数据库表中的user01 * */ public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
-
步骤三,核心配置文件,一般名字都为
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-configuration> <!--第一步,设置数据库连接属性--> <!--name="datasouce"配置这个属性的时候如果没有jndi这个包,如果没有这个包就会报 Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial 这个错误信息--> <!-- <session-factory name="datasouce">--> <session-factory> <!-- 配置关于数据库连接的四个项:driverClass url username password --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <!-- 第二步,设置数据库方言--> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 设置是否显示sql语句--> <property name="show_sql">true</property> <!-- 设置是否格式化sql语句--> <property name="hibernate.format_sql">true</property> <!-- 第三步,加载你的表和类的关系映射配置文件--> <mapping resource="User.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
-
步骤四,配置映射文件,一般文件名为
实体类名.hbm.xml
,代码如下<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!--把实体类的每个属性和表中的字段进行关联--> <hibernate-mapping package="com.wdhcr.po"> <!--把实体类和数据库表进行映射--> <class name="User" table="user01"> <!-- 这里注意hibernate映射关系中必须要有id这个标签一般是映射表中的主键使用--> <!-- class下必须要有一个id的子元素 id是用于描述主键的 --> <id name="name" type="java.lang.String" column="name"> <!-- 主键生成策略 --> <generator class="native"></generator> </id> <!--使用property来描述属性与字段的对应关系--> <property name="password" type="java.lang.String" column="password"></property> </class> </hibernate-mapping>
-
步骤五,测试
import com.wdhcr.po.User; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query; import java.util.List; public class Test { public static void main(String[] args) { Configuration configuration = new Configuration(); //配置你的全局配置文件 configuration.configure("hibernate.cfg.xml"); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); //添加用户 // User user = new User(); // user.setName("eee"); // user.setPassword("123456"); // //开启事务 // Transaction transaction = session.beginTransaction(); // session.save(user); // //提交事务 // transaction.commit(); // //关闭资源 // session.close(); //删除用户 //获取session中的指定的数据并返回 // User qqq = session.get(User.class, "qqq"); // Transaction transaction = session.beginTransaction(); // session.delete(qqq); // transaction.commit(); // session.close(); //更新用户 // User user = new User(); // user.setName("www"); // user.setPassword("000000"); // Transaction transaction = session.beginTransaction(); // session.update(user); // transaction.commit(); // session.close(); //查询数据 Query from_user01 = session.createQuery("from User");// HQL语句,它类似于SQL语句 List<User> list = from_user01.list(); for (User user : list) { System.out.println(user.getName()+"\t"+user.getPassword()); } } }
-
以上就是hibernate的简单入门程序啦。