(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型血,在这方面尤其敏感。
我的测试例子在附件中