【Hibernate】一、Hibernate框架介绍及入门程序示例

一、Hibernate框架简介

Hibernate是对JDBC的进一步封装。它的一个主要出发点就是希望简化Java对象持久化的编程。因为直接使用JDBC时需要程序员编写大量繁杂的代码。

Hibernate是一个开源的ORM(对象-关系映射)框架,它的作用就是在POJO(普通JAVA对象)和关系型数据库之间做一个映射,把关系型数据库的字段与内存中java对象的属性做映射。这样,程序员在操作数据库的时候,就不用再写复杂的sql语句,就可以完成操作数据库的工作。

Hibernate框架是持久层框架,作用是将JAVA对象持久化到数据库中。
Hibernate不要求程序员将POJO一一映射到数据库表,可以多个表对应一个POJO,也可以将多个POJO持久化到一个表中。

二、Hibernate框架的核心组件

  1. Configuration类:它用来读取Hibernate的配置文件,并生成SessionFactory对象。Hibernate的配置文件有全局配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(*.hbm.xml)。
  2. SessionFactory接口:用来产生Session对象。
  3. Session接口:用来操作POJO。
  4. Query接口:用来对POJO进行查询操作。
  5. Transaction接口:用来管理Hibernate事务。

其实刚开始对于Hibernate的这些核心组件混个脸熟就行,因为既然是核心组件,以后肯定经常用到。

三、Hibernate的运行过程

Hibernate的运行过程

上图是Hibernate的运行过程。大致过程是:

  1. 由Configuration类读取配置文件,包括数据库用户名、密码等;
  2. SessionFactory生成Session对象,可以用Session对象生成Transaction对象进行事务操作,也可以用Session对象生成Query对象,执行查询操作,其实还有Criteria可以执行查询操作。

    文字性的东西说的再多也是效果有限,反正至少对Hibernate有个大概认识吧,接下来详细介绍一下代码。

四、HelloWorld入门程序示例

4.1 步骤:

  1. 决定你有哪些POJO需要持久化;
  2. 为每个需要持久化的POJO编写Hibernate XML映射文件(或者使用注解的方式,本次使用XML映射文件);
  3. 在pom.xml中引入Hibernate依赖;
  4. 编写Hibernate XML配置文件,配置数据库用户名、密码和第2步编写的映射文件;
  5. 使用模式导出工具导出DDL(创建数据库的语句)用于创建数据库;
  6. 在Java应用程序中创建Hibernate Configuration对象,这个对象会加载XML配置文件;
  7. 在Java应用程序中从Configuration对象创建一个SessionFactory对象;
  8. 从SessionFactory获取Session对象,用于为应用程序编写数据库访问逻辑(增删改查)。

4.2 跟着上面的步骤,编写代码:

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算法自动生成,另外两个属性为空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值