`
zhyt710
  • 浏览: 203318 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle一步接一步(3)--java连接

阅读更多

(1)现在写一个链接oracle的java测试程序。 注意把驱动程序放在classpath下。本人用的是oracle10g,用的驱动程序包是ojdbc14.jar。在oracle数据库的**/jdbc/lib 目录下可以找到。(**根据安装oracle的具体情况而定)

package test.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class OracleConnection {

	public static void main(String[] args) {
		String sDBDriver = "oracle.jdbc.driver.OracleDriver";
		String sConnStr = "jdbc:oracle:thin:@192.168.1.254:1521:test";

		Connection conn = null;
		ResultSet rs = null;
		Statement stmt = null;
		try {
			Class.forName(sDBDriver);
			conn = DriverManager.getConnection(sConnStr, "SYSTEM", "yourpwd");
			
			if(conn != null) {
				System.out.println("取得链接成功");
			}

			stmt = conn.createStatement();
			stmt.execute("create table ztest(id int, name varchar(20))");
			stmt.executeUpdate("insert into ztest values(1, 'zhangsan')");
			stmt.executeUpdate("insert into ztest values(2, '张三')");
			rs = stmt.executeQuery("select count(*) from ztest");
			while (rs.next()) {
				System.out.println(rs.getInt(1) == 2);
			}
			rs = stmt.executeQuery("select * from ztest");
			while (rs.next()) {
				System.out.println(rs.getInt(1));
				System.out.println(rs.getString(2));
			}
			stmt.execute("drop table ztest");
			rs.close();
			stmt.close();
			
			conn.close();

		} catch (Exception e) {
			System.out.println(e);
		}

	}

}

 

(2) 在(1)中如果把程序改成utf-8编码的话,得到的汉字查询结果就是乱码。因为我的数据库那边用的是gbk编码。

新建一个数据库(用database configration assistant工具,在最后几步中有个标签页可以设定编码类型),改用utf-8字 符集编码,同时把自己的java工程属性也使用utf-8编码(我在eclipse下是可以这样做的)。结果运行上述语句,结果很恐怖,总是有异常,在插入中文数据的时候就会出错。不过我可以断言,oracle的jdbc驱动存在这个不完善的地方,我大胆的把它称之为bug。因为我的插入语句执行的是标准sql。最后的解决办法有些可笑,但总归是可行的,就是用PreparedStatement执行。相关代码片段如下

String prsql = "create table ztest(id int, name varchar(20))";
			pstmt = conn.prepareStatement(prsql);
			pstmt.execute();
			prsql = "insert into ztest(id, name) values(?,?)";
			pstmt = conn.prepareStatement(prsql);
			pstmt.setLong(1, 1);
			pstmt.setString(2, "zhangyt");
			pstmt.execute();
			pstmt.setLong(1, 2);
			pstmt.setString(2, "汉字");
			pstmt.execute();

 好了,至少这样可以大胆的应用utf-8编码了。

 

(3)应用hibernate与oracle链接以及主键生成机制测试。

这里主要讨论主键生成机制的问题,我们知道在用mysql和sqlserver的时候,可以直接声明native方式来让数据库自动生成主键。而oracle自动生成主键的方式是使用sequence,在加上trigger。在利用hibenrate管理oracle表主键时,通常我们都是自定义一个sequence来为我们的表生成主键。当然,这个时候就不再需要trigger了,因为hibnate会为你去检索sequence的下一个值来提供主键设定插入操作原料。但是我们是否可以用native的方式来为oracle表生成主键呢?答案是可以,不过你需要建立一个供hibernate默认使用的sequence,名称是hibernate_sequence。

我们通常的主键设置方式:

       <id name="s_id" column="s_id">
            <generator class="sequence">
              <param name="sequence">student_seq_id</param>
            </generator>
        </id>

上面配置文件中使用得到student_seq_id是自己已经在oracle中建立好的sequence 。

我们使用native的设置方式:

        <id name="p_id" column="p_id">
            <generator class="native"/>
        </id> 

应用上面的方式,需要自己在oracle中建立好名为hibernate_sequence的sequence。同时这种方式并不是没有弊端,就是由于多个表共享一个sequence,在一个表中出现的主键号码可能是不连续的,给人一种怪怪或这不完美的该觉,我是A型血,在这方面尤其敏感。

我的测试例子在附件中

分享到:
评论

相关推荐

    java连接opc读取数据

    最近由于项目需要,在已有java web工程里添加读取opc的接口类。通过接口将opc数据读取到本地存于oracle数据库中,供本管理系统趋势分析用。本实例在win7、xp系统本地均已调通。压缩包里有本人写的每一步详细说明操作...

    配置MSSQL数据源连接步骤

    配置MSSQL数据源连接步骤 [很卡,设置下了分辨率了] ...涉及所有关于java方面的编程均可讨论 本人目前涉及MYSQL ORACLE LINUX AJAX SSH XML....... 好了,教程就到这,88 本人邮箱:zhuseahui@yahoo.com.cn

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    3. 运行该批处理程序将自动完成oracle卸载工作,最后手动删除\app文件夹(可能需要重启才能删除) 4. 运行regedit命令,打开注册表窗口。删除注册表中与Oracle相关的内容,具体如下:  删除HKEY_LOCAL_MACHINE/...

    java开源包4

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    java开源包1

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    java开源包3

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    java开源包10

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    java开源包11

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    java开源包6

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    java开源包9

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java开源包101

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

Global site tag (gtag.js) - Google Analytics