Java中执行存储过程
更新时间:2024-01-14 07:20:01 阅读量: 教育文库 文档下载
Java执行存储过程常用方法
首先说一下存储过程的优点:
1. 存储过程是预编译的,第一次编译执行后,之后的执行效率会比较, 也就是
存储过程效率高
2. 存储过程, 只是提供给用户使用, 封装了内部操作, 可以防止注入攻击 3. 便于修改和维护, 只需要修改存储过程内部业务实现, 并不需要修改使
用的实现.
4. 减少使用流量, 存储过程内部SQL语句,是储存在数据库中, 所以省去了
加载SQL语句的流量
存储过程的形式大概可以分为以下几种:
1. 无参无返2.有参无返3.无参有返 4有参有返 5.传出参数
这里的返回值并不是指执行查询之后返回的结果视图,而是值在存储过程中return返回的值..下面将对Sql Server数据库使用存储过程举例:
准备工作:
1.使用JDBC链接方式, 需要引入jar包: sqljdbc4.jar,封装一个数据连
接类, 方便接下来的操作,这里类名为DBHelper, 定义了一个静态方法getCon(), 用于返回链接对象,返回值类型为Connection, 还有一个关闭对象的方法closeAll(Connection co,Statement ps,ResultSet rs); 其中参数分别为Connection,Statement,ResultSet的对象。
具体代码如下:
publicclass DBHelper { }
privatestaticfinal privatestaticfinal String
privatestaticfinal String sa=\; privatestaticfinal String pwd=\; //建立连接
publicstatic Connection getCon(){ }
//关闭所有对象
publicstaticvoid closeAll(Connection co,Statement ps,ResultSet rs){ }
try { }
if(rs!=null){ }
if(ps!=null){ }
if(co!=null){ }
System.out.println(e.getMessage());
co.close(); co=null; ps.close(); ps=null; ps.close(); rs=null;
Connection co=null; try { }
return co;
Class.forName(driver);
co=DriverManager.getConnection(url,sa,pwd); e.printStackTrace();
System.out.println(e.getMessage());
Stringdriver=\; url=\;
} catch (Exception e) {
} catch (Exception e) {
注意:这里的关闭方法参数中的STATEMENT PS,如果接下来操作会使用PREPAREDSTATEMENT和CALLABLESTATEMENT接口,不需要进行类型转化,因
为后两者本身就已经直接或间接实现了
STATEMENT接口,有疑问具体可以
查阅一下API文档。
2. 这里作为示例,准备了一个 demo数据库(sql server),里面有一张studentInfo表,添加5条测试数据,表结构如下:
createtablestudentInfo (
stuIdintprimarykeyidentity(1,1), )
stuNamevarchar(20)notnull, stuAgeintnotnulldefault 0,
OK , 所有的准备工作已经完成。 接下来讲示例几种存储过程的示例:
1. 无参无返:
创建存储过程proc_getAllInfo如下: --查询所有studentInfo记录 createprocproc_getAllInfo
as begin
select*fromstudentInfo end
在java中,执行普通的sql语句,使用的是Statement对象或者PreparedStatement,而在调用存储过程,应该使用CallableStatement接口。
CallableStatement接口:
用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程 SQL 转义语法,
该语法允许对所有 RDBMS 使用标准方式调用存储过程。
执行上面的存储过程示例代码:
//测试类
publicclass Test {
publicstaticvoid main(String[] args) throws Exception{ Connection co=DBHelper.getCon();//获取链接对象 CallableStatement cs=co.prepareCall(\
proc_getAllInfo}\);//通过连接获取CallableStatement对象 ResultSet rs=cs.executeQuery();//执行并返回结果集 while(rs.next()){//循环读取逐行
System.out.print(rs.getString(2)+\); }
DBHelper.closeAll(co, cs, rs); } }
1. 通过已经封装之后的DBHelper类中的getCon()静态方法获取连接对象Co
2. 通过co对象的prepareCall(String arg0)方法可以换回一个指定存储过程的调用对象, 需要注意的是,参数 arg0在次应该写为“{call
存储过程名}”。即:CallableStatement cs=co.prepareCall(\proc_getAllInfo}\
3. 通过使用cs的executeQuery(); 返回执行的结果集, 为ResultSet类型,因为CallablesStatement接口实现了PrepareStatement接口,而PrepareStatement接口又实现了Statement接口,所以CallablesStatement对象拥有executeQuery()方法。 4. 然后使用将返回的结果集逐行读取。
5. 最后,不要忘记关闭所有的对象。还是调用DBHelper中的静态方法closeAll()。
接下来操做就不在解释上面这些语句,有特殊不同地方会有所标注,来看第二个示例:
2. 有参无返:
创建存储过程proc_getInfoByStuName,有一个字符串类型参数,如下:
--根据stuName查询记录
createprocproc_getInfoByStuName @stuNamevarchar(20) as begin select*fromstudentInfowherestuName=@stuName end
执行上面的存储过程示例代码:
//测试类
publicclass Test {
publicstaticvoid main(String[] args) throws Exception{ Connection co=DBHelper.getCon();//获取链接对象 CallableStatement cs=co.prepareCall(\
proc_getInfoByStuName (?)}\);//通过连接获取CallableStatement对象 String stuName=\;
cs.setString(1, stuName);
}
}
ResultSet rs=cs.executeQuery();//执行并返回结果集 while(rs.next()){//循环读取逐行
System.out.print(rs.getString(2)+\); }
DBHelper.closeAll(co, cs, rs);
执行之后,控制台会输出Tom
需要注意的是:获取CallableStatement对象方法不变,需要更改的是co.prepareCall(String arg0)方法中的参数,更改为“{call 存储过程名 (?)}“ 。其中存储过程参数放在存储过程名字之后的()之中,?指代参数,有几个参数就需要在()中添加几个 ?. (这里字符串类型不需要加单引号), 相当于占位符..然后需要使用cs.setObject(Object o), 根据参数类型调用相应的set方法. ..接下来一样,这里不多做解释…
3. 无参有返:
创建无参有返的存储过程如下: createprocproc_updateAge as begin
updatestudentInfosetstuAge=21 wherestuAge=20 return 100 end
执行上面的存储过程示例代码:
publicstaticvoid main(String[] args) throws Exception { Connection co=DBHelper.getCon();//获取链接对象
CallableStatement cs=co.prepareCall(\proc_updateAge}\);//通过连接获取CallableStatement对象
cs.registerOutParameter(1, java.sql.Types.INTEGER);//注册参数为传出或者返回类型参数Int类型 cs.execute();//执行
int result=cs.getInt(1);//获取参数 DBHelper.closeAll(co, cs, null); System.out.println(result);//输出 }
需要注意的是:获取CallableStatement对象方法不变,需要更改的是co.prepareCall(String arg0)方法中的参数,更改为“{?=call 存储过程名}“ . 然后使用cs.registerOutParameter(int paramIndex,sqlType); 方法注册参数,第一个参数为需要注册参数的下标(从1开始), 第二个为注册的类型, 不是java中的数据类型,而是sql的数据类型, 可以使用java.sql.Types.类型 方法类生命sql中的类型… 获取返回值,在调用cs对象的执行方法之后, 使用get方法 即可接受到返回值.
控制台输出100
4. 有参有返:
上面已经讲了有参无返,无参有返的调用方法, 那么举一反三很简单就可以想到有参有返如何执行了, 我还是写一下吧.
存储过程
createprocproc_deleteStuByName @namevarchar(20) as
begin
deletefromstudentInfowherestuName=@name return 100 end
java执行此存储过程:
//测试类
publicclass Test {
publicstaticvoid main(String[] args) throws Exception { Connection co=DBHelper.getCon();//获取链接对象 CallableStatement cs=co.prepareCall(\
proc_deleteStuByName (?)}\);//通过连接获取CallableStatement对象 cs.registerOutParameter(1, java.sql.Types.INTEGER);//注册参数为传出或者返回类型参数Int类型 cs.setString(2, \); cs.execute();//执行
int result=cs.getInt(1);//获取参数 DBHelper.closeAll(co, cs, null); System.out.println(result);//输出 } }
关于实现过程,就不在解释,需要注意的是:只有传出参数或者return才需要registerOutParameter()注册参数, 其余的为普通参数, 直接使用set方法就可为参数赋值, 参数下标索引, 从1开始, 从左往右一次增长…
5. 带有传出参数的存储过程:
看到这里, 相信你已经基本上可以猜到如何使用带有传出参数的存储过程了, 对的, 就是使用registerOutParameter()方法
存储过程代码:
createprocproc_deleteStuByNameAndGetParam @namevarchar(20),
@stuNamevarchar(20) out put as begin
deletefromstudentInfowherestuName=@name
select@stuName=stuNamefromstudentInfowherestuId=1 end
java执行此存储过程:
//测试类
publicclass Test {
publicstaticvoid main(String[] args) throws Exception { Connection co=DBHelper.getCon();//获取链接对象 CallableStatement cs=co.prepareCall(\proc_deleteStuByNameAndGetParam (?,?)}\);//通过连接获取CallableStatement对象
cs.setString(1, \);
cs.registerOutParameter(2, java.sql.Types.VARCHAR);//注册参数为传出或者返回类型参数Int类型 cs.execute();//执行
String result=cs.getString(2);//获取参数 DBHelper.closeAll(co, cs, null); System.out.println(result);//输出 } }
关于实现过程,需要解释吗?
总结:
1. 执行存储过程是使用CallableStatement接口的对象
2. 使用Connection对象的prepareCall(“{call 存储过程名 (参数) }”)方法方法指定存储过程,并返回CallableStatement的一个对象.
3. 参数下标从1开始, 由左往右增长,可是使用?方式声明参数, 使用set方法给参数赋值
4. 如果存储过程中有return或者传出参数时候, 需要明确使用CallableStatement对象的registerOutParameter(参数下标,sql类型)注册参数. ”
最后.
祝大家学习愉快. 工作生活顺利!
正在阅读:
Java中执行存储过程01-14
行政事业单位国有资产管理存在的问题及对策09-15
《数字电路》课程试卷06-10
沈石溪班级读书会教案07-24
九年级化学上册 课题1 燃烧和灭火11-07
老婆最爱听的话02-21
下河口学校家长会讲话稿06-04
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 存储
- 执行
- 过程
- Java
- 北师大新版五年级数学上册全册教案 - 图文
- 甯波市紧固件重点企业名录
- 2019年春八年级英语下册Unit8AgreenworldPeriod2Reading听写本素材(新版)牛津版
- 户外亮化工程施工组织设计方案
- 从德鲁克的管理思想看非营利组织的人力资源管理
- 机械能综合训练一
- 吴昌硕题画诗(20)
- 反假货币知识题库0
- 智能灭火小车论文 - 图文
- 领导干部“六个严禁”个人自查自纠报告范文
- 统一建模语言UML复习资料
- 管理学激励理论的发展史
- 2017-2018学年上海教育版英语四年级下册期末测试卷(含答案) - 图文
- 集锦MI编写指引1.1(2007-07-14)
- 迎面接力比赛方法与规则
- 实验七 - 操作系统页面调度算法
- 箱梁模板施工技术交底
- 一届届二届竞赛试题与大纲 - 图文
- 上海市徐汇区2015届高三上学期学习能力诊断(一模)英语试题
- 输液并发症的处理及预防