java调用存储过程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

在其他地方我已经写过一个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,如需转载请自行联系原作者






相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
8月前
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
12月前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
274 3
|
12月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
132 3
|
12月前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
245 1
|
7月前
|
存储 Java 数据库连接
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
|
9月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
279 7
|
10月前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
187 1
|
11月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
811 2
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
存储 算法 Java
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
这篇文章详细介绍了在Java项目中如何使用MD5算法对用户密码进行加密存储和登录验证,包括加入依赖、编写MD5工具类、注册时的密码加密和登录时的密码验证等步骤,并通过示例代码和数据库存储信息展示了测试效果。
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。