您的位置:首页 > 编程语言 > Java开发

Java调用存储过程

2012-07-11 18:05 411 查看
1.例子1:一个简单的存储过程的java调用:有参数无返回值!

<1>.存储过程的写法:

/*写一个简单的存储过程--如插入t_user表中的数据*/
DELIMITER//
CREATEPROCEDUREinsert_test(
INusernameVARCHAR(50),
INaddressVARCHAR(50)
)
BEGIN
INSERTINTOt_user(username,address)VALUES(username,address);
END//
DELIMITER;

/*调用该存储过程*/
CALLinsert_test('ok','chenc');


  

<2>.java调用存储过程:

packagecom.hanchao.test;

importjava.sql.CallableStatement;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;

/**
*java调用存储过程的测试
*@authorhanlw
*2012-07-09
*/
publicclassTestProcedure{

publicstaticvoidmain(String[]args)throwsException{
/**
*为什么要使用存储过程?★
*1.效率高;★
*
*2.★在日程开发的过程中,当我们的SQL语句很复杂时,我们要考虑写
*一个存储过程,以达到优化数据库的过程!!★
*
*3.数据库优化的几个方法:
*①不要连接不需要的表;
*②不要用like等通配符,即使用也要放在最后。
*③存储过程的java调用!!
*/

Class.forName("com.mysql.jdbc.Driver");
Connectioncon=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root");

//★与以前不一样的地方
CallableStatementcs=con.prepareCall("{callinsert_test(?,?)}");
cs.setString(1,"tom");
cs.setString(2,"America");

introws=cs.executeUpdate();
if(rows>0){
System.out.println("thankyou!");
}else{
System.out.println("goodbye!");
}
cs.close();
con.close();
}
}


2.无参数,只有返回结果集。(相当于全查询)

<1>.存储过程的写法:

/*全查询*/
DELIMITER//
CREATEPROCEDUREfind_test()
BEGIN
SELECTid,username,addressFROMt_user;
END//
DELIMITER;

/*调用该存储过程*/
CALLfind_test();


<2>.java调用存储过程:

packagecom.hanchao.test;

importjava.sql.CallableStatement;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;

/**
*java调用存储过程
*@authorhanlw
*2012-07-09
*/
publicclassTestProcedure2{

publicstaticvoidmain(String[]args)throwsException{
Class.forName("com.mysql.jdbc.Driver");
Connectioncon=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root");

//★注意:CallableStatement是java.sql.CallableStatement
CallableStatementcs=con.prepareCall("{callfind_test}");
ResultSetrs=cs.executeQuery();

while(rs.next()){
intid=rs.getInt("id");
Stringusername=rs.getString("username");
Stringaddress=rs.getString("address");
System.out.println(id+"\t"+username+"\t"+address);
}
rs.close();
cs.close();
con.close();

/**
*注意:发现没有,这和我们的JDBC的写法几乎没有区别。
*只是把PreparedStatement换成了CallableStatement!!!
*/
}
}


3.有返回值参数的存储过程;(获得刚刚插入数据的ID号)

<1>.存储过程的写法:



/*带返回值参数的存储过程*/
DELIMITER//
CREATEPROCEDUREinsert_getId(
INusernameVARCHAR(20),
INaddressVARCHAR(20),
OUTidINT
)
BEGIN
INSERTINTOt_user(username,address)VALUES(username,address);
SELECTLAST_INSERT_ID()INTOid;
SELECTid;
END//
DELIMITER;

/*调用该存储过程*/
CALLinsert_getId('jack','USA',@id);

/*★比较一下这个存储过程与上面的不同之处!以及调用的不同之处!!★*/

/*带返回值参数的存储过程*/
DELIMITER//
CREATEPROCEDUREinsert_getId12(
INusernameVARCHAR(20),
INaddressVARCHAR(20),
OUTidINT
)
BEGIN
INSERTINTOt_user(username,address)VALUES(username,address);
SELECTLAST_INSERT_ID()INTOid;
#SELECTid;/*★体会一下这一句的不同!*/
END//
DELIMITER;

/*调用该存储过程*/
CALLinsert_getId12('jack1','USA1',@id);
SELECT@id;






<2>.java调用存储过程:

packagecom.hanchao.test;

importjava.sql.CallableStatement;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.Types;

/**
*java调用存储过程
*@authorhanlw
*2012-07-09
*/
publicclassTestProcedure3{

publicstaticvoidmain(String[]args)throwsException{
Class.forName("com.mysql.jdbc.Driver");
Connectioncon=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root");

//★煮一下下面几行
CallableStatementcs=con.prepareCall("{callinsert_getId(?,?,?)}");
cs.setString(1,"hanchao");
cs.setString(2,"Canada");
cs.registerOutParameter(3,Types.INTEGER);//注意这一句的不同之处!!
cs.executeUpdate();//执行

intid=cs.getInt(3);//注意:

System.out.println("刚刚插入的ID为:"+id);
cs.close();
con.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: