5 -- Hibernate的基本用法 --2 2 Hibernate的数据库操作
在所有的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的数据库操作的更多相关文章
- 5 -- Hibernate的基本用法 --4 2 hibernate.properties文件与hibernate.cfg.xml文件
hibernate.properties : project\etc\hibernate.properties hibernate.cfg.xml : project\etc\hibernate.cf ...
- 5 -- Hibernate的基本用法 --6 深入Hibernate映射
Hibernate提供三种方式将POJO变成PO类: 1. 使用持久化注解(以JPA标准注解为主,如果有一些特殊要求,则依然需要使用Hibernate本身提供的注解). 2. 使用JPA2 提供的XM ...
- 5 -- Hibernate的基本用法 --4 6 Hibernate事务属性
事务也是Hibernate持久层访问的重要方面,Hibernate不仅提供了局部事务支持,也允许使用容器管理的全局事务. Hibernate关于事务管理的属性: ⊙ hibernate.transac ...
- 5 -- Hibernate的基本用法 --4 深入Hibernate配置文件
Hibernate的持久化操作离不开SessionFactory对象,这个对象是整个数据库映射关系经过编译后的内存镜像,该对象的openSession()方法可打开Session对象.该对象通常由Co ...
- 5 -- Hibernate的基本用法 --2 1 Hibernate 下载和安装
1. 下载Hibernate压缩包 2. 解压:文件结构 ⊙ documentation : 该路径下存放了Hibernate的相关文档,包括Hibernate的参考文档和API文档等. ⊙ lib ...
- 5 -- Hibernate的基本用法 --1 4 Hibernate概述
Hibernate 不仅仅管理Java类到数据库的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间.
- 5 -- Hibernate的基本用法 --4 4 数据库方言
Hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以在语法细节上存在一些差异.因此,Hibernate需 ...
- 5 -- Hibernate的基本用法 -- 要点
Hibernate的基本用法 ⊙ ORM的基本知识 ⊙ ORM和Hibernate的关系 ⊙ Hibernate的基本映射思想 ⊙ Hibernate入门知识 ⊙ 使用Eclipse开发Hiberna ...
- 轻量级Java_EE企业应用实战-第5章Hibernate的基本用法-001
1. package org.crazyit.app.domain; import javax.persistence.*; /** * Description: <br/> * ��վ: ...
随机推荐
- eclipse配置google代码风格
1.下载google code style的xml文件 地址:https://github.com/google/styleguide 导入xml文件 可能会遇到警告: 版本的问题,忽略即可. < ...
- XmlnsDefinition for a Cool Namespace Mapping
In XAML, when you want to reference a CLR type, you have to add a namespace mapping that maps the XM ...
- SSh on Ubuntu
ssh程序分为有客户端程序openssh-client和服务端程序openssh-server.如果需要ssh登陆到别的电脑,需要安装openssh-client,该程序Ubuntu是默认安装的.而如 ...
- 谈谈mongodb,mysql的区别和具体应用场景
最近对数据库比较感兴趣,于是就去研究了下部分相关热门的数据库. MySQL 关系型数据库. 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数 ...
- 关于Python的装饰器 decorator
装饰器的原理:其实就是高阶函数,接收原函数以在之前之后进行操作. 语法格式是固定的:先定义一个函数,再使用@语法调用该函数. 例子一: import functools # 定义装饰器,固定格式 de ...
- Unity入门教程(上)
一.介绍 目的:通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏,熟悉使用Unity进行游戏开发的基本流程. 软件环境:Unity 2017.3.0f3,Visual Studio 2013 二.创 ...
- 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...
- unity提高----------射线使用【unity3d 怎样获得当前鼠标点击的对象】
unity3d 怎样获得当前鼠标点击的对象 最佳答案 var ray = Camera.main.ScreenPointToRay (Input.mousePosition);var hit : ...
- 命令查询职责分离模式(Command Query Responsibility Segregation,CQRS)
浅谈命令查询职责分离(CQRS)模式 CQRS架构简介 对CQRS的一次批判性思考
- Python——eventlet
eventlet语境下的“绿色线程”普通线程之间的区别: 1. 绿色线程几乎没有开销,不用像保留普通线程一样保留“绿色线程”,每一个网络连接对应至少一个“绿色线程”: 2. 绿色线程需要人为的设置使其 ...