您的当前位置:首页Hibernate + Oracle 结合

Hibernate + Oracle 结合

2023-11-10 来源:哗拓教育

1.新建 WEB Project 项目 “OracleTest”;

2.导入Hibernate 框架;

3. 在MyEclipse 中 创建 Oracle 某个数据库的连接

(Windos -- Show View -- DB Browser )调出 DB Browser 功能;

空白处,右键,单击 “New” ,开始新建 连接项

给连接项 起一个好记且有意义的名字,例如:oracle_hello (连接 oracle 的 hello 数据库)

选择 Oracle (OCI Driver)或者 Oracle (Thin Driver)均可,(OCI 需要本地安装Oracle 客户端,所以一般用Thin Driver即可);

按照模板填好 Connection URL ,例如:jdbc:oracle:thin@localhost:1521:hello;

填好 User name ,这里为 system;

填好 Pasword ;

然后点击“Add JARs” 选择好本地的 Oracle 的jdbc 的驱动包;

Driver classname 选择 “oracle.jdbc.driver.OracleDriver”;

填好上述信息后,单击“Test Driver” 测试一下所填信息是否正确,如果正确,一切OK;否则,仔细看看上述信息有没有错误;

 

4. 建好连接项后,可以打开连接项,选择好要导入的表,然后右键,点击“Hibernate Reverse Engineering” 即可将映射信息导入到项目中

(选择 Id Generator 时 ,一般选择 assigned,想要自动增长而不用专门去数据库查询,可以选择increment选项);

通过java访问数据库,查询并保存信息;

 

有一点需要特别注意,虽然Hibernate 框架可以自动生成映射文件和数据库连接文件,但是由于Oracle的特殊性,Hiberntate生成的实体类文件中的字段的类型不一定合适:

例如:笔者数据库里的id字段是NUMBER类型,Hibernate会自动映射成BigDecimal,BigDecimal类型的数据不能像int类型那样简单进行+-*/,而是需要调用特殊方法才可以,所有笔者将实体类文件里的BigDecimal 类型改成了 int 类型,注意将getter 和 setter 方法中的BigDecimal 也改成int,特别注意:将实体与表映射文件中的BigDecimal也改成int 类型;

 

做好上述工作后,就可以调用Dao文件里的方法访问数据库了

(MyEclipse 2014 prefessional 版本中的Hibernate框架自动生成的Dao 文件里的 save 和 delete 方法需要添加事务处理功能,否则无效,如下图所示)

技术分享

 

5.做完上述工作后,就可以新建测试类,进行测试了,完美:

技术分享

Hibernate + Oracle 结合

标签:

小编还为您整理了以下内容,可能对您也有帮助:

采用Hibernate框架的研发平台如何能够真正兼容Oracle和sqlServer

都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的容易,是相对的。 想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用了Hibernate框架就能实现的。 下面记录一下我做这件事情都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的“容易”,是相对的。

想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用了Hibernate框架就能实现的。

下面记录一下我做这件事情的过程和一些感悟。

当我接到该任务时,我先大致的理了一下思路:

要完成迁移,总体上有2大块工作要做,分别是:数据库层面的迁移 和 平台底层代码的改造

一、数据库层面的迁移过程:

1、通过sqlServer Studio2008 工具将数据从Oracle导入到SqlServer数据库

从SSMS2008开始才支持此功能,具体操作步骤(右键点击数据库-选择导入-点下一步-选择 Oracle Provider for OLE DB 数据源-点击属性-填写数据源,格式为 IP:端口/实例名),后面的步骤根据向导一步步的操作即可。需要注意的是在 选择源表和源视图的步骤中:

(1)、要把【目标】列中的默认前缀去掉,这样导入的表才会默认关联到dbo下,否则你每次查询表都要带上schema前缀,导致你之前的应用程序中的sql无法执行,因为你之前写的那些sql肯定不会带这种前缀。

(2)、先勾选你要导入的源,然后双击每一行记录,在弹出的对话框中检查是否所有的类型都正确绑定好了,我在检查的时候就遇到了oracle中是varchar2类型的,在该对话框显示的表结构中变成了130,只能手动的去将所有130改成varchar类型(sqlserver里没有varchar2类型)。还有原来是clob类型的,现在变成了varchar,要手动改成text类型(因为clob类型的字段比较少,所以可以通过在oracle中执行“select * from user_tab_columns c where c.data_type='CLOB';”来查看哪些表中用到了CLOB类型的字段)。

2、增加to_date、to_char、to_number、concat等常用的函数

说明:我在编写to_date函数的时候,只提供了一种格式“yyyy-mm-dd HH:mi:ss”,这是因为在sqlserver中是没有和to_date函数的类似的函数的,只能使用convert函数实现,但是convert函数不支持传入格式化字符串,只能传入格式字符对应的整型数字,而120对应的正是之前提到的“yyyy-mm-dd HH:mi:ss”格式;另外此次是迁移到Sqlserver2005,该版本是没有内嵌concat函数的,根据官方文档的说法,是从sqlServer2012开始才有concat函数的,所以这里我要自己编写一个concat函数。

------------------------------------------------------------------concat函数

USE [skyplatform]

GO

/****** Object: UserDefinedFunction [dbo].[concat] Script Date: 03/10/2015 17:11:31 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE FUNCTION [dbo].[concat]

(

@param1 varchar(500),

@param2 varchar(500)

)

returns varchar(1000)

as

begin

DECLARE @returntext varchar(1000)

if (@param1 is null)

SELECT @returntext= @param2;

else if (@param2 is null)

SELECT @returntext= @param1;

else

SELECT @returntext= @param1 + @param2;

return @returntext;

end

--------------------------------------------------------------------to_char函数

USE [skyplatform]

GO

/****** Object: UserDefinedFunction [dbo].[to_char] Script Date: 03/10/2015 17:12:09 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE FUNCTION [dbo].[to_char]

(

@param1 datetime,

@param2 varchar(20)

)

returns varchar(20)

as

begin

return convert(varchar(20),@param1,120)

end

--------------------------------------------------------------------to_date函数

USE [skyplatform]

GO

/****** Object: UserDefinedFunction [dbo].[to_date] Script Date: 03/10/2015 17:12:58 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE FUNCTION [dbo].[to_date]

(

@param1 varchar(20),

@param2 varchar(20)

)

returns datetime

as

begin

return convert(datetime,@param1,120)--120 means that yyyy-mm-dd hh:mi:ss(24h)

end

--------------------------------------------------------------------to_number函数

USE [skyplatform]

GO

/****** Object: UserDefinedFunction [dbo].[to_number] Script Date: 03/10/2015 17:13:09 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE FUNCTION [dbo].[to_number]

(

@param1 varchar

)

returns numeric

as

begin

return convert(numeric,@param1)

end

二、平台底层代码的改造

1、引入SqlServer的jar包:sqljdbc4-4.0.jar

com.microsoft.sqlserver

sqljdbc4

4.0

2、修改db.properties中关于数据库连接信息的配置

jdbc.dialect=org.hibernate.dialect.SQLServerDialect

jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver

jdbc.url=jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=xxx

jdbc.default_schema=dbo

jdbc.username=xxx

jdbc.password=xxx

3、修改平台中使用的一些非sql标准的语法

在使用delete insert update这些dml语句的时候,切记不要使用别名,因为在oracle和sqlserver中,这些dml语句使用别名的语法是不一样的。

4、各实体类主键策略的改造

最好都使用string类型的主键,但是因为之前的代码中都用的sequence做主键策略,现在改成string类型工作量势必很大,所以决定使用table策略来兼容各种数据库。

5、层对sql的处理

由于sqlserver中调用自定义标量值函数,必须在函数名前加上dbo.的前缀,但是这样写势必会导致不能兼容其它的关系型数据库,所以只能从实现层,对sql进行统一的处理,处理规则就是:如果当前数据库是sqlserver,并且sql中出现了concat、to_date、to_char、to_number等函数,就为这些函数名加上dbo.的前缀。

以上做完,基本就可以让平台在sqlserver数据库上跑了,同时也可以通过改配置文件切换到Oracle数据库。

通过hibernate连oracle数据库

前言:以下所有的操作都是基于你已经成功安装了oracle数据库并且java的开发环境正常的情况下进行的。

如果没有完善请先配置基础环境。

 

第一步:配置需要的环境(下载并导入需要的包)。

下载链接:http://pan.baidu.com/s/1sjC0vvB

 

第二步:编写hibernate配置文件

技术分享

技术分享其中需要注意的是connection.url配置的xe是你的oracle数据库的SID,所以需要换成你自己的。

如果你不知道可以这样查询:打开oracle的“运行SQL命令行”然后输入下面的命令就可以查到了。

技术分享

其中NAME下面的字符串就是你的SID。

 

最后:运行程序就可以链接了。

hibernate连接oracle数据库

标签:

通过hibernate连oracle数据库

前言:以下所有的操作都是基于你已经成功安装了oracle数据库并且java的开发环境正常的情况下进行的。

如果没有完善请先配置基础环境。

 

第一步:配置需要的环境(下载并导入需要的包)。

下载链接:http://pan.baidu.com/s/1sjC0vvB

 

第二步:编写hibernate配置文件

技术分享

技术分享其中需要注意的是connection.url配置的xe是你的oracle数据库的SID,所以需要换成你自己的。

如果你不知道可以这样查询:打开oracle的“运行SQL命令行”然后输入下面的命令就可以查到了。

技术分享

其中NAME下面的字符串就是你的SID。

 

最后:运行程序就可以链接了。

hibernate连接oracle数据库

标签:

hibernate怎么调用oracle数据库中函数

1、在Oracle sequence首先创建sequence create sequence seq_id minvalue 1 start with 1 increment by 1 cache 20;? 2.在你的hbm.xml中的配置 ? ? seq_id< SPAN>param>? generator>? id>? 这样再插入数据的时候,Hibernate会自动生成如下语句:...

hibernate怎么调用oracle数据库中函数

1、在Oracle sequence首先创建sequence create sequence seq_id minvalue 1 start with 1 increment by 1 cache 20;? 2.在你的hbm.xml中的配置 ? ? seq_id< SPAN>param>? generator>? id>? 这样再插入数据的时候,Hibernate会自动生成如下语句:...

hibernate随机取得数据库中的20条数据,数据库用oracle,怎样做效率最高

做一个考试系统,需要要随机抽题目组卷!把我的思路简单说一下

1. 使用Hibernate,要有高的效率, 好的OO设计非常重要,这影响到缓存的设计。

2.组卷是先把所有题目加载到缓存中,我采用的方式放在Collection对象中。

3.每次组卷前,对Collection里面的对象进行随机排序。随机算法类似洗牌算法,可以见:http://apps.hi.baidu.com/share/detail/6221904 第2种算法说明。

4.随机排序Collection里面的题目后,开始顺序取出Collection的题目。全部都是再缓存进行,只需要查询一次数据库。

5.如果题目很多,无法全部加载到缓存中,那么加载题目的ID。

项目是前年做的,组卷的时候在7000道题随机组卷,每份试卷75道题左右。100份试卷好像几秒组完。还可以接受。

hibernate连接oracle11g

首先在eclipse中导入hibernate插件

在Eclipse中建一个动态工程 有个hibernate向导

还要先导入hibernate3包和jdbc4j驱动包 你可以根据向导提示同数据库链接

显示全文