java调用存储过程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

在其他地方我已经写过一个mySql存储过程的简单实现http://jianboli.blog.51cto.com/12075002/1884019

这里是java调用存储过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package  com.lijianbo.procedure;
 
import  java.sql.CallableStatement;
import  java.sql.Connection;
import  java.sql.DriverManager;
import  java.sql.Types;
 
/**
  * @author 
  * 存储过程MySQL
  */
public  class  ProcedureMySql {
      public  static  final  String DRIVER_CLASS =  "com.mysql.jdbc.Driver"
         public  static  final  String URL =  "jdbc:mysql://localhost:3306/test"
         public  static  final  String USERNAME =  "root"
          public  static  final  String PASSWORD =  "root"
          public  static  void  main(String[] args)  throws  Exception { 
//            test1(); 
//            test2(); 
               testIdAdd();
         
        
     public  static  void  test1()  throws  Exception 
     
           Class.forName(DRIVER_CLASS); 
              Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 
              String sql =  "{CALL test1(?)}" //调用存储过程 
         CallableStatement cstm = connection.prepareCall(sql);  //实例化对象cstm 
          cstm.setString( 1 "李" );  //存储过程输入参数 
          cstm.execute();  // 执行存储过程 
          cstm.close(); 
          connection.close(); 
     
       /**
        * 查询总的价格
        * getTotalByUser2
        * call getTotalByUser2(1, true, @total);  -- 加税
        *select @total;
        * @throws Exception
        */
      public  static  void  test2()  throws  Exception { 
             Class.forName(DRIVER_CLASS); 
              Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 
              String sql =  "{CALL getTotalByUser2(?,?,?)}" //调用存储过程 
              CallableStatement cstm = connection.prepareCall(sql);  //实例化对象cstm 
              cstm.setInt( 1 1 );  //设置第一个传入参数
              cstm.setBoolean( 2 true );  //设置第二个传入参数
              cstm.registerOutParameter( 3 , Types.DECIMAL);  // 设置返回值类型 即返回值 
               cstm.execute();  // 执行存储过程 
              System.out.println(cstm.getString( 3 )); 
              cstm.close(); 
              connection.close(); 
               
     
      /**
       *id自增
       * getTotalByUser2
       * call getTotalByUser2(1, true, @total);  -- 加税
       *select @total;
       * @throws Exception
       */
      public  static  void  testIdAdd()  throws  Exception {
          Class.forName(DRIVER_CLASS); 
          Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 
          String sql =  "{CALL test1(?)}" //调用存储过程 
          CallableStatement cstm = connection.prepareCall(sql);  //实例化对象cstm 
          cstm.setString( 1 "测试" );  //设置第一个传入参数
          cstm.execute();  // 执行存储过程 
          cstm.close(); 
          connection.close(); 
     
      
      
      
      
}

存储过程既可以在java中调用,也可以在触发器中调用,欲知简单实现。可以参考我的上一篇文章“触发器的简单实现”。


http://jianboli.blog.51cto.com/12075002/1884180


Java在sql中调用存储过程:

参数封装:

1
2
3
4
5
6
7
8
9
10
11
12
//存储过程参数封装
     BatchImportParam batchImportParam =  new  BatchImportParam();
     batchImportParam.setDescn(descn);
     batchImportParam.setExportName(exportName);
     batchImportParam.setExportNo(exportNo);
     batchImportParam.setImportName(importName);
     batchImportParam.setOrderNo(orderNo);
     batchImportParam.setImportNo(importNo);
     batchImportParam.setCreateby(getCurrentUserId(request));
     batchImportParam.setCardProductId(cardProductId);
     batchImportParam.setCardFaceId(cardFaceId);
     batchImportParam.setCardTotalCount( null );


1
2
3
4
5
6
7
8
9
10
/*
  * 调用存储过程,执行业务
  */
  //batchImportParam为调用存储
  //过程的封装的参数类,这里也可以采用一个map,向map中传参数。
batchImportCardManager.batchImportCardAndUser(batchImportParam);
//返回的参数,我们可以直接在参数集合中去
//直接获取
cardTotalCount = batchImportParam.getCardTotalCount();
System.err.println( "==================存储过程成功导入总记录数为:" +cardTotalCount);


在BatchImportCardDAOImpl中我们采用select关键字查询。

1
2
3
4
@Override
public  Integer batchImportCardAndUser(BatchImportParam batchImportParam) {
     return  getSqlSession().selectOne(getSqlMapNamespace() +  ".batch_import_cardanduser" ,batchImportParam);
}

在xml中调用存储过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 存储过程 -->
       <parameterMap id= "map_r_process_order"  type= "java.util.HashMap" >  
         <parameter property= "importNo"  jdbcType= "VARCHAR"  javaType= "java.lang.String"  mode= "IN"  /> <!--  输入参数 -->
         <parameter property= "importName"  jdbcType= "VARCHAR"  javaType= "java.lang.String"  mode= "IN"  />  
         <parameter property= "orderNo"  jdbcType= "VARCHAR"  javaType= "java.lang.String"  mode= "IN"  />  
         <parameter property= "exportNo"  jdbcType= "VARCHAR"  javaType= "java.lang.String"  mode= "IN"  />  
         <parameter property= "exportName"  jdbcType= "VARCHAR"  javaType= "java.lang.String"  mode= "IN"  />  
         <parameter property= "createby"  jdbcType= "INTEGER"  javaType= "int"  mode= "IN"  />  
         <parameter property= "descn"  jdbcType= "VARCHAR"  javaType= "java.lang.String"  mode= "IN"  />  
         <parameter property= "cardProductId"  jdbcType= "INTEGER"  javaType= "int"  mode= "IN"  />  
         <parameter property= "cardFaceId"  jdbcType= "INTEGER"  javaType= "int"  mode= "IN"  />  
         <parameter property= "cardTotalCount"  jdbcType= "INTEGER"  javaType= "int"  mode= "OUT"  />  <!-- 返回参数 -->
     </parameterMap>  
     <select id= "batch_import_cardanduser"  parameterMap= "map_r_process_order"  statementType= "CALLABLE"  >
       <![CDATA[
                {call batch_import_cardanduser(?,?,?,?,?,?,?,?,?,?)}  <!-- 问号个数必须要和参数的个数匹配 -->
             ]]> 
   </select>

总结:其实这种在xml中调用也相当于上面的直接在方法中直接调用,都是需要传入参数,返回参数,只是表现形式不一样而已。



我这里只是一个示例,你可以参考里面的注释,具体存储过程的名字要根据你自己写的来修改。




      本文转自建波李 51CTO博客,原文链接:http://blog.51cto.com/jianboli/1884370,如需转载请自行联系原作者






相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
存储 安全 Java
深入理解HashMap:Java中的键值对存储利器
深入理解HashMap:Java中的键值对存储利器
74 0
|
3天前
|
存储 Oracle Java
Java调用存储过程小结
Java调用存储过程小结
|
3天前
|
存储 算法 Java
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
56 1
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
|
3天前
|
存储 Java
百度搜索:蓝易云【Java语言之float、double内存存储方式】
由于使用IEEE 754标准进行存储,float和double类型可以表示非常大或非常小的浮点数,并且具有一定的精度。然而,由于浮点数的特性,它们在进行精确计算时可能会存在舍入误差。在编写Java程序时,需要注意使
61 0
|
5月前
|
存储 XML Java
【Java】Spring更简单的读取和存储
【Java】Spring更简单的读取和存储
34 0
|
3天前
|
存储 网络协议 Java
本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件
本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件
|
3天前
|
存储 缓存 Java
|
3天前
|
存储 分布式计算 Java
使用 Java 实现分布式计算和存储
【4月更文挑战第19天】本文探讨了使用 Java 实现分布式计算和存储,重点介绍了分布式计算的概念和分布式存储的优势。文中提到了Hadoop和Spark两大框架,以及HDFS和NoSQL数据库(如HBase)在存储上的应用。利用MapReduce和Spark API进行分布式计算,借助ZooKeeper实现节点协调,确保容错和可靠性。通过性能优化和调优,Java能构建高效、可靠的分布式系统,适应大数据时代的需求。
|
3天前
|
存储 Java 索引
Java链式存储LinkedList----与ArrayList比较
Java链式存储LinkedList----与ArrayList比较
56 1
|
7月前
|
存储 Java 程序员
【Java】Spring更简单的读取和存储
【Java】Spring更简单的读取和存储