Hibernate4教程一:入门介绍

Stella981
• 阅读 768

第一部分:Hibernate入门

Hibernate是什么

    Hibernate是一个轻量级的ORM框架

    ORM原理(Object Relational Mapping)

  Hibernate4教程一:入门介绍

ORM基本对应规则:

1:类跟表相对应

2:类的属性跟表的字段相对应

3:类的实例与表中具体的一条记录相对应

4:一个类可以对应多个表,一个表也可以对应对个类

5:DB中的表可以没有主键,但是Object中必须设置主键字段

6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系 

7:Object中属性的个数和名称可以和表中定义的字段个数和名称不一样

ORM的基本实现方式:

使用JDBC,用SQL来操作数据库,只是看动态生成还是人工写代码来实现。

  Hibernate4教程一:入门介绍

Hibernate4教程一:入门介绍

Hibernate能干什么:

    Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。

Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最有用的。

    Hibernate可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。

Hibernate4教程一:入门介绍

一个非常简要的Hibernate体系结构的高层概要图

Hibernate4教程一:入门介绍

Hibernate运行时体系结构

“最小”的体系结构方案,要求应用程序提供自己的JDBC 连接并管理自己的事务。这种方案使用了Hibernate API 的最小子集.

  Hibernate4教程一:入门介绍

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

Hibernate4教程一:入门介绍

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. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

  2. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"\>

  3. <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver

  4. <property name="connection.url">jdbc:oracle:thin:@localhost :1521:orcl

  5. <property name="connection.username">test

  6. <property name="connection.password">test

  7. <property name="connection.pool_size">2

  8. <property name="dialect">org.hibernate.dialect.OracleDialect

  9. <property name="show_sql">true  //开发时可开启

  10. <property name="hibernate.hbm2ddl.auto">update //开发时可开启

配置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. '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
  2. 'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'\>
  3. <class name="cn.javass.h4.hello.UserModel" table="tbl_user">
  4. <id name="uuid">
  5. <generator class="assigned"/>
  6. <property name="age">
  7. </class>

客户端文件:

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为例来看看:

  Hibernate4教程一:入门介绍

http://sishuok.com/forum/blogPost/list/2461.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这