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

java调用存储过程------摘抄

2012-12-20 22:42 344 查看
<1>.存储过程的写法:



/*写一个简单的存储过程--如插入t_user表中的数据*/
DELIMITER //
CREATE PROCEDURE insert_test(
IN username VARCHAR(50),
IN address VARCHAR(50)
)
BEGIN
INSERT INTO t_user(username,address) VALUES(username,address);
END //
DELIMITER ;

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




  

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



package com.hanchao.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
* java调用存储过程的测试
* @author hanlw
* 2012-07-09
*/
public class TestProcedure {

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

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

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

int rows = cs.executeUpdate();
if(rows > 0) {
System.out.println("thank you !");
} else {
System.out.println("good bye !");
}
cs.close();
con.close();
}
}




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

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



/*全查询*/
DELIMITER //
CREATE PROCEDURE find_test()
BEGIN
SELECT id,username,address FROM t_user;
END //
DELIMITER ;

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




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



package com.hanchao.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

/**
* java调用存储过程
* @author hanlw
* 2012-07-09
*/
public class TestProcedure2 {

public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root");

//★注意:CallableStatement是java.sql.CallableStatement
CallableStatement cs = con.prepareCall("{call find_test}");
ResultSet rs = cs.executeQuery();

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

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




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

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







/*带返回值参数的存储过程*/
DELIMITER //
CREATE PROCEDURE insert_getId(
IN username VARCHAR(20),
IN address VARCHAR(20),
OUT id INT
)
BEGIN
INSERT INTO t_user(username,address) VALUES(username,address);
SELECT LAST_INSERT_ID() INTO id;
SELECT id;
END //
DELIMITER ;

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

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

/*带返回值参数的存储过程*/
DELIMITER //
CREATE PROCEDURE insert_getId12(
IN username VARCHAR(20),
IN address VARCHAR(20),
OUT id INT
)
BEGIN
INSERT INTO t_user(username,address) VALUES(username,address);
SELECT LAST_INSERT_ID() INTO id;
#SELECT id;   /*★体会一下这一句的不同!*/
END //
DELIMITER ;

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










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



package com.hanchao.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;

/**
* java调用存储过程
* @author hanlw
* 2012-07-09
*/
public class TestProcedure3 {

public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root");

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

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

System.out.println("刚刚插入的ID为:"+id);
cs.close();
con.close();
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: