一直不知道存储过程是干嘛的,也不知道怎么使用,今天在网上看了资料,并且实践了一下,慢慢琢磨也算懂了一点点皮毛
用的是MySQL,在java中用jdbc使用
package com.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import com.test.util.Util;
public class JdbcCunChuGuoCheng {
public static void main(String[] args) {
JdbcCunChuGuoCheng jdbc=new JdbcCunChuGuoCheng();
//执行返回int类型的存储过程
jdbc.callProcedure();
//执行返回resultset类型的存储过程
jdbc.callProcedure1();
}
/**
* 创建存储过程(查询返回的是int,不是resultset)
*/
public void createProcedure(){
String sql="create procedure demo(in i_id int,out o_count int)"
+" begin"
+" select count(*) into o_count from city where id<i_id;"
+" end;";
this.executeSql(sql, null);
}
/**
* 调用存储过程
*/
public void callProcedure(){
//先创建存储过程(只需要第一次创建)
this.createProcedure();
//再调用
String procedure="{ call demo(?,?)}";
Connection conn=null;
ResultSet rs=null;
CallableStatement cs=null;
PreparedStatement ps=null;
try {
conn=Util.getConn();
cs=conn.prepareCall(procedure);
cs.setInt(1, 10);//设置参数
cs.registerOutParameter(2,Types.INTEGER);//注册传出的参数
cs.executeUpdate();
System.out.println(cs.getInt(2));//2与上面的注册位置2对应
} catch (SQLException e) {
e.printStackTrace();
}finally{
close(rs,ps,conn,cs);
}
}
/**
* 创建存储过程1(查询返回的是resultset)
*/
public void createProcedure1(){
String sql="create procedure demo1(in i_id int)"
+" begin"
+" select * from city where id>i_id;"
+" end;";
this.executeSql(sql, null);
}
/**
* 调用存储过程1
*/
public void callProcedure1(){
//先创建
this.createProcedure1();
//再调用
String procedure1="{call demo1(?)}";
Connection conn=null;
CallableStatement cs=null;
ResultSet rs=null;
try{
conn=Util.getConn();
cs=conn.prepareCall(procedure1);
cs.setInt(1, 10);//设置参数
rs=cs.executeQuery();
while(rs.next()){
System.out.println(rs.getString("name"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
close(rs,null,conn,cs);
}
}
/**
* 查询公用
*/
public void getAllList(String sql,Object...objects){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
conn=Util.getConn();
ps=conn.prepareStatement(sql);
if(null != objects && objects.length>0){
for(int i=0;i<objects.length;i++){
ps.setObject(i+1, objects[i]);
}
}
rs=ps.executeQuery();
while(rs.next()){
System.out.println(rs.getRow());
}
}catch(Exception e){
e.printStackTrace();
}finally{
close(rs,ps,conn,null);
}
}
/**
* 增删改公用
*/
public int executeSql(String sql,Object...objects){
int result=0;
Connection conn=null;
PreparedStatement ps=null;
try{
conn=Util.getConn();
ps=conn.prepareStatement(sql);
if(null != objects && objects.length>0){
for(int i=0;i<objects.length;i++){
ps.setObject(i+1, objects[i]);
}
}
result=ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
close(null,ps,conn,null);
}
return result;
}
/**
* 关闭连接公用
*/
public void close(ResultSet rs,PreparedStatement ps,Connection conn,CallableStatement cs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(cs!=null){
try {
cs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
callProcedure()和callProcedure1()的方法结果如下图:
主要方法也就是createProcedure(),createProcedure1(),callProcedure()和callProcedure1()