Hibernate程序的开发流程
数据库中创建表
定义持久化类/实体类(POJO)
实际上也是JSP中的JavaBean
创建hibernate.cfg.xml或hibernate.properties
核心的Hibernate配置文件,主要用来配置任意关系型数据库进行连接用到的参数(Driver、URL、User和Password)以及其他杂项的配置。hibernate.cfg.xml是Hibernate默认的配置文件名,如果不使用该名称,则需另指定其路径。我们将hibernate.cfg.xml文件放在src的直接目录下。
<?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>
<!-- Database connection settings -->
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration>
前四项配置数据库连接的基本信息
connection.pool_size:配置连接池最大的连接数量。Hibernate内置了连接池,我们可以配置连接池的相关参数,或可以使用第三方的数据库连接处(如:C3P0),也可以配置使用Tomcat的数据源。
dialect:我们称之为方言类,帮助将Hibernate数据类型和特定的数据库数据类型进行转换,因为不同的数据库的数据类型有可能会不一样。
current_session_context_class:设置session对象和当前线程的绑定
cache.provider_class:开放二级缓存
show_sql:是否在控制台显示SQL语句,调试阶段最好开启,容易找出bug
hbm2ddl.auto:通过映射文件创建表
mapping:配置后面的映射文件,标示出其路径
创建POJO对应的映射文件*.hbm.xml
映射文件,主要用来配置持久化类(POJO)和表、字段(列)、关联关系等之间的映射关系。
Hibernate程序可以根据此文件和数据库进行CRUD的操作
一个POJO对应一个文件
映射文件我们通常创建在和POJO同一个包下,并和POJO类同名(大小写一致),当然这也不是必须的要求。文件的格式我们可以参考Hibernate官网的Documentation中的The Mapping File。
<hibernate-mapping package="com.li.pojo">
<class name="Student" table="STU_INFO">
<id name="id" type="string" column="STU_NO">
<generator class="assigned"></generator>
</id>
<property name="name" type="string" column="STU_NAME"></property>
<property name="gender" type="string" column="STU_GENDER"></property>
<property name="age" type="int" column="STU_AGE"></property>
</class>
</hibernate-mapping>
The class mapping element:class标签配置类,name表示POJO类,table表示对应表(大小写没关系,我们建议大写,因为到数据库层都得转大写)。如果前面没有设置package属性,则此处的name需使用全类名。
The id mapping element:id标签配置UID(主键),name对应POJO类里面的属性,column对应数据表里面的列(这里是主键),type是name的数据类型,可以是Hibernate内置的数据类型(注意string要小写),也可以是Java数据类型,如果使用Java数据类型需以全称,如:java.lang.String。
其中generator配置主键生成策略。如果我们自己插入主键,则可以不配置。我们还可以使用sequence为表生成主键(Oracle数据库),配置如下:
<generator class="sequence"> <param name="sequence">student_sequence</param> </generator>
param标签内部指定sequence序列的名称
The property mapping element:property标签配置非UID属性,还有数据类型和表中的列
创建Configuration对象并读取hibernate.cfg.xml
org.hibernate.cfg.Configuration
Configuration config = new Configuration()
config.configure("hibernate.cfg.xml")
hibernate.cfg.xml默认的路径是src目录下,如果不在该目录下,则指定其路径。
通过Configuration创建SessionFactory对象
org.hibernate.SessionFactory
SessionFactory factory=config.buildSessionFactory();
buildSessionFactory()该方法在4.x版本中已经不推荐使用,有其他的方法,但是还是可以使用
通过SessionFactory创建Session对象
org.hibernate.Session
Session session=factory.openSession();
此处自动根据配置文件获取数据库的连接,如果我们需要使用自己获取到的数据库连接,则可以使用如下方法:
Session session=factory.openStateless();
开启一个无状态的会话,方法里可以选择传入一个Connection形参。
通过Session对象和数据库进行CRUD操作
session.save(…)、delete(…)、update(…)等。
load(…)、get(…)等
Example
核心配置文件
<?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>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/learning?useSSL=true</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- SQL dialect:方言类,将操作转为对应的SQL语句 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 输出操作的SQL语句 -->
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- 配置映射文件 -->
<mapping resource="com/li/pojo/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!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.li.pojo">
<class name="Student" table="STU_INFO">
<id name="id" type="string" column="STU_NO"></id>
<property name="name" type="string" column="STU_NAME"></property>
<property name="gender" type="string" column="STU_GENDER"></property>
<property name="age" type="int" column="STU_AGE"></property>
</class>
</hibernate-mapping>
测试
package com.li.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.li.pojo.Student;
public class StudentTest {
public static void main(String[] args) {
Student stud=new Student();
stud.setId("4561654");
stud.setName("wwww");
stud.setAge(20);
stud.setGender("male");
/*创建Configuration对象,并读取指定的Hibernate核心配置文件*/
Configuration config=new Configuration();
config.configure("hibernate.cfg.xml");
/*创建SessionFactory对象*/
SessionFactory factory=config.buildSessionFactory();
/*创建Session对象,也是在此处获得数据库的连接*/
Session session=factory.openSession();
/*通过session完成和数据库的CRUD操作*/
Transaction trans=null;
try {
/*启动事务*/
trans=session.beginTransaction();
/*保存,面向对象型,底层的方言类做SQL语句的翻译工作*/
session.save(stud);
/*提交事务*/
trans.commit();
} catch (Exception e) {
e.printStackTrace();
/*回滚事务*/
trans.rollback();
}finally {
/*关闭session(关闭一个Connection)*/
session.close();
}
}
}