多种语言操作MySQL

2022-11-15 21:13:57 浏览数 (1)

本文主要针对于Linux环境讲解,读者如果使用的是Windows,遇到问题可以一起交流。

C语言操作MySQL

mysql.h头文件提供了对MySQL操作的一些API,首先确保当前系统有该头文件,先执行下面命令

代码语言:javascript复制
sudo apt-get install libmysqlclient-dev

一般情况下该头文件路径为/usr/include/mysql/mysql.h,如果该路径下不存在,尝试用find命令全局搜索一下即可,确保该头文件是存在的

直接以代码样例给出常用的操作,其中讲解都在注释中,该程序做了cai_xxx函数的封装

代码语言:javascript复制
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>

#define HOST    "localhost"
#define USER    "root"
#define PASSWD  "mysql"
#define DB_NAME "school"

/**
 * 连接MySQL数据库
 * @param  host: 连接的主机ip  user: 用户名  passwd: 密码   db_name:数据库名
 * @return 成功返回连接指针, 失败返回NULL
 */
MYSQL *cai_connect(char *host, char *user, char *passwd, char *db_name)
{
    // init
    MYSQL *conn;
    if ( !(conn = mysql_init(NULL)) ) {
        printf("init errorn");
        return NULL;
    }

    // connect
    if ( !mysql_real_connect(conn, host, user, passwd, db_name, 0, NULL, 0) ) {
        printf("connect errorn");
        return NULL;
    }

    // 设置字符集编码
    mysql_set_character_set(conn, "utf8");

    return conn;
}

/**
 * 执行sql语句
 * @param  conn: 连接指针  sql: 需要执行的sql语句
 * @return 成功返回结果集, 失败返回NULL
 */
MYSQL_RES *cai_execute(MYSQL *conn, char *sql)
{
    if (mysql_query(conn, sql) != 0) {
        printf("query errorn");
        exit(-1);
    }
    // 执行的select查询语句   mysql_store_result(conn)会返回查询的结果集
    return mysql_store_result(conn);
}

/**
 * 打印结果集
 * @param  result: 结果集指针
 * @return
 */
void cai_show(MYSQL_RES *result)
{
    // 打印表头
    unsigned int field_cnt = mysql_num_fields(result);
    MYSQL_FIELD *fields = mysql_fetch_fields(result);
    for (int i = 0; i < field_cnt; i  ) {
       printf("%st", fields[i].name);
    }
    printf("n---------------------------------------------------------------------n");

    // 遍历数据
    MYSQL_ROW row = NULL;
    while ( row = mysql_fetch_row(result) ) {
        for (int i = 0; i < field_cnt; i  ) {
            printf("%st", row[i] ? row[i] : "NULL");
        }
        printf("n");
    }
}

int main(void)
{
    // 获取连接指针
    MYSQL *conn = cai_connect(HOST, USER, PASSWD, DB_NAME);
    if (!conn) {
        exit(-1);
    }

    // insert
    cai_execute(conn, "insert into students values(0, '王王', 17, 155.00, '女')");

    // delete
    cai_execute(conn, "delete from students where name = '王昭君'");

    // select  获取结果集
    MYSQL_RES *result = cai_execute(conn, "select * from students");
    if (!result) {
        exit(-1);
    }

    // 打印结果集
    cai_show(result);

    // 释放结果集
    mysql_free_result(result);

    // close
    mysql_close(conn);

    return 0;
}

执行以下命令来生成可执行程序

代码语言:javascript复制
gcc test.c `mysql_config --cflags --libs` -o test.o    # 注意: ``是反引号,而不是引号

Java操作MySQL

Java连接MySQL数据库采用的是面向接口编程,其中采用的是JDBC (Java Database Connectivity),即Java数据库驱动

JDBC

JDBC是sun公司定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

代码编写大致过程如下:

1.导入驱动jar包

2.注册驱动

3.获取数据库连接对象

4.获取执行sql语句的对象

5.执行sql, 接受返回结果并处理

6.释放资源

首先导入MySQL驱动jar包

以IDEA为例, 在工程目录下新建libs目录,复制mysql-connector-java-5.1.37-bin.jar到libs目录下

别忘了在libs上右键,单击Add as Library...将其作为库添加到工程中

样例代码如下

代码语言:javascript复制
package cn.caiyifan.jdbc;

import java.sql.*;

public class jdbc {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stat = null;
        try {
            // 1.注册驱动
            //DriverManager.registerDriver(new Driver());
            // 注册驱动最好的方法是利用反射
            Class.forName("com.mysql.jdbc.Driver");

            // 2.获得数据库连接
            String url = "jdbc:mysql://localhost:3306/school";
            String user = "root";
            String pwd = "mysql";
            // DriverManager驱动
            conn = DriverManager.getConnection(url, user, pwd);
            //System.out.println(conn);

            // 3.获得语句执行平台,通过数据库连接对象获取到sql语句的执行者对象
            stat = conn.createStatement();

            // 4.执行sql语句 通过执行者对象调用方法来执行sql语句
            // executeUpdate方法只能执行insert delete update sql语句
            // 返回值int,表示成功操作数据表的行数
            String sql = "insert ";
            stat.executeUpdate(sql);

            sql = "select * from students";
            ResultSet rs = stat.executeQuery(sql);

            while (rs.next()) {
                String res = rs.getInt("id")   " "   rs.getString("name")   " "  
                        rs.getInt("age")   " "   rs.getFloat("height")   " "   rs.getString("gender");

                System.out.println(res);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 5.释放资源
            if (stat != null) {
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Python操作MySQL

python操作mysql使用的是PyMYSQL模块,本文以python3为例讲解,首先确保已经安装了PyMYSQL模块

代码语言:javascript复制
sudo pip3 install PyMYSQL

python操作MySQL,相对而言比较简洁,而且默认开启了事务

python用PyMYSQL模块操作MySQL代码样例

代码语言:javascript复制
from pymysql import *

def main():
    # 创建connection对象
    conn = connect(host='localhost', port=3306, database='school', user='root', password='mysql',charset='utf8')
    # 获得cursor对象
    cs = conn.cursor()

    # cs.execute用来执行sql语句, 并返回受影响的行数

    # insert
    count = cs.execute("insert into students values(0, '王王', 17, 155.00, '女')")

    # delete
    count = cs.execute("delete from students where age = '王王'")

    # update
    count = cs.execute("update students set age=17 where name='小乔'")

    # 提交之前的操作,如果之前已经之执行过多次的execute,那么就都进行提交
    # 增删改操作真正生效需要进行提交 (python操作数据库默认开启了事务)
    conn.commit()

    # select
    count = cs.execute('select * from students');

    # cs.fetchone() 返回的是一个元组,取出的是一条记录
    # cs.fetchall() 返回的是一个元组,取出的是所有记录,元组的每一个元素也是元组, 表示一条记录
    result = cs.fetchall()
    for r in result:
        print(r)

    # 关闭cursor对象
    cs.close()
    # 关闭connection对象
    conn.close()


if __name__ == '__main__':
    main()

上文还未完善, 还有其他语言待加上,笔者正在偷懒中emmm~

本文作者: Ifan Tsai  (菜菜)

本文链接: https://cloud.tencent.com/developer/article/2164572

版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!

0 人点赞