IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Linux | IBM Systems | Open source  >

MySQL for Linux on POWER,第 2 部分: 开发应用

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论


级别: 初级

Nikolay V. Yevik (yevik@us.ibm.com), 技术顾问, IBM 

2005 年 5 月 08 日

MySQL 数据库服务器可以运行在基于 IBM® POWER™ 和 PowerPC® 处理器的服务器上的 Linux®(统称为 POWER 上 的 Linux)中,通过此系列文章的第 2 部分(也是最后一部分)了解其可用性。第 2 部分的重点是 使用某些主流编程语言为 MySQL 开发应用程序,比如 PHP、Java™、C/C++、Python 和 Perl。 作为面向在 POWER 上 Linux 中使用 MySQL 的应用程序开发者的一篇简短指南,本文适合那些熟悉自己的系统环境、 网络、媒体设备和磁盘资源的 MySQL 开发者和数据库管理员阅读。

介绍

第 1 部分 介绍了 POWER 上 Linux 中的 MySQL 及相关工具,并涵盖了一些主要的概念,比如创建数据库、填充 数据以及验证参照完整性。

本部分介绍使用主流编程语言(比如 PHP、Java、C/C++、Perl 和 Python)在 POWER 上 Linux 中 开发与 MySQL 通信的应用程序的基本概念。

本部分中的示例基于 第 1 部分 中 所创建的数据库。为了更好地理解本文中描述的示例,请回顾第 1 部分中创建的数据库结构。

所有示例都在 POWER 上 Linux 中编译和运行。不过请注意,这些说明也适用于普通的 Linux。





回页首


使用 PHP 进行 MySQL 开发

本节描述了如何在最常见的情形中使用 PHP 和 MySQL:使用 Apache Web 服务器。

在大部分常见的配置中,您应该在系统中安装以下组件:

  • 包含 PHP 二进制程序的 PHP 文件
  • 用于您的 Apache 版本的 PHP 模块
  • Apache web 服务器
  • 具有 MySQL 访问函数的 PHP 扩展模块

在任何 Linux 发行版本标准安装媒介中,包括 POWER 和 PPC 上的 Linux,通常以 rpm 软件包的形式 附带这些组件。

这里假定您想要创建一个非常简单的基于 web 的应用程序,让您能够向 CONTRACTING 数据库的 EMPLOYEE 表中插入数据,并能从中 导出数据。

图 1 中给出了 HTML 输入表单。


图 1. HTML 数据输入表单

这个 HTML 数据输入表单的动作是调用 PHP 脚本 insert.php,如下所示:

...
<FORM METHOD="POST" ACTION="insert.php">
...

这个表单的主要组件是:文本输入框 "Personal_FirstName" 和 "Personal_LastName", 三个用于输入雇员的 SSN 的文本框,以及具有工作名称和相应分配的工作代码的下拉单选列表,见下面摘录的 代码:

. . .
<SELECT NAME="Job_Title">
<option value="200" selected>Application Programmer</option>
<option value="201">Database Administrator</option>
<option value="202">Technical Support</option>
<option value="203">Database Designer</option>
</SELECT>
. . .

注意:为了重点介绍主要的概念,此示例并没有引入严格的用户数据输入验证和错误处理, 这在生产质量的应用程序中通常是会有的。

当用户点击 Submit Form 按钮时,下面所示的 insert.php 脚本就会在服务器端运行:


清单 1. PHP 代码示例
                
<?
//MySQL server username, password, and database name
$username="username";
$password="password";
$database="CONTRACTING";
//Extracting information from the form
$first_name=$_POST['Personal_FirstName'];
$last_name=$_POST['Personal_LastName'];
$ssn=$_POST['Personal_SSN1'].$_POST['Personal_SSN2'].$_POST['Personal_SSN3'];
$job_id=$_POST['Job_Title'];
echo '<b>', 'Data extracted from the form: ', '</b>', <br>';
echo 'First Name: ', "$first_name", '<br>';
echo 'Last Name: ', "$last_name", '<br>';
echo 'Social Security Number: ', "$ssn", '<br>';
echo 'Job ID: ', "$job_id", '<p>';
//Connecting to the MySQL server
echo '<b>', 'MySQL server connection status: ', '</b>';
$conn=mysql_connect('127.0.0.1',$username,$password);
if (!$conn) {
   die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully', '<p>';
//Changing into the database
echo '<b>', 'Selecting database ', "$database", ' status: ', '</b>';
@mysql_select_db($database) or die( "Unable to select database");
echo 'Successful', '<p>';
//Inserting data into the database
$query = "INSERT INTO EMPLOYEE VALUES ('$ssn','$last_name','$first_name','$job_id')";
echo '<b>', 'SQL query: ', '</b>', "$query", '<p>';
echo '<b>', 'Inserting data status: ', '</b>';
$result=mysql_query($query);
if (!$result) {
   die(mysql_error());
}
echo 'Successful', '<p>';
//Displaying inserted data
$query="SELECT * FROM EMPLOYEE";
$result=mysql_query($query);
if (!$result) {
   die(mysql_error());
}
$num=mysql_numrows($result);
mysql_close($conn);
echo "<b><center>Displaying the EMPLOYEE table contents:</center></b><br><br>";
$i=0;
while ($i < $num) {
$first_name=mysql_result($result,$i,"EMP_FNAME");
$last_name=mysql_result($result,$i,"EMP_LNAME");
$ssn=mysql_result($result,$i,"EMP_SSN");
$job_id=mysql_result($result,$i,"JOB_CODE");
echo "<b>$first_name $last_name</b><br>SSN: $ssn<br>Job ID: $job_id<p>";
$i++;
}
?>

PHP 脚本的输出如 图 2 所示。


图 2. PHP 脚本生成的 HTML 网页

注意,关于雇员 Adam Adams 的最后一个条目已经如预期地插入到 EMPLOYEE 表中。

通过此示例可以看出,使用 PHP、Apache 和 MySQL 创建数据库驱动的 Web 应用程序是多么简单, 在主流的 Linux 发行版本(包括用于 POWER 和 PPC 体系结构的 Linux)中默认都会包含这些组件。





回页首


使用 Java 进行 MySQL 开发

有一类非常广泛的话题:与 MySQL 等关系型数据库通信的基于 Java™ 的多层应用程序。 本节介绍了一个非常简单的示例,使用本地 Java 应用程序连接到 MySQL。

为了让 Java 程序能够与特定的数据库进行通信,您要有一个用于那个数据库的 Java Database Connectivity(JDBC) 驱动程序。与大部分主流的关系数据库管理系统(Relational Database Management Systems,RDBMS)一样,MySQL 也有 其自己的 JDBC 驱动程序,当前包括:

  • 来自 MySQL AB 的 MySQL Connector/J
  • Resin JDBC 驱动程序

MySQL Connector/J 是用于 MySQL RDBMS 的 Sun 的 JDBC 3.0 API 实现,是用于 MySQL 的官方 JDBC 驱动程序。 它是百分之百使用 Java 编写的,因此可以运行于任何具备适当 JVM 环境的操作系统中,包括 POWER 上 Linux 发行版本。 所以,此示例使用的是 Connector/J 驱动程序。它是类型 IV JDBC 驱动程序,已知能够在 POWER 上 Linux 中应用于多种 Web 应用程序服务器,比如 IBM WebSphere、BEA WebLogic、Apache Tomcat、JBoss,还有很多。

当然,除了需要用于 MySQL 的 JDBC 驱动程序以外,您还需要 JDK 本身。撰写本文时,IBM 为用于 POWER 和 PPC 体系结构 的 Linux 所提供的最新版本是 JDK 1.4.2,既有 32-位 的也有 64-位的。可以在线获得针对 Java 技术的 IBM Developer Kits(见 参考资料)。

此示例展示的基本代码将连接到 MySQL 数据库并执行查询。

下面是本示例的完整的 Java 代码:


清单 2. Java 代码示例

                    
import java.io.*;
import java.util.*;
import java.sql.*;
public class Java_MySQL
{
   public static void display_rs(ResultSet rs) throws SQLException
   {
      try{
         ResultSetMetaData rsmd = rs.getMetaData();
         for (int i = 1; i <= rsmd.getColumnCount(); ++i)
            System.out.print("\t\t\t" + (rsmd.getColumnName(i)).toUpperCase() );
            System.out.println();
         while ( rs.next() )
         {
            for (int j = 1; j <= rsmd.getColumnCount(); ++j)
            {
               Object obj = rs.getObject(j);
               System.out.print("\t\t\t" + obj.toString());
            }
            System.out.println();
         }
      }
      catch (SQLException E) {
            System.out.println("SQLException: " + E.getMessage());
            System.out.println("SQLState:     " + E.getSQLState());
            System.out.println("VendorError:  " + E.getErrorCode());
            E.printStackTrace();
            System.exit(1);
      }
   }
   public static void main(String args[])
   {
      Statement statement = null;
      Connection connection = null;
      ResultSet resultset;
      String query, prompt, input;
      int choice = -1;
      try {Class.forName("com.mysql.jdbc.Driver").newInstance();}
      
      catch (Exception E) {
         System.err.println("Unable to load driver.");
         E.printStackTrace();
         System.exit(1);
      }
      try {
         String url="jdbc:mysql://localhost/CONTRACTING";
         String username="username";
         String password="password";
         connection=DriverManager.getConnection(url, username, password);
      }
      catch (SQLException E) {
         System.out.println("SQLException: " + E.getMessage());
         System.out.println("SQLState:     " + E.getSQLState());
         System.out.println("VendorError:  " + E.getErrorCode());
         E.printStackTrace();
         connection=null;
         System.exit(1);
      }
      prompt = "\n\t\t\t1. Show contents of the table JOB\n" +
               "\t\t\t2. Exit\n\n";
      while(true)
      {
         System.out.println(prompt);
         try {
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            input = in.readLine();
            choice = Integer.parseInt(input);
         }
         catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
         }
         try {
            switch (choice)
            {
               case 1:
                  query="SELECT * FROM JOB;";
                  statement = connection.createStatement();
                  resultset = statement.executeQuery(query);
                  display_rs(resultset);
                  break;
               case 2:
                 System.out.println("Bye!");
                 System.exit(0);
              default:
                 System.err.println("Invalid value entered!");
            }
         }
         catch (SQLException E) {
            System.out.println("SQLException: " + E.getMessage());
            System.out.println("SQLState:     " + E.getSQLState());
            System.out.println("VendorError:  " + E.getErrorCode());
            E.printStackTrace();
            connection=null;
            System.exit(1);
         }
      }
   }
}

函数 display_rs() 中有显示 ResultSet 对象的 标准代码。与 MySQL 数据库的连接在 main() 函数中完成。

在 MySQL Connector/J 中实现 java.sql.Driver 的类的名称是 com.mysql.jdbc.Driverorg.gjt.mm.mysql.Driver 类名 可以用于保持与较老版本的向后兼容。

让 JVM 可以使用 Connector/J JDBC 驱动程序的最常见方式是,在 CLASSPATH 变量中 包含 mysql-connector-java-[version]-bin.jar 文件的路径。

下面给出了字符串,接着是通常的 JDBC URL 格式:

String url="jdbc:mysql://localhost/CONTRACTING";

成功地连接到 MySQL 服务器和数据库后,您就可以执行简单的查询,如下:

1. Show contents of the table JOB
2. Exit

选项“1”将显示出查询 “SELECT * FROM JOB”的结果。

JOB_CODE        JOB_NAME                     JOB_HOUR_CHRG
 200             Application Programmer       35.48
 201             Database Administrator       38.50
 202             Technical Support            27.00
 207             Database Designer            49.99

第二个选项将生成 JOB 表的内容,第三个选项将关闭程序。

此示例的编译和运行使用的是 IBM 为用于 POWER 和 PPC 体系结构的 Linux 所提供的 64-位 JDK 1.4.2。





回页首


使用 C 和 C++ 进行 MySQL 开发

在 MySQL 服务器中附带了用于连接 MySQL 的官方 C API。要使用用于 MySQL 的 C API,您的代码必须包含 mysql.h 头文件, 确保您的程序链接到 MySQL 客户机程序库。

也有 C++ API,名为 MySQL++,用于通过 C++ 连接 MySQL。这个 API 是 MySQL 的 C API 的一个 C++ 包装器。 它是依照标准模板库(Standard Template Library,STL)的原理构建的。所以,使用它与使用 STL 组件一样 简单。可以从 Tangentsoft.net 获得 MySQL++;那个 Web 站点还有很多能够编译的示例,可以用来自学这个 API(见 参考资料)。

本节给出了一个示例,介绍如何在 POWER 和 PPC 上的 Linux 中使用用于 MySQL 的官方 C API。

下面是一个简单的代码示例,展示了连接到 MySQL 数据库并从中获取数据所需要的标准函数调用:


清单 3. C 代码示例

                    
#include <stdlib.h>
#include <stdio.h>
#include <mysql.h>
int
main(int argc, char **argv) {
   MYSQL mysql;
   MYSQL_RES *res;
   MYSQL_ROW row;
   unsigned int num_fields;
   unsigned int i;
   char *query="SELECT * FROM JOB";
   /*Initializing MySQL connection*/
   if(mysql_init(&mysql)==NULL) {
      printf("Failed to initate MySQL connection\n");
      exit(1);
   }
   /*Connecting to MySQL server*/
   if (!mysql_real_connect(&mysql,"127.0.0.1","username","password",NULL,0
   ,NULL,0)) {
      printf( "Failed connect to the server: %s\n",
       mysql_error(&mysql));
      exit(1);
   }
   /*Selecting database*/
   if(mysql_select_db(&mysql,"CONTRACTING")!=0)
      printf( "Failed select CONTRACTING: %s\n", mysql_error(&mysql));
   /*Performing SQL query*/
   if(mysql_query(&mysql,query)) {
      printf("MySQL query error: %s\n",mysql_error(&mysql));
      mysql_close(&mysql);
      exit(1);
   }
   res = mysql_store_result(&mysql);
   if (res) {
      num_fields = mysql_num_fields(res);
      while ((row = mysql_fetch_row(res)))
      {
         for(i = 0; i < num_fields; i++) {
            printf("%s\t",  row[i] ? row[i] : "NULL");
         }
         printf("\n");
      }
      mysql_free_result(res);
   }
   else {
      if(mysql_field_count(&mysql) > 0)
      {
         printf( "Error getting records: %s\n", mysql_error(&mysql));
      }
      else {
         printf( "Failed to find any records and caused an error: 
         %s\n", mysql_error(&mysql));
      }
   }
   mysql_close(&mysql);
}

可见,程序的标准结构与先前的示例是相同的:初始化连接、连接到服务器、选择数据库并执行查询、显示结果,最后 关闭数据库连接。

要使用用于 POWER 上 Linux 的 IBM XL C/C++ 编译器进行编译,请执行下面的命令:

xlc -o C_MySQL C_MySQL.c -qarch=auto –O -I/usr/local/mysql/include 
-L/usr/local/mysql/lib -lmysqlclient -lz

使用 GNU C/C++ 编译器编译同样的代码,需要的编译器标记相同,只是要减去 –qarch=auto 选项,如下所示:

g++ -o C_MySQL C_MySQL.c –O -I/usr/local/mysql/include 
-L/usr/local/mysql/lib -lmysqlclient -lz

–qarch=auto 选项指示 IBM XL C/C++ 编译器自动确定主机 POWER 或者 PPC 体系结构,并 为其生成高度优化的代码。

IBM XL C/C++ 编译器可以为 POWER 和 PPC 体系结构生成高度优化的机器代码,相对于使用 GCC 的 C/C++ 编译器所编译的二进制代码,通常会有显著的性能提高。要深入了解用于 POWER 上 Linux 的 IBM XL C/C++ 编译器,请参考 XL C/C++ Advanced Edition for Linux Web 网页(见 参考资料)。

当运行那个编译过的二进制程序时,会执行“SELECT * FROM JOB”查询,并向标准输出打印结果。

200     Application Programmer   35.48
201     Database Administrator   38.50
202     Technical Support        27.00
207     Database Designer        49.99

可见,MySQL 的 C API 相当简单易用。





回页首


使用 Python 进行 MySQL 开发

在用于 POWER 和 PPC 体系结构的 Linux 发行版本中,您也可以使用脚本语言(比如 Python、Perl 和 Ruby)来开发与 MySQL 通信的 应用程序。在用于 POWER 和 PPC 的主流 Linux 中,包含了针对这些语言的 MySQL API 以及运行期环境。

本节介绍了如何使用 Python 开发一个用于 MySQL 的简单示例应用程序。

要在 Linux 中开发用于 MySQL 的 Python 应用程序,您需要至少安装两个组件:

  • Python 解释运行期环境
  • 用于 Python 的 MySQLdb Python-MySQL 数据库服务器接口

在 Red Hat Enterprise Linux(RHEL)和 SUSE LINUX Enterprise Server(SLES)等用于 POWER 体系结构的 Linux 中, 会包含上面的两个组件。

您也可以访问 Python.org 和 Python-MySQL 项目主页来获得最新的 Python 环境(见 参考资料)。

下面的示例展示了一个简单的 Python 应用程序。


清单 4. Python 代码示例
                
#! /usr/bin/python
# import MySQL module
import MySQLdb
# connect to the database
db = MySQLdb.connect(host="127.0.0.1", user="username", 
passwd="password", db="CONTRACTING")
# get a cursor
cursor = db.cursor()
# SQL statement
cursor.execute("SELECT * FROM JOB")
# get the result set
result = cursor.fetchall()
# iterate through the result set
for record in result:
        print record[0] , "\t", record[1], "\t", record[2]

可见,这个示例程序的结构很简单,遵循了先前示例的结构。

假定文件名是 python2mysql.py,则您可以通过执行下面的命令来执行这个程序:

python python2mysql.py

另一种方式,您可以修改 python2mysql.py 的权限,令其可以执行,然后执行它。在这种情况下,必须要 有类似如下的“magic”行:

#! /usr/bin/python

要在运行之前修改权限以使得文件可以执行,运行下面的命令:

chmod 755 python2mysql.py

现在我们就可以如运行 shell 脚本一样运行这个文件:

nik@bluebill:~> ./python2mysql.py
200     Application Programmer  35.48
201     Database Administrator  38.5
202     Technical Support       27.0
207     Database Designer       49.99

要获得关于 Python 的更多资料,请参考 Python 文档项目(见 参考资料)。





回页首


使用 Perl 进行 MySQL 开发

要使用 Perl 开发用于 MySQL 的应用程序,您需要至少拥有下面的组件:

  • Perl 解释运行期环境
  • Perl 数据库接口(Database Interface,DBI)
  • 用于 MySQL 数据库的 Perl 数据库接口

在 RHEL 和 SLES 等主流的 POWER 上 Linux 发行版本的标准发行版本中,包含全部这些组件。

在网络上可以找到最新的 Perl 和 Perl MySQL DBI 发布版本和文档(见 参考资料)。

本节给出了一个简单的示例,执行与前面的 Python 示例相同的功能。

下面的示例连接到 CONTRACTING 数据库,执行查询并显示出结果:


清单 5. Perl 代码示例

                    
#!/usr/bin/perl
use DBI;
# server host information
$host="127.0.0.1";
$port="3306";
#database and user credentials information
$db="CONTRACTING";
$userid="mysql";
$passwd="";
$connectionInfo="DBI:mysql:database=$db;$host:$port";
# connect to the database
$dbconn = DBI->connect($connectionInfo,$userid,$passwd);
# prepare and execute query
$query = "SELECT * FROM JOB ORDER BY JOB_CODE";
$st = $dbconn->prepare($query);
$st->execute();
# assign columns
$st->bind_columns(undef, \$JOB_CODE, \$JOB_NAME, \$JOB_HOUR_CHRG );
# output the result
while($st->fetch()) {
   print "$JOB_CODE\t $JOB_NAME\t $JOB_HOUR_CHRG\n";
}
$st->finish();
# disconnect from the database
$dbconn->disconnect;

与先前的 Python 示例一样,可以在命令行中通过解释器运行这个 Perl 代码:

perl perl2mysql.pl

或者令其可以执行:

chmod 755 per2mysql.pl

并如同运行 shell 脚本一样运行它:

nik@bluebill:~> ./perl2mysql.pl
200      Application Programmer  35.48
201      Database Administrator  38.50
202      Technical Support       27.00
207      Database Designer       49.99

在后面一种情况下,必须要有指向 Perl 二进制程序位置的“magic”行:

#! /usr/bin/perl


要获得关于联合使用 Perl 和 MySQL 的更多资料,请参考 MySQL Perl Web 网页(见 参考资料)。





回页首


结束语

人们普遍认为 MySQL 是当前性能最好的可用开放源代码企业级 Linux 关系数据库服务器之一。IBM 64-位 POWER 平台具备 出众的性能、可靠性和高可用性,能够满足现今客户的所有需求。MySQL RDBMS 具备强健的特性,基于 IBM POWER 处理器的服务 器具备微分区、动态启用和禁用 SMT 的能力,它们联合起来为市场提供了一个最为强大的 Linux 数据库服务器平台。



参考资料



关于作者

Nikolay Yevik 是 IBM eServer Solutions Enablement 团队的一名 Linux 技术顾问,在那里他帮助 ISV 在 IBM pSeries 平台上应用 AIX 和 Linux 应用程序。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

将您的建议发给我们或者通过参加讨论与其他人分享您的想法.




回页首


以下各项是 IBM 公司在美国和/或其他国家的商标:

  • IBM®
  • POWER
  • PowerPC®
  • Open Power
Rational 是 IBM 公司和 Rational 软件公司在美国和/或其他国家的商标。 Java 和所有基于 Java 的商标是 Sun 公司在美国和/或其他国家的商标。 Microsoft、Windows、Windows NT 和 Windows 徽标是微软公司在美国和/或其他国家的商标。 Intel、Intel Inside(徽标)、MMX 和 Pentium 是英特尔公司在美国和/或其他国家的商标。 UNIX 是 The Open Group 在美国和其他国家的注册商标。 Linux 是 Linus Torvalds 在美国和/或其他国家的商标。 SET 和 SET Logo 是 SET Secure Electronic Transaction LLC 拥有的商标。 其他公司、产品或服务名称可能是其他公司的商标或服务标志。 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款