表示java驱动程序接口,新葡京32450网址Ms sql创建存储过程

发布时间:2020-01-20  栏目:新葡京32450网址  评论:0 Comments

Ms sql创建存储过程

1.加载驱动类

jdbc中的Statement对象和Preparedstatement对象的区别,以及通过jdbc操作调用存储过程,preparedstatement

一、

java.sql.*   和  javax.sql.*的包的类结构

 

                            |- Driver接口:
表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。

                                     |- connect(url, properties): 
连接数据库的方法。

                                                        url:
连接数据库的URL

                                                                
URL语法: jdbc协议:数据库子协议://主机:端口/数据库

                                                                 user:
数据库的用户名

                                                                
password: 数据库用户密码

                            |- DriverManager类:
驱动管理器类,用于管理所有注册的驱动程序

                                     |-registerDriver(driver)  :
注册驱动类对象

                                     |-Connection
getConnection(url,user,password);  获取连接对象

 

                            |- Connection接口:
表示java程序和数据库的连接对象。

                                               |- Statement
createStatement() : 创建Statement对象

                                               |- PreparedStatement
prepareStatement(String sql)  创建PreparedStatement对象

                                               |- CallableStatement
prepareCall(String sql) 创建CallableStatement对象

 

                            |- Statement接口: 用于执行静态的sql语句

                                               |- int
executeUpdate(String sql)  : 执行静态的更新sql语句(DDL,DML)

                                               |- ResultSet
executeQuery(String sql)  :执行的静态的查询sql语句(DQL)

 

                                    
|-PreparedStatement接口:用于执行预编译sql语句

                                                        |- int
executeUpdate() : 执行预编译的更新sql语句(DDL,DML)

                                                        |-ResultSet
executeQuery()  : 执行预编译的查询sql语句(DQL)

 

                                              
|-CallableStatement接口:用于执行存储过程的sql语句(call xxx)

                                                                
|-ResultSet executeQuery()  : 调用存储过程的方法

 

 

                            |- ResultSet接口:用于封装查询出来的数据

                                               |- boolean next() :
将光标移动到下一行

                                               |-getXX() : 获取列的值

Statemetent对象执行的是静态SQL语句,而PreparedStatement对象执行的是预编译SQL语句,如上图,Statement对象执行executeUpdate(String
sql)和executeQuery(String sql),而PreparedStatement
对象执行的是无参的executeUpdate()和executeQuery(),从这两个方法可以看出这两个对象的特点,正因为如此,PreparedStatement可以预防SQL语句注入,更安全,当然它的效率也更高一些。

二、通过jdbc代码调用存储过程

代码如下

              

package com.a_callrablestatement;

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

import org.junit.Test;

import com.util.DBUtil;

public class Demo1 {

public Connection conn = null;
public CallableStatement cs = null;
ResultSet rs = null;
String driverClass = “com.microsoft.sqlserver.jdbc.SQLServerDriver”;
String url = “jdbc:sqlserver://localhost:1433;DatabaseName=User”;
String username = “sa”;
String password = “qwer1234”;
String sql = “exec pro_findById ? “;
public Demo1() {
// TODO Auto-generated constructor stub
}
@Test
public void test1()
{

try{
//注册驱动
Class.forName(driverClass);
//连接
conn = DriverManager.getConnection(url,username,password);
//得到prepareCall预编译对象
cs = conn.prepareCall(sql);
//设置问号的占位符
cs.setInt(1,3);

rs = cs.executeQuery();
//打印结果
while(rs.next())
{
int id = rs.getInt(“id”);
String name = rs.getString(“username”);
String password = rs.getString(“password”);
String gender = rs.getString(“gender”);
String interest = rs.getString(“interest”);
System.out.println(id+”,”+name+”,”+password+”,”+gender+”,”+interest);
}
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}catch(SQLException e)
{
e.printStackTrace();
}finally
{
DBUtil.close(conn,rs,cs);
}
}

@Test
public void test2()
{
sql =”exec pro_findNameById ?,?”;
try{
//注册驱动
Class.forName(driverClass);
//连接
conn = DriverManager.getConnection(url,username,password);
//得到prepareCall预编译对象
cs = conn.prepareCall(sql);
//设置问号的占位符的参数值
cs.setInt(1,3);
/**
* 1.参数一,表示要设置的参数位置
* 2.参数二,表示要返回的参数值类型 varchar(20)
*/
cs.registerOutParameter(2, Types.VARCHAR);
//执行操作,但不返回结果集,返回值在参数中,这里只能用execute(),不能用executeQuery(),这是在SQL
Server2008中
cs.execute();

/**
* 预编译sql中参数的位置
*/
String name = cs.getString(2);
//打印结果
System.out.println(name);

}catch(ClassNotFoundException e)
{
e.printStackTrace();
}catch(SQLException e)
{
e.printStackTrace();
}finally
{
DBUtil.close(conn,rs,cs);
}
}

}

工具类

package com.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBUtil {

public DBUtil() {
// TODO Auto-generated constructor stub
}
public static void close(Connection conn,ResultSet rs,PreparedStatement
ps )
{
try{
if(conn!=null)
{
conn.close();
}
if(rs!=null)
{
rs.close();
}
if(ps!=null)
{
ps.close();
}
}catch(SQLException e)
{
e.printStackTrace();
throw new RuntimeException(e);
}
}
}

1.test1()方法是调用没有返回值的存储过程

2,test2()方法是调用有返回值的存储过程

在调用有返回值的存储过程时,不能使用executeQuery(),否则会报没有返回结果集的错误新葡京32450网址 1

而改为execute()方法后就可以得到正常的结果

test1()中的存储过程代码

use [User]
go

create procedure pro_findById(@id int)
as
select * from [tb_user] where
[email protected]
go

 

test2()中的存储过程

use [User]
go
create procedure findNameById @id int,@name varchar(20)
as
select @name=username from tb_user where
[email protected]
go

注:SQL server 2008和jdk 1.7 加eclipse ee 4.5

一、 java.sql.* 和 javax.sql.*的包的类结构 |- Dri…

用java调用oracle存储过程总结

//1、call+包名+存储过程名(传入、传出值用?)  
   String str=”{call SMSBUSINESS.deleteZhZMember(?,?,?)}”;
//2、建立连接
 Connection conn=null;
 conn=DriverManager.getConnection();
//3、使用java.sql.*类
 CallableStatement cs=conn.prepareCall(str);
//4、传入in值
 cs.setInt(1,id);
 cs.setInt(2,-2);
//5、设置out值
 cs.registerOutParameter(3,Types.NUMERIC);
//6、执行
 cs.excuse();
//7、取出out值
 int flag=cs.getInt(3);
//8、关连接
 conn.close();

文章引用自:

*********************************************************************************************************************

这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。

一:无返回值的存储过程

存储过程为:

CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN
VARCHAR2) AS

BEGIN

   INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);

END TESTA;

然后呢,在java里调用时就用下面的代码:

package com.hyq.src;

 

import java.sql.*;

import java.sql.ResultSet;

 

public class TestProcedureOne {

 public TestProcedureOne() {

 }

 public static void main(String[] args ){

    String driver = “oracle.jdbc.driver.OracleDriver”;

    String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521: hyq “;

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

    CallableStatement cstmt = null;

 

    try {

      Class.forName(driver);

      conn = DriverManager.getConnection(strUrl, ” hyq “, ” hyq “);

      CallableStatement proc = null; //创建执行存储过程的对象

      proc = conn.prepareCall(“{ call HYQ.TESTA(?,?) }”); //设置存储过程
call为关键字.

      proc.setString(1, “100”); //设置第一个输入参数

      proc.setString(2, “TestOne”);//设置第二个输入参数

      proc.execute();//执行

    }

    catch (SQLException ex2) {

      ex2.printStackTrace();

    }

    catch (Exception ex2) {

      ex2.printStackTrace();

    }

    finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }

      catch (SQLException ex1) {

      }

    }

 }

}

当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。

二:有返回值的存储过程(非列表)

存储过程为:

CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT
VARCHAR2) AS

BEGIN

   SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;

END TESTB;

在java里调用时就用下面的代码:

package com.hyq.src;

 

public class TestProcedureTWO {

 public TestProcedureTWO() {

 }

 public static void main(String[] args ){

    String driver = “oracle.jdbc.driver.OracleDriver”;

    String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521:hyq”;

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

    try {

      Class.forName(driver);

      conn = DriverManager.getConnection(strUrl, ” hyq “, ” hyq “);

      CallableStatement proc = null;

      proc = conn.prepareCall(“{ call HYQ.TESTB(?,?) }”); //设置存储过程

      proc.setString(1, “100”);//设置第一个参数输入参数

      proc.registerOutParameter(2,
Types.VARCHAR);//第二个参数输出参数,是VARCHAR类型的

      proc.execute();//执行

      String testPrint = proc.getString(2);//获得输出参数

      System.out.println(“=testPrint=is=”+testPrint);

    }

    catch (SQLException ex2) {

      ex2.printStackTrace();

    }

    catch (Exception ex2) {

      ex2.printStackTrace();

    }

    finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }

      catch (SQLException ex1) {

      }

    }

 }

}

 

}

注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

三:返回列表

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,

1, 建一个程序包。如下:

CREATE OR REPLACE PACKAGE TESTPACKAGE  AS

 TYPE Test_CURSOR IS REF CURSOR;

end TESTPACKAGE;

2,建立存储过程,存储过程为:

CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out
TESTPACKAGE.Test_CURSOR) IS

BEGIN

    OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;

END TESTC;

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。

在java里调用时就用下面的代码:

package com.hyq.src;

import java.sql.*;

import java.io.OutputStream;

import java.io.Writer;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import oracle.jdbc.driver.*;

 

 

public class TestProcedureTHREE {

 public TestProcedureTHREE() {

 }

 public static void main(String[] args ){

    String driver = “oracle.jdbc.driver.OracleDriver”;

    String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521:hyq”;

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

 

    try {

      Class.forName(driver);

      conn = DriverManager.getConnection(strUrl, “hyq”, “hyq”);

 

      CallableStatement proc = null;

      proc = conn.prepareCall(“{ call hyq.testc(?) }”); //存储过程
hyq包下的

     
proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);//设置输出参数是一个游标.第一个参数,游标类型

      proc.execute();//执行

      rs = (ResultSet)proc.getObject(1);
//获得第一个参数是一个游标,转化成ResultSet类型

 

      while(rs.next()) //获得数据

      {

          System.out.println(“<tr><td>” + rs.getString(1) +
“</td><td>”+rs.getString(2)+”</td></tr>”);

      }

    }

    catch (SQLException ex2) {

      ex2.printStackTrace();

    }

    catch (Exception ex2) {

      ex2.printStackTrace();

    }

    finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }

      catch (SQLException ex1) {

      }

    }

 }

}

在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错的。

package testcase;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.sql.Types;

/**

* 调用有返回值的存储过程

* @author study_monkey

*  数据库新建表

* create table Test_tbl

(

i_id  INTEGER,

i_name VARCHAR2(20)

)

*新建存储过程

* CREATE OR REPLACE PROCEDURE Test_ProduceOut(PARA1 IN
VARCHAR2,PARA2 OUT VARCHAR2) AS

BEGIN

select i_name into PARA2 from TEST_pro where i_id = PARA1;

END Test_ProduceOut;

* @param args

*/

public class TestCallProduceOut {

public TestCallProduceOut() {

}

private static final String
DRIVER=”oracle.jdbc.driver.OracleDriver”;

private static final String
URL=”jdbc:oracle:thin:@127.0.0.1:1521:testdb”;

private String name=”username”;

private static String pwd=”password”;

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

CallableStatement proc = null;

public void callProduce(){

try {

Class.forName(DRIVER);

conn = DriverManager.getConnection(URL,name,pwd);

proc = conn.prepareCall(“{ call Test_ProduceOut(?,?) }”);
//调用存储过程

proc.setString(1, “1”); //第一个输入参数

proc.registerOutParameter(2,
Types.VARCHAR);//第二个参数输出参数,是VARCHAR类型的

proc.execute();//执行

String getOut= proc.getString(2);//获得输出参数

System.out.println(“存储过程返回的值是:”+getOut);

}catch (SQLException ex2) {

ex2.printStackTrace();

}

catch (Exception ex2) {

ex2.printStackTrace();

}

finally{

try {

if(rs != null){

rs.close();

if(stmt!=null){

stmt.close();

}

if(conn!=null){

conn.close();

}

}

}

catch (SQLException ex1) {

}

}

}

public static void main(String[] args) {

TestCallProduceOut test = new TestCallProduceOut();

test.callProduce();

}

}

create proc insert_dept(

        Class.forName(“com.mysql.jdbc.Driver”)//针对mysql数据库

@name_1 char(4)

2.创建数据库连接

)

        DriverManager.getConnection(url,username,password);

as

        getConnection有不同参数方法,这里最常用的是我列举的这种

insert into dept(name)

            url格式:

values(@name_1)

                 MYSQL_URL:Jdbc::mysql://localhost:3306/qingke

Go

                 Oracle URL:Jdbc:oracle:thin:@localhost:1521:qingke

存储过程的调用

3.创建Statement

exec insert_dept ‘马上’

          Statement(静态SQL):connection.createStatement();

JDBC调用无参数的存储过程

          PreparedStatement(动态SQL):connection.prepareStatement();

Connection con = null;

          CallableStatement(数据库存储过程):connection.prepareCall();

try {

4.执行SQL

//加载数据库驱动

         
executeQuery:返回ResultSet(),执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象

Class.forName(“oracle.jdbc.driver.OracleDriver”);

          executeUpdate:用于执行INSERT,UPDATE或DELETE语句以及SQL
DDL语句,如CREATE TABLE和DROP TABLE

//获取连接

          
execute:用于执行返回多个结果集,多个更新计数或二者结合的语句。

相关文章

留下评论

网站地图xml地图