导包从 oracle db 目录中找ojdbc14.jar
书写utils.java 类
package Utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JdbsUtils { private static String driver ="oracle.jdbc.OracleDriver"; private static String url ="jdbc:oracle:then:@20.20.20.152:1521/orcl"; private static String user = "scott" ; private static String password = "tiger" ; // 静态代码块注册驱动 static{ try { Class.forName(driver); } catch (ClassNotFoundException e) { throw new RuntimeException(e) ; } } public static Connection getConnection (){ try { return DriverManager.getConnection(url, user, password); } catch (SQLException e) { throw new RuntimeException(e) ; } } public static void close (Connection connection,Statement statement ,ResultSet re){ if(re!= null){ try { re.close(); } catch (SQLException e) { throw new RuntimeException(e); } finally { re=null; } } if(statement!= null){ try { statement.close(); } catch (SQLException e) { throw new RuntimeException(e); } finally { statement=null; } } if(connection!= null){ try { connection.close(); } catch (SQLException e) { throw new RuntimeException(e); } finally { connection=null; } } // 我们把对象的引用指向空值 ,意味着,这个对象会被java垃圾回收的对象, 可以把 他占用的资源释放掉 -- GC // 我们能不能通过java代码干预java的垃圾回收 ? // 我们学过java的一个api system 对象的 gc()方法, 请求运行垃圾回收 , // java的GC不受 代码的空值, 我们不能用java控制gc // 安卓手机的回收垃圾是假的 //运行一个java程序 javahelloworld // 印象java垃圾回收的 两个参数, -Xms100M -Xmx200M 运行java的堆内存最小是100M 最打是 200 M // 垃圾回收在什么情况有意义, 频繁的垃圾回收会降低性能, // 在内存不够的时候进行垃圾回收 才有意义, //技术领域 //1. 性能优化 //2. 故障诊断 : 死锁 (JDK:ThreadDump) 通过分析他就能 找到死锁 的位置 // oracle 自动处理,他会自动回滚死锁的位置 } }
如果在公司中发展 7 8 年我们如果走技术路线推荐走
1. 性能优化
2.故障诊断
死锁 (JDK:ThreadDump) 通过分析他就能 找到死锁 的位置
oracle 自动处理,他会自动回滚死锁的位置
课外
// 我们把对象的引用指向空值 ,意味着,这个对象会被java垃圾回收的对象, 可以把 他占用的资源释放掉 -- GC
// 我们能不能通过java代码干预java的垃圾回收 ?
// 我们学过java的一个api system 对象的 gc()方法, 请求运行垃圾回收 ,
// java的GC不受 代码的空值, 我们不能用java控制gc
// 安卓手机的回收垃圾是假的
//运行一个java程序 javahelloworld
// 印象java垃圾回收的 两个参数, -Xms100M -Xmx200M 运行java的堆内存最小是100M 最打是 200 M
// 垃圾回收在什么情况有意义, 频繁的垃圾回收会降低性能,
// 在内存不够的时候进行垃圾回收 才有意义,
//技术领域
//1. 性能优化
//2. 故障诊断 : 死锁 (JDK:ThreadDump) 通过分析他就能 找到死锁 的位置
// oracle 自动处理,他会自动回滚死锁的位置
oracle 中的死锁演示
一个sql 语句执行中拿着一把锁这个语句不执行玩, 就不能 再执行别的sql 语句, 不提交事物, 先进的sql 语句不会执行, 第二条就不能更新
java 调用存储过程 和 java 发送原生sql 语句操作数据库 哪个块?
java 调用存储过程 比较块 开发中直接使用springmvc 调用存储过程, 开发效率很高
在存储过程中,如果返回数据过多, 我们怎么进行 返回?
我们采用集合 什么可以返回集合?
光标 我们使用光标就可以返回集合再out参数中使用光标
声明一个包结构,包分为包头和包体
包的包头只负责声明不负责实现, plsql程序写在下面的包体中 再包中要自定义类型, 使用关键字 type ref 引用光标, 就把光标进行返回 , 包体要实现包头中的所有存储函数和存储过程 ,
我们创建包,
包头
create or replace package mypackage is type empcursor is ref cursor; procedure queryEmpList(dno in number,empList out empcursor); end mypackage;
包体
create or replace package mypackage is type empcursor is ref cursor; procedure queryEmpList(dno in number,empList out empcursor); end mypackage;
java程序调用 (接口的转换(java 中的statement 中是没有指针 这个类型的但是oracle 驱动包中提供了这个个子接口, 我们向下转型 即可))
@Test public void testpackage(){ String sql = "{call mypackage.QUERYEMPLIST(?,?)}"; Connection con = null ; CallableStatement call = null ; ResultSet re = null ; try{ con =JdbsUtils.getConnection() ; call = con.prepareCall(sql); // 对in 参数进行赋值 call.setInt(1, 10); // out 进行取值 call.registerOutParameter(2,OracleTypes.CURSOR); // 执行 call.execute(); // 取出结果 re = ((OracleCallableStatement)call).getCursor(2); // 取出结果 while (re.next()) { String name = re.getString("ename"); double sal = re.getDouble("sal"); System.out.println(name+"\t"+sal); } }catch (Exception e) { throw new RuntimeException(e) ; // TODO: handle exception }finally{ } }
oracle 中的plsql 存储过程 很重要, 因为他们的效率搞, 用于springmvc 开发, 后面的ssm 用到