MySQL預存程序以及在Java中的程式調用

來源:互聯網
上載者:User

MySQL預存程序以及在Java中的程式調用

預存程序是一種儲存在資料庫中的程式(就像正規語言裡的子程式一樣),準確的來說,MySQL支援的“routines(常式)”有兩種:一是我們說的預存程序, 二是在其他SQL語句中可以傳回值的函數(使用起來和Mysql預裝載的函數一樣,如pi())。本文是為初學習MySQL預存程序的朋友寫的,在本文中我們以在MySQL的CLI(command line interface)中建立一個預存程序的樣本開始,然後通過在Java程式中調用我們建立好的預存程序,讓讀者對MySQL的預存程序有個大概的瞭解和入門。

MySQL預存程序及Java中預存程序的調用 

一、建立MySQL預存程序樣本

下面是具體的建立過程:

--啟動MySQL服務
C:/Documents and Settings/Zengming Zhang>net start mysql

MySQL 服務已經啟動成功。

--登入MySQL控制台
C:/Documents and Settings/Zengming Zhang>mysql -u root -p
Enter password: **********
Welcome to the MySQL monitor.  Commands end with ; or /g.
Your MySQL connection id is 1 to server version: 5.0.18-nt

Type 'help;' or '/h' for help. Type '/c' to clear the buffer.

--選擇資料庫
mysql> use test;
Database changed

--建立樣本用表
mysql> create table zzm(
    -> id int primary key auto_increment,
    -> name varchar(10)
    -> );
Query OK, 0 rows affected (0.20 sec)
mysql> insert into zzm(name) values('zhang');
Query OK, 1 row affected (0.08 sec)

mysql> insert into zzm(name) values('zeng');
Query OK, 1 row affected (0.05 sec)

mysql> insert into zzm(name) values('ming');
Query OK, 1 row affected (0.05 sec)

mysql> select * from zzm;
+----+-------+
| id | name  |
+----+-------+
|  1 | zhang |
|  2 | zeng  |
|  3 | ming  |
+----+-------+
3 rows in set (0.00 sec)

--更改命令結束符(因為在procedure中經常要用到預設的命令結束符--分號(;)
--所以在建立procedure的時候需要定義新的結束符以說明建立procedure的命令結束)
--這裡將結束符號改成貨幣符號--$
mysql> delimiter $

--建立預存程序p3
--此預存程序的過程名是p3,該過程包含兩個參數,
--一個是輸入類型的(以IN標示),參數名是nameid,類型是int,
--一個是輸出類型的(以OUT標示),參數名是person_name,類型是varchar(10)
--此預存程序的作用是查詢出zzm表的全部內容,會輸出結果集(data set),然後
--再查詢表中記錄的ID是nameid的欄位name,將其輸出到第二個輸出類型的參數裡面,這個查詢
--不會輸出結果集。
mysql> create procedure p3(IN nameid int, OUT person_name varchar(10))
    -> begin
    -> select * from test.zzm;
    -> select zzm.name into person_name from test.zzm where zzm.id = nameid;
    -> end
    -> $
Query OK, 0 rows affected (0.00 sec)

--建立完成,查看資料庫中所有已經建立的預存程序
mysql> show procedure status $
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
| Db  | Name | Type      | Definer        | Modified            | Created            | Security_type | Comment |
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
| test | p3  | PROCEDURE | root@localhost | 2009-08-18 16:40:21 | 2009-08-18 16:40:21 | DEFINER      |        |
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
1 row in set (0.02 sec)

--調用預存程序
mysql> call p3(3,@name) $
+----+-------+
| id | name  |
+----+-------+
|  1 | zhang |
|  2 | zeng  |
|  3 | ming  |
+----+-------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @name $
+-------+
| @name |
+-------+
| ming  |
+-------+
1 row in set (0.00 sec)

二、在Java程式中調用預存程序的程式樣本

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

public class Main {

 public static void main(String[] args) {
  /* JDBC串連MySQL資料庫的參數 */
  String driverName = "com.mysql.jdbc.Driver";
  String userName = "root";
  String userPasswd = "nicegiving";
  String dbName = "test";
  String url = "jdbc:mysql://localhost/" + dbName + "?user=" + userName
    + "&password=" + userPasswd;
  Connection connection = null;
  CallableStatement stmt = null;
 
  try {
  // 載入資料庫驅動程式
  Class.forName(driverName).newInstance();
  // 串連資料庫
  connection = DriverManager.getConnection(url);
  // 調用預存程序,此預存程序有2個參數
  stmt = connection.prepareCall("{call p3(?,?)}");
  // 第一個參數是輸入的,在此設定第一個參數的值:將第一個參數設定成整數值3
  stmt.setInt(1, 3);
  // 第二個參數是輸出的,在此設定第二個參數的輸出類型為VARCHAR
  stmt.registerOutParameter(2, Types.VARCHAR);
  // 執行預存程序
  boolean hadResults = stmt.execute();
 
  // 如果有查詢語句的話,此執行過程會返回結果集,在此處理結果集裡面的東西
  System.out.println("Data from table:");
  while (hadResults) {
    ResultSet rs = stmt.getResultSet();
    while(rs.next()){
    String id = rs.getString(1);
    String name = rs.getString(2);
    System.out.println("ID = "+id+"/tName = " + name);
    }
    hadResults = stmt.getMoreResults();
  }
 
  // 擷取預存程序的傳回值
  System.out.println("/nData from procedure:");
  String name = stmt.getString(2); // 獲得第二個參數,因為第二個參數是輸出類型的
  System.out.println("Name = " + name);
  } catch (Exception e) {
  System.out.println(e.toString());
  } finally {
  try {
    stmt.close();
    connection.close();
  } catch (Exception ex) {
    System.out.println(ex.getMessage());
  }
  }
 }

}

--程式執行結果--
Data from table:
ID = 1 Name = zhang
ID = 2 Name = zeng
ID = 3 Name = ming

Data from procedure:
Name = ming

三、總結

本文中給出最基本的MySQL預存程序的建立以及在Java程式的調用的樣本,目的是建立讀者對MySQL預存程序以及在程式中使用的大概瞭解和入門,希望可以對您有所協助。讀者可以參考其他的專業書籍對MySQL預存程序進行深入的探討,本人也會在後續的文章中發表這方面的最新學習成果和大家討論。

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.