java 如何调用存储过程_java调用存储过程

本文详细介绍了如何在Java中调用MySQL的存储过程,包括设置输入参数、执行存储过程和获取返回值。示例代码展示了不同类型的存储过程调用,并强调了存储过程在逻辑处理上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里是java调用存储过程。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中调用,也可以在触发器中调用,欲知简单实现。可以参考我的上一篇文章“触发器的简单实现”。

Java在sql中调用存储过程:

参数封装://存储过程参数封装

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);

/*

* 调用存储过程,执行业务

*/

//batchImportParam为调用存储

//过程的封装的参数类,这里也可以采用一个map,向map中传参数。

batchImportCardManager.batchImportCardAndUser(batchImportParam);

//返回的参数,我们可以直接在参数集合中去

//直接获取

cardTotalCount = batchImportParam.getCardTotalCount();

System.err.println("==================存储过程成功导入总记录数为:"+cardTotalCount);

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

public Integer batchImportCardAndUser(BatchImportParam batchImportParam) {

return getSqlSession().selectOne(getSqlMapNamespace() + ".batch_import_cardanduser",batchImportParam);

}

在xml中调用存储过程。

{call batch_import_cardanduser(?,?,?,?,?,?,?,?,?,?)}  

]]>

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

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

时间:2016年12月20日16:59:13

-------------快速的向一张表中插入10万条数据,怎么做,用sql实现------------

最开始我想写一句插入的sql,直接循环插入多条数据,结果语法不正确。(sql只能执行一次,不能循环执行,调用一次执行一次)INSERT INTO test1(id,name) VALUES(1+(SELECT MAX(t.id) FROM test1 t),CONCAT('admin',(SELECT MAX(t1.id)+1 FROM test1 t1)))

WHERE ((SELECT MAX(id) from test1) 

如下:-- 存储过程

delimiter ||

create procedure myproc()

begin

declare num int ;

set num = 1 ;

while num 

insert into test1(id, `name`)

values

(num, concat("name", num)) ;

set num = num + 1 ;

end

while ;

end||

-- 执行这个函数

call myproc()

-- 删除这个存储过程

drop procedure myproc

-- 清空表

DELETE from test1

-- 查询数据

SELECT * from test1

总结:存储过程更易写逻辑,难度更低。我们有时候写多条关联查询的时候,sql难度比较大,其实可以写存储过程来实现,只是后期维护难度大点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值