Hibernate环境搭建
1. 导入hibernate-release-5.1.0.Final\lib\required路劲下所有的jar包:
2. 导入数据库驱动的jar包:
Hibernate开发步骤
1. Hibernate配置文件
Hibernate配置文件的默认文件名为hibernate.cfg.xml,当程序调用Configuration对象的configure()方法时,Hibernate将自动加载该文件。
Hibernate配置文件时个XML文件,第一行是XML文件声明,指定该XML文件的版本和存储该文件所用的字符集。
Hibernate配置文件的根元素是< hibernate-configuration…/>,根元素下有< session-factory…/>子元素,该元素下有很多< property…/>子元素,是配置Hibernate连接数据的必要信息,如连接数据库的驱动、URL、用户名、密码等。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置连接数据库的基本信息 -->
<property name="connection.username">root</property>
<property name="connection.password">mysqladmin</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/jkxyshsflower</property>
<!-- 使用数据源管理数据库连接 -->
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- 配置 hibernate 的基本信息 -->
<!-- hibernate 所使用的数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!-- 执行操作时是否在控制台打印 SQL -->
<property name="show_sql">true</property>
<!-- 是否对 SQL 进行格式化 -->
<property name="format_sql">true</property>
<!-- 指定自动生成数据表的策略 -->
<property name="hbm2ddl.auto">update</property>
<!-- 指定关联的 .hbm.xml 文件 -->
<mapping resource="com/afy/hibernate/helloworld/News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
此外,Hibernate推荐使用数据源管理数据库连接,这样能提高数据库连接性能,数据源负责维持一个数据连接池,当程序创建数据源是,系统会一次性创建多个数据库连接,并把这些数据库连接保存在连接池中。当程序需要进行数据库访问时,无需重新获得数据库连接,而是从连接池中取出一个空闲的数据库连接。当程序使用数据库访问数据库结束后,无需 关闭数据库连接,而是将数据库连接归还给连接池即可。通过这种方式,可以避免频繁地获取数据库连接、关闭数据库连接所导致的性能下降。Hibernate推荐使用C3P0数据源,以上配置文件指定C3P0数据源配置信息,包括最多连接数、最小连接数等。
使用C3P0连接池需要将ibernate-release-5.1.0.Final\lib\optional\c3p0整个目录下所有jar包添加到系统的类加载路径:
配置文件有代码指定hbm2ddl.auto属性,该属性指定是否需要Hibernate根据持久化类自动创建数据表,这里指定update,表示Hibernate会根据持久化类的映射关系类创建数据表。
< session-factory…/>元素还可接受多个< mapping…/>元素,每个< mappinng…/>元素指定一个持久化类,< mappinng…/>元素的class属性指定Hibernate持久化类的类名,还有resource属性,用于将.hbm.xml配置文件包含进来,注意这里包含进来的是目录格式的路径。
2. 持久化类
ORM框架中都要有PO(持久化对象),来完成持久化操作,通过该对象可对数据执行增、删、改的操作,以面向对象的方式操作数据库。
应用程序不用直接访问数据库,不用关心底层采用数据库(这点也可以看作是多态的体现)。应用程序只需要创建、修改、删除持久化对象,Hibernate会把这种操作转换为对指定数据表的操作。
Hibernate的PO是普通的Java对象,低侵入式设计,不要求 继承任何父类,或者实现任何接口。以下代码是个POJO(普通的、传统的Java对象)类。
public class News {
private Integer id;
private String title;
private String author;
private String desc;
private String content;
private Blob picture;
private Date date;
//以下省略相关的setter和getter方法
......
public News(String title, String author, Date date) {
super();
this.title = title;
this.author = author;
this.date = date;
}
public News() {
}
@Override
public String toString() {
return "News [id=" + id + ", title=" + title + ", author=" + author
+ ", date=" + date + "]";
}
}
3. 对象-关系映射关系
上面写的普通JavaBean目前还不具备持久化操作的能力,为了使其具备持久化操作的能力,还需要为这个POJO进行对象-关系映射配置,有两种方式可以完成对象-关系映射配置,一种是注解,另一种是通过*.hbm.xml文件配置。
注解方式如下:
@Entity注解声明该类是一个Hibernate的持久化类。
@Table指定该类映射的表。此处指定该类映射到new_info表。
@Id用于指定该类的标识属性。所谓标识属性,就是可以唯一标识该对象的属性,标识属性通常映射到数据表的主键列。
@GeneratedValue用于指定主键生成侧路,其中strategy属性指定了主键生成策略为IDENTITY策略,就是采用自动增长的主键生成策略。
Hibernate与JPA关系密切,Hibernate4.3遵守最新的JPA2.1规范,Hibernate基本上直接使用了JPA2.1的标准注解。以上4个主键都是JPA的标准注解,位于java.persistence包下。在Hibernate解压路径的lib\required目录包含一个hibernate-jpa-2.1-api-1.0.0.Final文件,该文件是JPA规范的jar包。PA注解的API文档,包含在JavaEE7的API文档里。
*.hbm.xml文件配置方式:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.afy.hibernate.helloworld">
<class name="news_info" table="NEWS" dynamic-insert="true">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<!-- 指定主键的生成方式, native: 使用数据库本地方式 -->
<generator class="native" />
</id>
<property name="title" not-null="true" unique="true" index="news_index" length="50" type="java.lang.String" column="TITLE" >
</property>
<property name="author" type="java.lang.String" index="news_index">
<column name="AUTHOR" />
</property>
<property name="date" type="date">
<column name="DATE" />
</property>
<property name="desc" formula="(SELECT concat(title, ',', author) FROM NEWS n WHERE n.id = id)"></property>
<property name="content">
<column name="CONTENT" sql-type="text"></column>
</property>
<property name="picture" column="PICTURE" type="blob"></property>
</class>
</hibernate-mapping>
class对应类,使用反射方式,对应table生成表NEWS,往下依次指定映射列等,运行时Hibernate还根据该映射文件生成各种SQL语句。
完成对象映射关系,Hibernate可以理解持久化类和数据表之间的对应关系,持久化类的属性与表的各列之间的对应关系。
4. 通过Hibernate API访问数据库
接下来要创建一个对象,通过Hibernate API访问数据库:
public class HibernateTest {
@Test
public void test() {
System.out.println("test...");
//1. 创建一个 SessionFactory 对象
SessionFactory sessionFactory = null;
//1). 创建 Configuration 对象: 对应 hibernate 的基本配置信息和 对象关系映射信息
Configuration configuration = new Configuration().configure();
//2). 创建一个 ServiceRegistry 对象: hibernate 4.x 新添加的对象
//hibernate 的任何配置和服务都需要在该对象中注册后才能有效.
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
//3).
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//2. 创建一个 Session 对象
Session session = sessionFactory.openSession();
//3. 开启事务
Transaction transaction = session.beginTransaction();
//4. 执行保存操作
News news = new News("Java12345", "ATGUIGU", new Date(new java.util.Date().getTime()));
session.save(news);
//5. 提交事务
transaction.commit();
//6. 关闭 Session
session.close();
//7. 关闭 SessionFactory 对象
sessionFactory.close();
}
}
程序运行结束后,数据库中会多出一个数据表news_info,该表中包含News实例对应的记录。
基本流程如上面代码所示,
1. 首先要获取Configuration;
2. 再获取SessionFactory;
3. 获取Session,打开事物;
4. 用面向对象的方式打开数据库;
5. 关闭事物、关闭Session。
在执行session.save(News)之前,现有获取Session对象,PO只有在Session的管理下才可完成数据库访问。
小结
为使用Hibernate进行持久化操作,通常需要如下几个步骤:
1. 创建Hibernate配置文件*.cfg.xml指定连接数据库基本信息等;
2. 开发持久化类POJO;
3. 注解/*.hbm.xml文件配置对象关系-对象映射关系;
4. 创建实例对象,通过Hibernate API访问数据库。
根据PO与Session的关联关系,PO有如下三种状态:
瞬态:如果PO实例从未与Session关联过,该PO实例处于瞬态。
持久化:如果PO实例与Session关联,且该实例对应到数据库记录,则该实例处于持久化状态。
脱管:如果PO实例曾经与Session关联过,因为Session的关闭等原因,PO实例脱离了Session的管理,这种状态称为脱管状态。
对PO的操作必须在Session管理下才能同步到数据库。Session由SessionFactory工厂产生,SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象,SessionFactory对象由Configuration对象生成,Configuration对象负责加载Hibernate配置文件夹。
1. 使用Hibernate添加记录,对比与JDBC操作数据库,Hibernate体现出显著的优势:
2. 不用编写SQL语句,而是采用OO方式访问数据库;
在JDBC访问过程中大量的check异常被包装成Hibernate的Runtime异常,从而不再要求程序必须处理异常。