Flutter MySQL数据库连接插件mysql_client_plus的使用
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
抛出三种类型的异常:MySQLServerException
、MySQLClientException
和 MySQLProtocolException
。你可以根据异常类型来决定如何处理错误。
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
更多关于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
插件。以下是一个基本的示例:
-
添加依赖: 在你的
pubspec.yaml
文件中添加mysql_client_plus
依赖:dependencies: flutter: sdk: flutter mysql_client_plus: ^x.y.z # 替换为最新版本号
然后运行
flutter pub get
来安装依赖。 -
导入插件: 在你的Dart文件中导入
mysql_client_plus
:import 'package:mysql_client_plus/mysql_client_plus.dart';
-
建立连接并执行查询: 下面是一个示例,展示了如何使用
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_host
、your_database_user
、your_database_password
和your_database_name
需要替换为你自己的数据库信息。同样,your_table
也需要替换为你要查询的表名。 -
注意事项:
- 确保你的MySQL服务器允许从你的Flutter应用所在的设备或服务器进行连接。
- 在生产环境中,直接在客户端应用中存储数据库凭据是不安全的。考虑使用更安全的方法,如环境变量或后端服务。
- 考虑到性能和安全性,通常建议通过后端服务来处理数据库交互,而不是直接在客户端应用中处理。
希望这个示例代码能帮助你理解如何在Flutter应用中使用mysql_client_plus
插件来连接MySQL数据库。如果你有任何其他问题或需要进一步的帮助,请随时提问。