--昨夜西风凋碧树,独上高楼,望尽天涯路
Hibernate事轻量级JavaEE应用的持久层解决方案,不仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度缩短处理数据持久化的时间。Hibernate倡导低侵入的设计,完全采用普通Java对象(POJO)编程,不要求PO继承Hibernate的某个超类或者实现某个接口。
下面先介绍一下ORM,ORM的全称是Object/Relation Mapping,即对象/关系数据库映射。ORM可以理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。ORM工具的作用就是:把对持久化对象的保存、删除、修改等操作,转换成对数据库的操作。从此,程序员可以以面向对象的方式操作持久化对象,而ORM框架负责转换成对应的SQL(结构化查询语言)操作。
ORM的基本映射方式无非是数据表映射Java类(POJO),数据表的行映射对象(实例),数据列(字段)映射对象的属性。
Hibernate是当前流行得一款ORM框架,下面我们开始系统的学习它。
首先建立MAVEN工程,pom文件如下:
<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>luffy</groupId>
<artifactId>hibernate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 添加Hibernate依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.2.1.Final</version>
</dependency>
<!-- 添加Log4J依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.6.4</version>
</dependency>
<!-- 添加javassist -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.0.GA</version>
</dependency>
<!-- mysql数据库的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
</project>
由于Hibernate提供了注解和XML的方式进行映射,我们采用的是xml的方式,只要懂得其原理,二者实际上是一样的。
建立了POM文件,之后我们编写Hibernate的核心配置文件:
<?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="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 配置数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 配置数据库url -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_test</property>
<!-- 配置用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 配置密码 -->
<property name="hibernate.connection.password">luffylucy</property>
<!-- 是否输出Hibernate生成的aql语句,开启为true -->
<property name="show_sql">true</property>
<!-- ddl语句自动建表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 是否对输出SQL进行格式化 -->
<property name="format_sql">true</property>
<!-- 连接池的配置 -->
<property name="hibernate.connection.provider_class">
org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!-- C3P0随机准备好的最少的JDBC连接数量 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 连接池的最大JDBC连接数量 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 配置超时周期,在他之后,休闲连接将从连接池中移除 -->
<property name="hibernate.c3p0.timeout">300</property>
<!-- 最多高速缓存100个预编译语句,该属性是使Hibernate获得良好性能的要素 -->
<property name="hibernate.c3p0.max_statements">100</property>
<!-- 连接池被自动验证前,以秒为单位的闲置时间 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
<mapping class="com.luffy.domain.News"/>
<!-- 注册ORM实体类映射文件
<mapping resource="com/caokaiyuan/domain/User.hbm.xml"/> -->
</session-factory>
</hibernate-configuration>
在hibernate_test库种建立表:news_inf。建表语句:
CREATE TABLE news_inf (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`title` VARCHAR(20) DEFAULT NULL,
`content` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
下面我们编写POJO(这里请注意,POJO种的字段请与数据表中的对应,后面会讲解通过@Column注解来匹配):
@Entity
@Table(name="news_inf")
public class News {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String title;
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Entity注解声明该类是一个Hibernate的持久化类
@Table指定该类映射的表。此处指定该类映射到news_inf表
@Id用于指定该类的标志属性。所谓标识属性,就是可以唯一标识该对象的属性,标识属性通常映射到数据表的主键列
@GenerateValue用于指定的主键生成策略,其中strategy属性指定了主键生成策略为IDENTITY,也就是自动增长生成策略
由于Hibernate与JPA的关系非常密切,所以以上四个注解都是JPA规范种的注解,位于javax.persistence包下。
现在我们编写Hibernate代码,就可以进行操作了:
@Test
public void insertData(){
Configuration conf = new Configuration().configure();
SessionFactory sf = conf.buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
News n = new News();
n.setTitle("海贼王");
n.setContent("我是要成为海贼王的男人");
session.save(n);
tx.commit();
session.close();
sf.close();
}
执行后控制台打印信息:
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate:
insert
into
news_inf
(content, title)
values
(?, ?)
现在为止,我们已经简单的搭建好了一个Hibernate的环境,至于具体参数,API,配置的编写。