Flutter MySQL数据库连接插件mysql_client_plus的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter MySQL数据库连接插件mysql_client_plus的使用

mysql_client_plus 是一个用Dart编写的原生MySQL客户端,适用于Dart和Flutter项目。它支持与MySQL、Percona Server 5.7/8以及MariaDB 10版本进行交互。以下是关于如何使用 mysql_client_plus 插件的完整示例demo。

1. 创建连接池或单个连接

创建连接池
import 'package:mysql_client_plus/mysql_client.dart';

final pool = MySQLConnectionPool(
  host: '127.0.0.1', // MySQL服务器地址
  port: 3306,        // MySQL端口
  userName: 'your_user', // 数据库用户名
  password: 'your_password', // 数据库密码
  maxConnections: 10, // 最大连接数
  databaseName: 'your_database_name', // 可选参数,指定数据库名称
);
创建单个连接
import 'package:mysql_client_plus/mysql_client.dart';

final conn = await MySQLConnection.createConnection(
  host: "127.0.0.1", // MySQL服务器地址
  port: 3306,        // MySQL端口
  userName: "your_user", // 数据库用户名
  password: "your_password", // 数据库密码
  databaseName: "your_database_name", // 可选参数,指定数据库名称
);

// 实际连接到数据库
await conn.connect();

注意:默认情况下,连接是安全的(使用SSL/TLS)。如果你不想使用SSL连接,可以在创建连接时传递 secure: false 参数。

2. 查询数据库

执行查询
var result = await pool.execute("SELECT * FROM book WHERE id = :id", {"id": 1});
打印查询结果
for (final row in result.rows) {
  print(row.assoc()); // 将每一行作为Map<String, String>打印
}

row.assoc() 返回的是一个 Map<String, String>,表示每一行的数据。你也可以使用 row.colAt(index)row.colByName(columnName) 来获取特定列的值。

获取不同类型的数据
row.colAt(0); // 返回第一列的值,类型为String
row.typedColAt<int>(0); // 返回第一列的值,类型为int

3. 使用预处理语句(Prepared Statements)

准备预处理语句
var stmt = await conn.prepare(
  "INSERT INTO book (author_id, title, price, created_at) VALUES (?, ?, ?, ?)",
);
执行预处理语句
await stmt.execute([null, 'Some book 1', 120, '2022-01-01']);
await stmt.execute([null, 'Some book 2', 10, '2022-01-01']);
释放预处理语句
await stmt.deallocate();

4. 事务处理

你可以使用 transactional() 方法来执行事务操作。如果在事务中发生异常,事务将自动回滚。

await pool.transactional((conn) async {
  await conn.execute("UPDATE book SET price = :price", {"price": 300});
  await conn.execute("UPDATE book_author SET name = :name", {"name": "John Doe"});
});

5. 处理大量结果集

如果你需要处理大量的查询结果,可以使用可迭代的结果集。这允许你逐行处理数据,而不需要一次性加载所有数据到内存中。

var result = await conn.execute("SELECT * FROM book", {}, true); // iterable = true

result.rowsStream.listen((row) {
  print(row.assoc());
});

6. 多语句查询

mysql_client_plus 支持在一个查询中执行多个SQL语句。如果你的查询包含多个语句,结果集中会有一个 next 属性,指向下一个结果集。

final resultSets = await conn.execute(
  "SELECT 1 as val_1_1; SELECT 2 as val_2_1, 3 as val_2_2",
);

assert(resultSets.next != null);

for (final result in resultSets) {
  for (final row in result.rows) {
    print(row.assoc());
  }
}

注意:多语句查询不支持预处理语句和可迭代结果集。

7. 错误处理

mysql_client_plus 抛出三种类型的异常:MySQLServerExceptionMySQLClientExceptionMySQLProtocolException。你可以根据异常类型来决定如何处理错误。

try {
  // 执行查询
  var result = await conn.execute("SELECT * FROM non_existent_table");
} catch (e) {
  if (e is MySQLServerException) {
    print("MySQL服务器返回错误: ${e.message}");
  } else if (e is MySQLClientException) {
    print("客户端错误: ${e.message}");
  } else if (e is MySQLProtocolException) {
    print("协议解析错误: ${e.message}");
  }

  // 检查连接状态
  if (conn.connected) {
    // 连接仍然有效,可以继续使用
  } else {
    // 连接已关闭,需要重新连接
  }
}

8. 完整示例代码

以下是一个完整的示例代码,展示了如何使用 mysql_client_plus 插件连接MySQL数据库并执行各种操作:

import 'package:mysql_client_plus/mysql_client.dart';

Future<void> main(List<String> arguments) async {
  print("Connecting to mysql server...");

  // 创建连接
  final conn = await MySQLConnection.createConnection(
    host: "127.0.0.1", // MySQL服务器地址
    port: 3306,        // MySQL端口
    userName: "your_user", // 数据库用户名
    password: "your_password", // 数据库密码
    databaseName: "your_database_name", // 可选参数,指定数据库名称
  );

  try {
    // 实际连接到数据库
    await conn.connect();
    print("Connected");

    // 更新一些行
    var res = await conn.execute(
      "UPDATE book SET price = :price",
      {"price": 200},
    );
    print("Updated rows: ${res.affectedRows}");

    // 插入一些行
    res = await conn.execute(
      "INSERT INTO book (author_id, title, price, created_at) VALUES (:author, :title, :price, :created)",
      {
        "author": null,
        "title": "New title",
        "price": 200,
        "created": "2022-02-02",
      },
    );
    print("Inserted rows: ${res.affectedRows}");

    // 执行查询
    var result = await conn.execute("SELECT * FROM book");

    // 打印查询结果的一些元数据
    print("Number of columns: ${result.numOfColumns}");
    print("Number of rows: ${result.numOfRows}");
    print("Last insert ID: ${result.lastInsertID}");
    print("Affected rows: ${result.affectedRows}");

    // 打印查询结果
    for (final row in result.rows) {
      print(row.assoc()); // 将每一行作为Map<String, String>打印
    }

  } catch (e) {
    print("Error: $e");
  } finally {
    // 关闭所有连接
    await conn.close();
    print("Connection closed");
  }
}

更多关于Flutter MySQL数据库连接插件mysql_client_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter MySQL数据库连接插件mysql_client_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用mysql_client_plus插件来连接MySQL数据库的示例代码。请注意,直接在Flutter客户端应用中连接MySQL数据库通常不是最佳实践,因为这样做可能会带来安全和性能问题。通常,我们会通过后端服务器(如Node.js, Django, Flask等)来处理数据库交互,而Flutter应用则与后端服务器进行通信。

不过,如果你确实需要在Flutter应用中直接连接MySQL数据库(例如,用于学习或特定需求),可以使用mysql_client_plus插件。以下是一个基本的示例:

  1. 添加依赖: 在你的pubspec.yaml文件中添加mysql_client_plus依赖:

    dependencies:
      flutter:
        sdk: flutter
      mysql_client_plus: ^x.y.z  # 替换为最新版本号
    

    然后运行flutter pub get来安装依赖。

  2. 导入插件: 在你的Dart文件中导入mysql_client_plus

    import 'package:mysql_client_plus/mysql_client_plus.dart';
    
  3. 建立连接并执行查询: 下面是一个示例,展示了如何使用mysql_client_plus连接到MySQL数据库并执行一个简单的查询:

    void main() async {
      // 配置数据库连接参数
      var config = ConnectionConfig(
        host: 'your_database_host',
        port: 3306,  // 默认MySQL端口
        user: 'your_database_user',
        password: 'your_database_password',
        dbName: 'your_database_name'
      );
    
      // 建立连接
      var connection = await MySqlConnection.connect(config);
    
      try {
        // 执行查询
        var result = await connection.query('SELECT * FROM your_table');
    
        // 处理结果
        result.forEach((row) {
          print('Row data: ${row.toMap()}');
        });
      } catch (e) {
        // 处理错误
        print('Error: $e');
      } finally {
        // 关闭连接
        await connection.close();
      }
    }
    

    请注意,这里的your_database_hostyour_database_useryour_database_passwordyour_database_name需要替换为你自己的数据库信息。同样,your_table也需要替换为你要查询的表名。

  4. 注意事项

    • 确保你的MySQL服务器允许从你的Flutter应用所在的设备或服务器进行连接。
    • 在生产环境中,直接在客户端应用中存储数据库凭据是不安全的。考虑使用更安全的方法,如环境变量或后端服务。
    • 考虑到性能和安全性,通常建议通过后端服务来处理数据库交互,而不是直接在客户端应用中处理。

希望这个示例代码能帮助你理解如何在Flutter应用中使用mysql_client_plus插件来连接MySQL数据库。如果你有任何其他问题或需要进一步的帮助,请随时提问。

回到顶部