Hibernate是一个ORM(Object Relational Mapping)开源框架,与MyBatis一样,Hibernate也是数据库操作的一种持久层框架。其基于JDBC,不用写SQL语句,在Hibernate下数据库表和实体类会有一一对应关系,即映射关系,操作数据库只需要操作实体类即可。现在Hibernate的使用比重相比MyBatis来说小很多。现在只做一般学习了解,后面如果有必要深入学习再补充添加,接下来记录Hibernate的使用方法。
Hibernate核心API
(1)configuration
(2)sessionfactory
(3)session
(4)query
(5)transaction
核心API体现在Hibernate的工作原理中,其调用后即可以完成对数据库的操作:
Hibernate启动→创建configuration(读取xml)→sessionfactory→session→创建transaction→持久化操作→提交事务→关闭session
Hibernate启动后,会加载hibernate.cfg.xml配置文件读取配置信息创建configuration对象,使用configuration对象创建sessionfactory,然后使用sessionfactory创建session,这个session是Hibernate下的session,MyBatis下也有,有点类似。创建完session后,再使用session开启transaction,然后开始持久化操作,也就是数据库的操作,最后提交事务和关闭session。
二级缓存概念
Hibernate框架提供的缓存区域,session管理的区域称为一级缓存,sessionfactory管理的区域称为二级缓存。一级缓存是Hibernate启动时就有的,二级可以手动卸载装载,需要通过配置文件的加载。另外一级存储中的数据是常用操作数据,二级缓存中的数据不常操作。
其处理流程为:请求数据→session中查找→如果session中没有查找到继续到sessionfactory中查找→前面都没查找到就查找DB。
Hibernate的使用
(1)导包 hibernate核心包(3.6.9),数据库驱动包,javassit.jar包(3.8.0),另外可以导入junit包进行测试
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.boe</groupId> <artifactId>SSH04</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!-- 导入Hibernate核心包 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.9.Final</version> </dependency> <!-- 导入数据库驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!-- 导入javassit.jar包 --> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.8.0.GA</version> </dependency> <!--导入junit测试包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <classifier>sources</classifier> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <classifier>javadoc</classifier> </dependency> </dependencies> </project>
(2)相关文件的配置,配置文件hibernate.cfg.xml和映射文件(如User.hbm.xml),前者是管理连接数据库,后者是管理表和对象的映射关系
配置文件hibernate.cfg.xml,其中主要配置连接数据库,以及映射文件位置:
<?xml version="1.0" encoding="GBK"?> <!-- 指定Hibernate配置文件的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> <!-- 指定数据库方言,用这个可以切换连接不同的数据库 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 连接数据库 --> <!-- 驱动,url,用户名和密码 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/ssh</property> <property name="connection.username">root</property> <property name="connection.password">密码</property> <!-- 显示Hibernate持久层操作所使用的SQL --> <property name="show_sql">true</property> <!-- 将脚本格式化后再进行输出 --> <property name="hibernate.format_sql">true</property> <!-- 设置Mapping映射资源文件位置 --> <mapping resource="User.hbm.xml"/> </session-factory> </hibernate-configuration>
映射文件User.hbm.xml,也可以通过eclipse插件自动生成,下面是手动配置的结果:
<?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"> <!-- 配置映射文件,名字一般用实体类类名.hbm.xml --> <hibernate-mapping> <!-- 创建实体类和表的映射关系 --> <class name="Entity.User" table="user"> <!-- 设置主键映射 --> <id name="id" column="id" type="int"></id> <!-- 设置其他非主键映射 --> <property name="name" column="name" type="string"></property> <property name="password" column="password" type="string"></property> </class> </hibernate-mapping>
User实体类:
package Entity; import java.io.Serializable; /** * 用于映射关联的实体对象 * @author yangchaolin */ public class User implements Serializable{ private static final long serialVersionUID = 699190475611076064L; private int id; private String name; private String password; public User() { super(); } public User(int id, String name, String password) { super(); this.id = id; this.name = name; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } 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; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (id != other.id) return false; return true; } @Override public String toString() { return "User [>; } }