JAVA JDBC 调用存储过程 传参数
来源:互联网 发布:centos 6.5网络配置ip 编辑:程序博客网 时间:2024/06/08 18:32
背景:
最近公司在做食堂POS机研发,有个功能是上传离线交易。每次向服务器提交1000~2000条数据,我们现在是循环将每一条save进去,现想优化下用存储过程来实现,减少jdbc连接。
1.准备
说明:我们数据库是:orcale 11g,java 是7
1.1 创建一张表
create table A( aa VARCHAR2(30), b VARCHAR2(30), c VARCHAR2(40))
1.2 java创建一个类带main方法的类
/** * * @类功能说明 TODO * @类修改者 * @修改日期 * @修改说明 * @公司名称 Dlk * @作者 樊强 * @创建时间 2015年10月8日 上午11:28:34 * @版本 V1.0 * */public class JDBCProTest { public static void main(String[] args) {
<span style="white-space:pre"></span> }}1.3 java 基本数据
private static String X_DRIVER = "oracle.jdbc.driver.OracleDriver";private static String X_USERNAME = "bpim";private static String X_PASSWORD = "123456";private static String X_URL = "jdbc:oracle:thin:@192.168.1.25:1521:orcl";
2.直接在java程序里调用存储过程无参数无返回值。
2.1 存储过程
CREATE OR REPLACE PROCEDURE A_PROCISBEGIN INSERT INTO A (aa)values('1'); COMMIT;END A_PROC;2.2 java程序
/** * * @throws Exception * @创建时间 2015年10月8日 上午11:35:03 * @作者 樊强 * @返回值 void * @描述 测试调用存储过程:无返回值 无参数 * */ public static void testProcNoInNoOut() throws Exception { System.out.println("------- start 测试调用存储过程:无返回值 无参数"); Connection conn = null; CallableStatement callStmt = null; try { Class.forName(X_DRIVER); conn = DriverManager.getConnection(X_URL, X_USERNAME, X_PASSWORD); callStmt = conn.prepareCall("{call A_PROC()}"); callStmt.execute(); System.out.println("------- 测试调用存储过程:无返回值 无参数 End."); } catch (Exception e) { e.printStackTrace(System.out); } finally { if (null != callStmt) { callStmt.close(); } if (null != conn) { conn.close(); } } } public static void main(String[] args) { try { testProcNoInNoOut(); }catch (Exception e) {e.printStackTrace();}}
2.3 结果
3.直接在java程序里调用存储过程带参数无返回值。
CREATE OR REPLACE PROCEDURE AA_PROC(AA IN VARCHAR2) ISBEGIN INSERT INTO A (aa)values(AA); COMMIT;END AA_PROC;3.2 java程序
/** * * * @param String a * @throws Exception * @创建时间 2015年10月8日 下午2:07:48 * @作者 樊强 * @返回值 void * @描述 测试调用存储过程:无返回值 有参数 * */ public static void testProc(String a) throws Exception { System.out.println("------- start 测试调用存储过程:无返回值 有参数"); Connection conn = null; CallableStatement callStmt = null; try { Class.forName(X_DRIVER); conn = DriverManager.getConnection(X_URL, X_USERNAME, X_PASSWORD); callStmt = conn.prepareCall("{call AA_PROC(?)}"); callStmt.setString(1, a); callStmt.execute(); System.out.println("------- 测试调用存储过程:无返回值 有参数 End."); } catch (Exception e) { e.printStackTrace(System.out); } finally { if (null != callStmt) { callStmt.close(); } if (null != conn) { conn.close(); } } } public static void main(String[] args) { try { testProc("中文"); } catch (Exception e) {e.printStackTrace(); }}3.3 结果
4.直接测试带循环的存储过程
4.1 存储过程
CREATE OR REPLACE PROCEDURE AAA_PROC isbegin for i in 1 .. 5 loop insert into A (AA) values (i); commit; end loop;end AAA_PROC;
4.2 测试存储过程
begin aaa_proc;end;
4.3 结果
5.调用带list参数的存储过程
带list参数的存储过程其实应该是array参数的存储过程,都是需要用list转化为array传到数据库中的。
5.1 存储过程
create or replace type a_table is table of number;create or replace type b_table is table of varchar2(30);create or replace type c_table is table of varchar2(30);
在存储过程创建之前先声明这个array中的数据类型。(1 这里不是很确定)
CREATE OR REPLACE PROCEDURE AAAAA_PROC( v_1 a_table, v_2 b_table, v_3 c_table)is v_count number;begin v_count := v_1.count; for i in 1..v_count loop insert into A(AA, B, C)values(v_1(i),v_2(i), v_3(i)); commit; end loop;end AAAAA_PROC;
5.2java程序调用
/** * * * @param a * @throws Exception * @创建时间 2015年10月8日 下午2:07:48 * @作者 樊强 * @返回值 void * @描述 测试调用存储过程:无返回值 有参数list 多字段 * */ public static void testProcList(List<Number> a1,List<String> a2,List<String> a3) throws Exception { System.out.println("------- start 测试调用存储过程:无返回值 有参数list<span style="background-color: rgb(255, 255, 255); "> 多字段</span>"); Connection conn = null; CallableStatement callStmt = null; try { Class.forName(X_DRIVER); conn = DriverManager.getConnection(X_URL, X_USERNAME, X_PASSWORD); callStmt = conn.prepareCall("{call AAAAA_PROC(?,?,?)}"); ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor("A_TABLE", conn); ArrayDescriptor tabDesc1 = ArrayDescriptor.createDescriptor("B_TABLE", conn); ArrayDescriptor tabDesc2 = ArrayDescriptor.createDescriptor("C_TABLE", conn); ARRAY vArray1 = new ARRAY(tabDesc, conn, a1.toArray()); ARRAY vArray2 = new ARRAY(tabDesc1, conn, a2.toArray()); ARRAY vArray3 = new ARRAY(tabDesc2, conn, a3.toArray()); callStmt.setArray(1, vArray1); callStmt.setArray(2, vArray2); callStmt.setArray(3, vArray3); callStmt.execute(); System.out.println("------- 测试调用存储过程:无返回值 有参数list<span style="background-color: rgb(255, 255, 255); ">多字段 End.");</span> } catch (Exception e) { e.printStackTrace(System.out); } finally { if (null != callStmt) { callStmt.close(); } if (null != conn) { conn.close(); } } } public static void main(String[] args) { try { long aaaa=System.currentTimeMillis(); List<Number> a=new ArrayList<Number>(); List<String> b=new ArrayList<String>(); List<String> c=new ArrayList<String>(); a.add(1); b.add("A"+1); c.add("AA"+1); testProcList(a,b,c); long bbbb=System.currentTimeMillis(); System.out.println((bbbb-aaaa)/ 1000.00);<span style="white-space:pre"></span>} catch (Exception e) {e.printStackTrace();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}
5.3 结果
0.488秒
下面对这个调用过程做了个时间的验证
public static void main(String[] args) {try {long aaaa = System.currentTimeMillis();// testProcNoOut();// testProc("中文");List<Number> a = new ArrayList<Number>();List<String> b = new ArrayList<String>();List<String> c = new ArrayList<String>();for (int i = 0; i < 1000000; i++) {a.add(i);b.add("A" + i);c.add("AA" + i); }testProcList(a, b, c);long bbbb = System.currentTimeMillis();System.out.println((bbbb - aaaa) / 1000.00);} catch (Exception e) {e.printStackTrace();}}
100条 0.592秒
1000条 0.604秒
10000条 1.306秒
100000条 8.663秒
1000000条 85.3秒
0 0
- JAVA JDBC 调用存储过程 传参数
- java Jdbc调用存储过程
- java jdbc调用存储过程
- JDBC调用存储过程输出游标参数的存储过程
- java通过JDBC调用存储过程
- java调用存储过程(jdbc & hibernate)
- java调用存储过程(jdbc & hibernate)
- java jdbc 调用db2存储过程 第一节
- Java通过JDBC调用oracle存储过程
- java jdbc 调用存储过程方法
- Java-JDBC调用批处理、存储过程、事务
- Java jdbc调用Oracle数据库存储过程
- java 调用Oracle 存储过程 Jdbc/Hibernate
- Java jdbc调用Oracle数据库存储过程
- java中jdbc调用存储过程
- Java-JDBC调用批处理、存储过程、事务
- Java-JDBC调用批处理、存储过程、事务
- jdbc调用存储过程
- leetcode 283--Move Zeroes
- 判断iOS设备的尺寸
- LeetCodeOJ.Longest Palindromic Substring
- dev(八):实战:使用udevadm修改usb优盘在/dev下的名字
- character_set_server
- JAVA JDBC 调用存储过程 传参数
- centos7 开机默认进入字符界面
- qt+zint实现打印一维条形码
- 一致性hash算法 - consistent hashing
- 字符串移位
- easyui 页面跳转,关闭刷新面板
- springmvc+mybatis 无极限树形结构菜单
- iOS App开发那些事:如何选择合适的人、规范和框架?
- 拓展C++ STL功能,函数适配器,复合函数composite