Hibernate是对JDBC的进一步封装。它的一个主要出发点就是希望简化Java对象持久化的编程。因为直接使用JDBC时需要程序员编写大量繁杂的代码。
Hibernate是一个开源的ORM(对象-关系映射)框架,它的作用就是在POJO(普通JAVA对象)和关系型数据库之间做一个映射,把关系型数据库的字段与内存中java对象的属性做映射。这样,程序员在操作数据库的时候,就不用再写复杂的sql语句,就可以完成操作数据库的工作。
Hibernate框架是持久层框架,作用是将JAVA对象持久化到数据库中。 Hibernate不要求程序员将POJO一一映射到数据库表,可以多个表对应一个POJO,也可以将多个POJO持久化到一个表中。
其实刚开始对于Hibernate的这些核心组件混个脸熟就行,因为既然是核心组件,以后肯定经常用到。
上图是Hibernate的运行过程。大致过程是:
由Configuration类读取配置文件,包括数据库用户名、密码等;SessionFactory生成Session对象,可以用Session对象生成Transaction对象进行事务操作,也可以用Session对象生成Query对象,执行查询操作,其实还有Criteria可以执行查询操作。
文字性的东西说的再多也是效果有限,反正至少对Hibernate有个大概认识吧,接下来详细介绍一下代码。
1、编写需要持久化的POJO(Message.java)
package com.zcx.entity; import java.util.Date; public class Message { private String id; private String msg; private Date createTime; private Date expireTime; public Message() { super(); } public Message(String id, String msg, Date createTime, Date expireTime) { super(); this.id = id; this.msg = msg; this.createTime = createTime; this.expireTime = expireTime; } //省略了get方法和set方法 }2、为Message类编写映射文件(Message.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> <class name="com.zcx.entity.Message"> <id name="id"> <generator class="uuid"></generator> </id> <property name="msg"></property> <property name="createTime" type="date"></property> <property name="expireTime" type="date"></property> </class> </hibernate-mapping>generator class = “uuid”表示使用网卡信息自动生成唯一的id,每次不一样。这是通过设置generator属性为uuid,让Hibernate自动生成的.另外还有7种class:identity(用于MySQL数据库,递增)、sequence(用于Oracle数据库)、native(跨数据库时使用,由底层方言产生)、hilo(通过高地位合成id)、sequencehilo、assigned(用户自定义id)、foreign(外部引用).
3、本次使用maven管理依赖,pom.xml如下
<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.zcx.tools</groupId> <artifactId>txt2xls</artifactId> <version>0.0.1-SNAPSHOT</version> <build/> <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> <type>pom</type> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version> </dependency> <!-- Hibernate 配置 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.5.Final</version> </dependency> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.12.0.GA</version> </dependency> <dependency> <groupId>antlr</groupId> <artifactId>antlr</artifactId> <version>2.7.6</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.0.Final</version> </dependency> </dependencies> </project>4、编写Hibernate配置文件,Hibernate.cfg.xml
<?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 name=""> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">mypass</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <mapping resource="com/zcx/entity/Message.hbm.xml" /> </session-factory> </hibernate-configuration>hibernate.dialect翻译一下就是方言,必须选择一种方言,因为虽然大多数数据库平台都接受一个通用的sql子集,但是各种数据库之间有不一致的地方和特殊的扩展,所以在创建和查询数据库时,Hibernate要使用你指定的dialect类去操作数据库。如果要使用GenericDialect(通用方言类),那么Hibernate就只能使用通用的SQL子集去操作数据库,就无法利用数据库特有的操作。
Hibernate会在类路径中寻找配置文件,如果把此配置文件放在其他地方,Hibernate就会找不到,可以在Configuration的构造函数中指定此配置文件的路径。
5、导出DDL,用于创建数据库表
package com.zcx.entity; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ExportDDL { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Configuration cfg = new Configuration().configure(); SchemaExport export = new SchemaExport(cfg); export.create(true, true); } }运行后会在控制台生成DDL如下:
drop table if exists Message create table Message (id varchar(255) not null, msg varchar(255), createTime date, expireTime date, primary key (id))可以把这段创建Message表的代码放到数据库里执行,创建Message表。 7、编写应用代码
package com.zcx.entity; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SessionFactory factory = new Configuration().configure().buildSessionFactory(); Session session = factory.openSession(); session.beginTransaction(); Message msg = new Message(); msg.setMsg("Hello Hibernate"); session.save(msg); session.getTransaction().commit(); session.close(); } }运行后将对象msg持久化到数据库中,这里只给对象设置了msg属性,id属性会根据uuid算法自动生成,另外两个属性为空。