Hibernate的核心就是O/R映射,用来解决在开发过程中,数据库的操作问题。
在之前的学习中,我们通常依靠JDBC来进行数据库的操作和管理,需要去书写一系列SQL语句,显然这对于开发者来说非常不方便。
Hibernate主要就是为了解决这个问题,将数据库映射到JAVA的持久化类中,然后我们就可以通过操作这些持久化的类来操作数据库,大大的方便了数据库的管理。
Hibernate的核心组件包括以下几部分:
a)Configuration类:用来读取Hibernate配置文件,并生成SessionFactory对象。
b)SessionFactory接口:产生Session实例工厂。
c)Session接口:用来操作PO。它有get(),load(),save(),update()和delete()等方法用来对PO进行加载,保存,更新及删除等操作。它是Hibernate的核心接口。
d)Query接口:用来对PO进行查询操。它可以从Session的createQuery()方法生成。
e)Transaction接口:用来管理Hibernate事务,它主要方法有commit()和rollback(),可以从Session的beginTrancation()方法生成。
其中最重要的是session和query,包含了数据库的主要操作。
java中的对象我们会分为三个状态:
a)临时状态,通常我们new一个对象出来后,该对象就处于这个状态,是一个孤立的状态,我们对该对象进行操作只对其本身有效果。
b)持久化状态,这个状态就是在数据库管理过程中的主要状态,通过操作该状态下的对象,我们可以对数据库进行操作。
c)脱管状态,持久化状态后,对象与数据库失去联系。
首先在源文件夹中进行配置hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:xxxx/xxxx</property>
<property name="connection.username">sa</property>
<property name="connection.password">123456</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hbm2dll.auto">update</property>
<property name="javax.persistence.validation.mode">none</property>
<property name="show_sql">true</property>
<mapping resource="com/bean/User.hbm.xml"/>
<mapping resource="com/bean/Journal.hbm.xml"/>
<mapping resource="com/bean/Article.hbm.xml"/>
<mapping resource="com/bean/Chapter.hbm.xml"/>
<mapping resource="com/bean/Paragraph.hbm.xml"/>
</session-factory></hibernate-configuration>
与数据库关联配置。
然后,我们同样需要创建javaBean作为数据模型。对于这些JavaBean,我们也要对其进行配置,使其与数据库中的表相对应,如user的配置。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bean.User" table="user" catalog="storyfm">
<id name="userid" type="java.lang.Integer">
<column name="userid"></column>
<generator class="increment"></generator>
</id>
<property name="username" type="java.lang.String">
<column name="username" length="20" not-null="true"></column>
</property>
<property name="password" type="java.lang.String">
<column name="password" length="20" not-null="true"></column>
</property>
<property name="email" type="java.lang.String">
<column name="email" length="50" not-null="false"></column>
</property>
<property name="note" type="java.lang.String">
<column name="note" length="500" not-null="false"></column>
</property>
<property name="admin" type="java.lang.Boolean">
<column name="admin" not-null="false"></column>
</property>
<set name="paragraphs" inverse="true" cascade="all">
<key column="paragraph_id"></key>
<one-to-many class="com.bean.Paragraph"></one-to-many>
</set>
</class>
</hibernate-mapping>
我们从tSessionFactory中获取一个Session,利用session来进行数据的操作。
public void updateUser(User user)
{
Session session = sessionFactory.openSession();
session.update(user);
session.flush();
session.close();
}
以上就是一个简单的使用。
深入学习的话,从数据库角度出发,主键,外键,表之间的管理是不可避免的,Hibernate可以通过在xml文件中进行配置,来映射这种关系,如上面的文件中的set标签,就是一个一对多的关系,同样的,还有多对一关系,一对一关系,通过标签的表示,可以表示这些关系,然后对持久化对象操作后,就可以完成相关联数据的操作。而且对于关联对象,Hibernate使用了延迟加载策略,也就是在某一数据未被使用的时候,先不去加载,到使用的时候才去将其进行加载。
session对象具有缓存机制,在session未被关闭的时候,你进行的数据操作会被缓存在session中,如果你再次进行数据操作,就会先从session对象中进行查找操作,而不是直接连接数据库,这样的机制可以提高数据操作的效率,这是一级缓存,我们可以直接进行;SessionFactory对象具有二级缓存,但是在原生框架下我们无法直接利用,需要导入其他的库,不过使用 的原理同一级缓存。