第一部分:Hibernate入门

Hibernate是什么
Hibernate是一个轻量级的ORMapping框架
ORMapping原理(Object Relational Mapping)

ORMapping基本对应规则:
1:类跟表相对应
2:类的属性跟表的字段相对应
3:类的实例与表中具体的一条记录相对应
4:一个类可以对应多个表,一个表也可以对应对个类
5:DB中的表可以没有主键,但是Object中必须设置主键字段
6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系 
7:Object中属性的个数和名称可以和表中定义的字段个数和名称不一样
ORMapping的基本实现方式:
使用JDBC,用SQL来操作数据库,只是看动态生成还是人工写代码来实现。
大家想想,我们实现过ORMapping吗?

Hibernate能干什么:
Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。
Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过 程来实现商业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应 用,Hibernate是最有用的。
Hibernate可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。
一个非常简要的Hibernate体系结构的高层概要图
Hibernate运行时体系结构
“最小”的体系结构方案,要求应用程序提供自己的 JDBC 连接并管理自己的事务。这种方案使用了Hibernate API 的最小子集.

“全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来,而让Hibernate来处理这些细节。

SessionFactory (org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成Session的工厂,本身要用到ConnectionProvider。
Session (org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了JDBC连接,也是Transaction的工厂。
Transaction (org.hibernate.Transaction)
应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。
ConnectionProvider (org.hibernate.connection.ConnectionProvider)
生成JDBC连接的工厂(有连接池的作用)。它通过抽象将应用从底层的Datasource或DriverManager隔离开。仅供开发者扩展/实现用,并不暴露给应用程序使用。
TransactionFactory (org.hibernate.TransactionFactory)
生成Transaction对象实例的工厂。仅供开发者扩展/实现用,并不暴露给应用程序使用。
HelloWorld
要研究怎么做,先得搞清楚需要做什么
根据刚才的学习,做基本的Hibernate应用程序,要完成下面的工作:Object、数据库的表、两种配置文件、客户端程序来调用Hibernate的接口进行操作。
构建环境
最简单的方法:把hibernate-release-4.0.0.Beta4.zip包里面lib/required下的jar包全部添加到工程的 library里面,另外还需添加slf4j的实现包slf4j-log4j12-1.5.8.jar和log4j的实现包log4j- 1.2.16.jar,还有别忘了把JDBC的驱动jar包也加入到library里面
Object怎么做
1:就是前面学过的vo的写法(规则同样是那四点)
2:要求必须有一个public为空参的构造方法,现在写vo一般不写构造方法,默认就有一个,但是写构造方法的时候要注意写上一个public为空参的构造方法
3:要求提供一个标识属性(identifier)
4:使用非final的类(因为要使用代理来延迟实体的装载)
5:设若构建一个对象:cn.javass.h4.hello.UserModel,有四个属性:uuid,userId,name,age

在数据库中建表
设若构建一个表为tbl_user,字段:uuid,userId,name,age
配置xxx.cfg.xml
1:缺省名称为 hibernate.cfg.xml
2:存放在当前classes的根目录下,开发的时候在src根下就可以了
3:主要有如下四部分配置 :
(1)与DB的连接
(2)可选配置
(3)资源文件注册
(4)二级缓存
4:配置的时候可以到Hibernate发行包里面找个hibernate.cfg.xml的例子,比如可以用“\project\hibernate- documentation\quickstart\tutorials\basic\src\test\resources”下面的 hibernate.cfg.xml作例子
5:示例如下:
java代码:

查看复制到剪贴板打印
  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
  8. <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
  9. <property name="connection.username">test</property>
  10. <property name="connection.password">test</property>
  11. <property name="connection.pool_size">2</property>
  12. <property name="dialect">org.hibernate.dialect.OracleDialect</property>
  13. <property name="show_sql">true</property>
  14. <mapping resource="cn/javass/h4/hello/UserModel.hbm.xml"/>
  15. </session-factory>
  16. </hibernate-configuration>

配置xxx.hbm.xml
1:与被描述的类同名 ,如:UserModel.hbm.xml
2:存放位置与所描述类存放在同一文件夹下
3:主要有如下四部分配置 :
(1)类和表的映射
(2)主键的映射
(3)类的属性和DB中字段的映射
(4)关系的映射
4:配置的时候可以到hibernate发行包里面找个例子,比如可以用“\project\hibernate-core\src\test\java \org\hibernate\test\cid”下面的Customer.hbm.xml作例子
5:示例如下:
java代码:

查看复制到剪贴板打印
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
  4. 'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
  5. <hibernate-mapping>
  6. <class name="cn.javass.h4.hello.UserModel" table="tbl_user">
  7. <id name="uuid">
  8. <generator class="assigned"/>
  9. </id>
  10. <property name=“userId”></property>
  11. <property name=“name”></property>
  12. <property name="age"></property>
  13. </class>
  14. </hibernate-mapping>

客户端文件:
java代码:

查看复制到剪贴板打印
  1. package cn.javass.h4.hello;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.Transaction;
  5. import org.hibernate.cfg.Configuration;
  6. public class Client {
  7. public static void main(String[] args) {
  8. SessionFactory sf = new Configuration().configure().buildSessionFactory();
  9. Session s = null;
  10. Transaction t = null;
  11. try{
  12. //准备数据
  13. UserModel um = new UserModel();
  14. um.setUuid("1");
  15. um.setUserId("id1");
  16. um.setName("name1");
  17. um.setAge(1);
  18. s = sf.openSession();
  19. t = s.beginTransaction();
  20. s.save(um);
  21. t.commit();
  22. }catch(Exception err){
  23. t.rollback();
  24. err.printStackTrace();
  25. }finally{
  26. s.close();
  27. }
  28. }
  29. }

测试:直接在Elipse里面运行Client文件即可,运行结束,你将会看到在 console输出:“Hibernate: insert into tbl_user (userId, name, age, uuid) values (?, ?, ?, ?)”,打开数据库的数据表,你会看到一条值已经加入了。
说明:
1:SessionFactory sf = new Configuration().configure().buildSessionFactory();这句话的意思是读取hibernate.cfg.xml,创建Session工厂,是线程安全的。
默认是”hibernate.cfg.xml”,不用写出来,如果文件名不是”hibernate.cfg.xml”,那么需要显示指定,如下:
SessionFactory sf = new Configuration(). configure( “javass.cfg.xml” ).buildSessionFactory();
2:Session是应用程序主要使用的Hibernate接口,约相当于JDBC的Connection+Statement/PreparedStatement的功能,是线程不安全的

3:在Hibernate4里面,已经不推荐使用Configuration类了,而改为使用 ServiceRegistryBuilder和MetadataSources来代替,新的写法大致如下:
ServiceRegistryBuilder builder = new ServiceRegistryBuilder().configure();
builder.applySetting("connection.driver_class", "oracle.jdbc.driver.OracleDriver");
builder.applySetting("connection.url", "jdbc:oracle:thin:@localhost:1521:orcl");
builder.applySetting("connection.username", "ztb");
builder.applySetting("connection.password", "ztb");
builder.applySetting("connection.pool_size", "2");
builder.applySetting("hibernate.dialect", "org.hibernate.dialect.OracleDialect");
builder.applySetting("show_sql", "true");
MetadataSources sources = new MetadataSources( builder.buildServiceRegistry() );
sources.addResource("cn/javass/h4/hello/UserModel.hbm.xml");
MetadataImpl metadata = (MetadataImpl) sources.buildMetadata();
SessionFactory sf = metadata.getSessionFactoryBuilder().buildSessionFactory();
这种写法,现在还没有实现完全,不太好用,所以官方给出的示例里面还是采用以前的方式,大家先了解一下。
4:这里使用的事务Transaction是Hibernate的Transaction,需要有,不能去掉。

为什么必须有这个Hibernate的事务呢?以HelloWorld为例来看看:
视频配套PPT,视频地址【 Hibernate4实战-独家视频课程】
原创内容 转自请注明【 http://***/forum/blogPost/list/2461.html】

转载于:https://www.cnblogs.com/zdh-ry/archive/2012/07/09/2583766.html

Hibernate4实战 之 第一部分 Hibernate入门相关推荐

  1. Hibernate4实战 之 第一部分:Hibernate入门

    第一部分:Hibernate入门 Hibernate是什么 Hibernate是一个轻量级的ORMapping框架 ORMapping原理(ObjectRelational Mapping) ORMa ...

  2. 杨老师课堂之JavaEE三大框架Hibernate入门第一课

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/kese7952/article/details/80998421 本篇任务 1. 使用Hiberna ...

  3. 《Redis实战》一第一部分 入门

    本节书摘来异步社区<Redis实战>一书中的第一部分,作者: [美]Josiah L. Carlson(约西亚 L.卡尔森)译者: 黄健宏 责编: 杨海玲,更多章节内容可以访问云栖社区&q ...

  4. Hibernate4实战 之 第二部分:Hibernate的基本配置

    2019独角兽企业重金招聘Python工程师标准>>> 可编程的配置方式-1 如果在配置cfg.xml的时候,不想在里面配置hbm.xml怎么办呢?可在程序里使用可编程的配置方式,也 ...

  5. 量化交易 实战第一课 策略入门

    量化交易 实战第一课 策略入门 概述 要求 指标 市净率 股票市值 代码实现 概述 不管是技术分析还是基本面分析, 我们在进行投资的时候会选择某些表现好的股票来作为一个股票池. 从中进行交易的判断 ( ...

  6. 【五天时间】Qt从入门到实战:第一天

    [五天时间]Qt从入门到实战:第一天 第一天 1.1 Qt的介绍.优点.成功案例 什么是Qt? Qt的优点 Qt的成功案例 1.2 创建第一个Qt程序 1.3 熟悉按钮控件常用API 1.4 对象树的 ...

  7. oracle hibernate 注解,Hibernate4实战之Hibernate4注解零配置

    Hibernate4实战之Hibernate4注解零配置 @Entity,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类) . @Table,注册在类头上,注解声明了该实体bea ...

  8. Hibernate4实战 之 第四部分:关系映射

    数据表之间的关系分为三类:一对一.一对多.多对多 一对一数据表(部门表  和  部门主管表) 一对多数据表(部门表  和  部门下的人员表) 多对多数据表(部门表  和  人员表) 根据相互寻找的关系 ...

  9. SSH框架第一天——hibernate框架

    什么是框架? 是软件的半成品,它已经完成了部分功能. 什么是hibernate? hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程 ...

最新文章

  1. 工业相机帧率与曝光时间的关系
  2. mysql中FIND_IN_SET的使用方法
  3. 【深度学习】利用深度可分离卷积减小计算量及提升网络性能
  4. vue(2)子组件和页面组件
  5. 【CentOS】安装部署jenkins从git获取代码[转]
  6. arm linux应用调用rtc接口,ARMLinux驱动RTC(实时时钟)驱动分析
  7. 使用SAP C4C的OData服务的deep insert操作创建Lead
  8. java断言错误_java-获取断言错误,即使期望值和实际值相同
  9. Hudson持续集成工具v3.3.3
  10. 让画面更逼真!这个强化超分辨率GAN让老游戏迎来第二春 | 代码+论文+游戏MOD...
  11. 在win7系统下使用TortoiseGit(乌龟git)简单操作Git@OSC
  12. Linux管道命令grep 和 wc
  13. vue3 +Element-puls ,table 中使用$refs修改scrollTop 到顶部
  14. 基于Visual C++2010 与office2010开发办公自动化(14)-自定义excel2010工具栏
  15. 【GeoFans】GNSS相关产品团队
  16. informatica 初级操作流程
  17. MySQL数据库cpu飙升到100%的话怎么处理?
  18. 1、JAVA微信开发-微商城_O2O微门店SAAS系统开发
  19. DAMA数据治理学习笔记-数据安全
  20. 当你的移动硬盘弄坏了你的文件该如何恢复呢

热门文章

  1. wamp无法使用php,使用wamp无法访问www中的php文件
  2. java当中各种流的应用场景_Java中有哪些流,常用流有哪些并有何特点和使用场景 NIO流,特性及使用时注意的事项 IO与NIO区别...
  3. 工业机器人九龙坡区职教中心_山西省襄汾县职教中心“智能工业机器人订单班”学生集体观看直播“2020一带一路暨金砖国家技能发展与技术创新大赛”...
  4. vue 2个方法先后执行_浅析Vue的2个版本
  5. windowopen传值到jsp_window.open()使用方法以及传参数的问题总结
  6. ediplus 复制编辑一列_EditPlus等编辑器选中列(块)的方法
  7. python怎么复制上面的语句_JAVA、python、Go的复制语句
  8. lua运行外部程序_LTUI v2.2 发布, 一个基于lua的跨平台字符终端UI界面库
  9. python三维数据转换成二维_5大Python可视化库到底选哪个好?一篇文章搞定从选库到教学...
  10. c语言中error c2109 是什么错,求c语言改错 error C2109: 下标要求数组或指针类型?...