在所有的ORM框架中有一个非常重要的媒介 : PO(持久化对象:Persistent Object)。持久化对象的作用是完成持久化操作,简单地说,通过该对象可对数据执行增、删、改的操作 ------ 以面向对象的方式操作数据库。

  Hibernate直接采用POJO作为持久化类。为了使POJO具备持久化操作的能力,需要添加注解:@Entity、@Table、@Id、@GeneratedValue等。

  POJO : News

package hibernate5chapter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table; @Entity
@Table(name="news_inf")
public class News { // 消息类的标识属性
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
//消息标题
private String title;
//消息内容
private String content; /**
* getter / setter
*/
}

    ⊙ @Entity注解声明该类是一个Hibernate的持久化类

    ⊙ @Table 指定该类映射的表。此处指定该类映射到news_inf表。

    ⊙ @Id 用于指定该类的标识属性。所谓标识属性,就是可以唯一标识对象的属性,标识属性通常映射到数据表的主键列。

    ⊙ @GeneratedValue 用于指定主键生成策略,其中stategy属性指定了主键生成策略为IDENTITY策略,也就是采用自动增长的主键生成策略。

  PO = POJO + 持久化注解

  注意:

    Hibernate基本上直接使用了JPA 2.1 的标准注解。@Entity、@Table、@Id、@GeneratedValue都是JPA的标准注解,位于javax.persistence包下。在Hibernate解压逻辑的lib\required目录中包含一个hibernate-jpa-x.x-api-x.x.x.Final.jar文件,该文件其实就是JPA规范的JAE包。

    通过映射注解,Hibernate可以理解持久化类和数据表之间的对应关系,也可以理解持久化类的属性与数据表的各列之间的对应关系。但无法知道连接哪个数据库,以及连接数据库时所用的连接池、用户名和密码等详细信息。这些信息对于所有的持久化类都是通用的,Hibernate把这些通用信息称为配置信息,配置信息使用配置文件指定。

    Hibernate配置文件既可以使用*.properties属性文件,也可以使用XML文件配置。

    XML : hibernate.cfg.xml<?xml version="1.0" encoding="UTF-8"?><!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='UTF-8'表明XML文件的编码方式 --><!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件 -->

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!--声明Hibernate配置文件的开始 -->
<hibernate-configuration>
<!--表明以下的配置是针对session-factory配置的,SessionFactory是Hibernate中的一个类,这个类主要负责保存HIbernate的配置信息,以及对Session的操作 -->
<session-factory> <!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property> <!--设置数据库的连接url:jdbc:mysql://localhost/hibernate,其中localhost表示mysql服务器名称,此处为本机, hibernate是数据库名 -->
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property> <!--连接数据库的用户名 -->
<property name="hibernate.connection.username">root </property> <!--连接数据库的密码 -->
<property name="hibernate.connection.password">System</property> <!-- 指定连接池里最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property> <!-- 指定连接池里最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property> <!-- 指定连接池里连接的超时时长 -->
<property name="hibernate.c3p0.timeout">5000</property> <!-- 指定连接池里最大缓存多少个Statement对象 -->
<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> <!--dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 根据需要自动创建数据表 -->
    <!--
update,标识Hibernate会根据持久化类的映射关系来创建数据表 -->
<property name="hbm2ddl.auto">update</property> <!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于查错,程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率 -->
<property name="hibernate.show_sql">true </property> <!-- 将SQL脚本进行格式化后在输出 -->
<property name="hibernate.format_sql">true</property> <!-- 罗列所有持久化类的类名 -->
<mapping class="hibernate5chapter.News"></mapping>
</session-factory>
</hibernate-configuration>

  Hibernate 配置文件的默认文件名为hibernate.cfg.xml,当程序调用Configuration对象的configure()方法时,Hibernate将自动加载该文件。

  提示:

    数据源是一种提高数据库连接性的常规手段,数据源会负责维持一个数据连接池,当程序创建数据源实例时,系统会一次性地创建多个数据库连接,并把这些数据库连接保存在连接池中。当程序需要进行数据库访问时,无须重新获取数据库连接,而是从连接池中取出一个空闲的数据库连接。当程序使用数据库连接访问数据库结束后,无须关闭数据库连接,而是将数据库连接归还给连接池即可。通过这种方式,就可避免频繁地获取数据库连接、关闭数据库连接所导致的性能下降。

  需要使用C3P0连接池的话,将optional子目录下的c3p0整个目录下的所有JAR包也添加到系统的类加载路径下。

  <session-factory.../>元素还可接受多个<mapping.../>元素,每个<mapping.../>元素指定一个持久化类,<mapping.../>元素的class属性指定Hibernate持久化类的类名。如果有多个持久化类,在此处罗列多个<mapping.../>元素即可。

  Class : NewsManager

package hibernate5chapter;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration; public class NewsManager { public static void main(String[] args) {
// 实例化Configuration
// 不带参数的configure()方法默认加载hibernate.cfg.xml文件
// 如果传入abc.xml作为参数,则不在加载hibernate.cfg.xml,改为加载abc.xml
Configuration conf = new Configuration().configure();// 以Configuration实例创建SessionFactory实例
SessionFactory sessionFactory = conf.buildSessionFactory();
// 创建Session
Session session = sessionFactory.openSession();
// 开始事务
Transaction transaction = session.beginTransaction();
// 创建消息对象
News news = new News();
// 设置消息标题和消息内容
news.setTitle("Angel");
news.setContent("Spend all your time waiting for that second chance");
// 保存消息
session.save(news);
// 提交事务
transaction.commit();
// 关闭Session
session.close();
sessionFactory.close(); /**
* 程序先创建一个News对象,再使用Session的save()方法来保存News对象即可。
* 当Java程序以面向对象的方式来操作持久化对象时,Hibernate负责将这种操作转换为底层SQL操作。
*/
}
}

  使用Hibernate进行持久化操作步骤:

    ① 开发持久化类,有POJO + 持久化注解组成

    ② 获取Configuration

    ③ 获取SessionFactory

    ④ 获取Session,打开事务

    ⑤ 用面向对象的方式操作数据库

    ⑥ 关闭事务,关闭Session

  随PO与Session的关联关系,PO可有如下三种状态:

    ⊙ 瞬态 : 如果PO实例从未与Session关联过,该PO实例处于瞬态状态。

    ⊙ 持久化 : 如果PO实例与Session关联起来,且该实例对应到数据库记录,则该实例处于持久化状态。

    ⊙ 脱管 : 如果PO实例曾经与Session关联过,但因为Session的关闭等原因,PO实例脱离了Session的管理,这种状态被称为脱管状态。

  对PO的操作必须在Session管理下才能同步到数据库。Session由SessionFactory工厂产生,SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象。SessionFactory对象有Configuration对象生成,Configuration对象负责加载Hibernate配置文件。

啦啦啦

啦啦啦

啦啦啦

5 -- Hibernate的基本用法 --2 2 Hibernate的数据库操作的更多相关文章

  1. 5 -- Hibernate的基本用法 --4 2 hibernate.properties文件与hibernate.cfg.xml文件

    hibernate.properties : project\etc\hibernate.properties hibernate.cfg.xml : project\etc\hibernate.cf ...

  2. 5 -- Hibernate的基本用法 --6 深入Hibernate映射

    Hibernate提供三种方式将POJO变成PO类: 1. 使用持久化注解(以JPA标准注解为主,如果有一些特殊要求,则依然需要使用Hibernate本身提供的注解). 2. 使用JPA2 提供的XM ...

  3. 5 -- Hibernate的基本用法 --4 6 Hibernate事务属性

    事务也是Hibernate持久层访问的重要方面,Hibernate不仅提供了局部事务支持,也允许使用容器管理的全局事务. Hibernate关于事务管理的属性: ⊙ hibernate.transac ...

  4. 5 -- Hibernate的基本用法 --4 深入Hibernate配置文件

    Hibernate的持久化操作离不开SessionFactory对象,这个对象是整个数据库映射关系经过编译后的内存镜像,该对象的openSession()方法可打开Session对象.该对象通常由Co ...

  5. 5 -- Hibernate的基本用法 --2 1 Hibernate 下载和安装

    1. 下载Hibernate压缩包 2. 解压:文件结构 ⊙ documentation : 该路径下存放了Hibernate的相关文档,包括Hibernate的参考文档和API文档等. ⊙ lib ...

  6. 5 -- Hibernate的基本用法 --1 4 Hibernate概述

    Hibernate 不仅仅管理Java类到数据库的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间.

  7. 5 -- Hibernate的基本用法 --4 4 数据库方言

    Hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以在语法细节上存在一些差异.因此,Hibernate需 ...

  8. 5 -- Hibernate的基本用法 -- 要点

    Hibernate的基本用法 ⊙ ORM的基本知识 ⊙ ORM和Hibernate的关系 ⊙ Hibernate的基本映射思想 ⊙ Hibernate入门知识 ⊙ 使用Eclipse开发Hiberna ...

  9. 轻量级Java_EE企业应用实战-第5章Hibernate的基本用法-001

    1. package org.crazyit.app.domain; import javax.persistence.*; /** * Description: <br/> * ��վ: ...

随机推荐

  1. jQuery(五):文本操作

    text()可以获取或设置元素的文本内容.例如: 示例: <!DOCTYPE html> <html lang="en"> <head> < ...

  2. Spring Cloud Config 自动刷新所有节点 架构改造

    详细参考:<Sprin Cloud 与 Docker 微服务架构实战>p162-9.9.4节 要做的改动是: 1.在spring cloud config server 服务端加入 spr ...

  3. PHP开发工程师-技能树

    参考进阶-PHP程序员的技术成长规划-http://blog.csdn.net/heiyeshuwu/article/details/40098043 LNMP / LAMP 环境搭建(单组件安装,非 ...

  4. Claims-Based Authentication and Authorization

    Introduction You can download the Visual Studio solutions for this article at this location. With al ...

  5. Python之从numpy.array保存图片

    1.用scipy import scipy scipy.misc.imsave('test.jpg', img) 2.用PIL from PIL import Image im = Image.fro ...

  6. js dom添加回车事件

    <!DOCTYPE html> <html lang="en" class="no-js"> <head> <meta ...

  7. (原创)Linux下一定要4字节地址对齐操作

    Linux下一定要4字节地址对齐操作:“血”的教训,一定不要忘记!!! 当然不仅仅是Linux下,所有的32位机都应该如此!!!

  8. Lucene系列二:Lucene(Lucene介绍、Lucene架构、Lucene集成)

    一.Lucene介绍 1. Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包.提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言).Lucene的目的是为软件开发人 ...

  9. C#-----------------------------回收机制中Destroy与null的作用

    关于Object被Destroy之后,该Object的原引用==null的问题 标签: unityc#继承对象 2017-01-23 23:32 506人阅读 评论(0) 收藏 举报  分类: Uni ...

  10. Linux 定时任务crontab_014

    1.  crontab命令概念 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使 ...