Flutter MySQL服务交互插件pip_services4_mysql的使用

Flutter MySQL服务交互插件pip_services4_mysql的使用

Pip.Services Logo

此模块是Pip.Services多语言微服务工具包的一部分。

该模块包含以下包:

  • Build - 构造组件的标准工厂。
  • Connect - 配置数据库连接的工具。
  • Persistence - 可用于连接集合并执行基本CRUD操作的抽象类。

快速链接

使用

在你的包的pubspec.yaml文件中添加以下依赖:

dependencies:
  pip_services4_mysql: version

现在你可以从命令行安装包:

pub get

开发

开发时需要安装以下前置条件:

  • Dart SDK 3
  • Visual Studio Code 或你选择的其他IDE
  • Docker

安装依赖:

pub get

运行自动化测试:

pub run test

生成API文档:

./docgen.ps1

在提交更改之前,运行docker化的构建和测试:

./build.ps1
./test.ps1
./clear.ps1

联系方式

该模块由以下人员创建和维护:

  • Sergey Seroukhov
  • Danil Prisiazhnyi

完整示例

MySqlConnectionResolver 示例

class Test {
  var connectionResolver = MySqlConnectionResolver();

  [@override](/user/override)
  void configure(ConfigParams config) {
    connectionResolver.configure(config);
    // 其他配置逻辑
  }

  [@override](/user/override)
  void setReferences(IReferences references) {
    connectionResolver.setReferences(references);
    // 设置引用逻辑
  }

  [@override](/user/override)
  Future open(IContext? context) async {
    String uri;
    try {
      uri = await connectionResolver.resolve(context);
    } catch (err) {
      logger.error(context, ApplicationException().wrap(err),
          'Failed to resolve MySql connection');
    }
    // 其他逻辑
  }
}

MySqlConnection 示例

MySqlConnection connection;

var mysqlUri = Platform.environment['MYSQL_URI'];
var mysqlHost = Platform.environment['MYSQL_HOST'] ?? 'localhost';
var mysqlPort = Platform.environment['MYSQL_PORT'] ?? '27017';
var mysqlDatabase = Platform.environment['MYSQL_DB'] ?? 'test';
var mysqlUser = Platform.environment['MYSQL_USER'] ?? 'mysql';
var mysqlPassword = Platform.environment['MYSQL_PASSWORD'] ?? 'mysql';

var dbConfig = ConfigParams.fromTuples([
  'connection.uri',  mysqlUri,
  'connection.host', mysqlHost,
  'connection.port', mysqlPort,
  'connection.database', mysqlDatabase,
  'credential.username', mysqlUser,
  'credential.password', mysqlPassword
]);

connection = MySqlConnection();
connection.configure(dbConfig);

await connection.open(null);

MySqlPersistence 示例

class MyMySqlPersistence extends MySqlPersistence<MyData> {
  MyMySqlPersistence() : base('mydata', null);

  Future<String?> getByName(IContext? context, String name) async {
    var query = "SELECT * FROM " + this.quotedTableName_() + " WHERE id=?";
    var params = [name];
    var res = await client_!.query(query, params);
    if (res.toList().isEmpty)
      this.logger_.trace(context, "Nothing found from %s with name = %s",
          [this.tableName_, name]);
    else
      this.logger_.trace(context, "Retrieved from %s with name = %s",
          [this.tableName_, name]);

    var resValues = res.toList().isNotEmpty ? res.toList()[0].fields : null;
    var item = this.convertToPublic_(resValues);

    return item;
  }

  Future<MyData?> set(IContext? context, MyData item) async {
    if (item == null) {
      return null;
    }

    // 分配唯一ID
    dynamic newItem = item;
    if (newItem.id == null && this.autoGenerateId_) {
      newItem = (newItem as ICloneable).clone();
      newItem.id = IdGenerator.nextLong();
    }

    var row = this.convertFromPublic_(item);
    var columns = this.generateColumns_(row);
    var params = this.generateParameters_(row);
    var setParams = this.generateSetParameters_(row);
    var values = this.generateValues_(row);
    values.addAll(List.from(values));

    var query = "INSERT INTO " +
        this.quotedTableName_() +
        " (" +
        columns +
        ") VALUES (" +
        params +
        ")";
    query += " ON DUPLICATE KEY UPDATE " + setParams;

    var res = await client_!.query(query, values);

    query = "SELECT * FROM " + this.quotedTableName_() + " WHERE id=?";
    res = await client_!.query(query, [item.id]);

    var resValues = res.toList().isNotEmpty ? res.toList()[0].fields : null;
    newItem = this.convertToPublic_(resValues);

    logger_.trace(context, "Set in %s with id = %s",
        [this.quotedTableName_(), newItem.id]);

    return newItem;
  }
}

var persistence = MyMySqlPersistence();
persistence.configure(ConfigParams.fromTuples(["host", "localhost", "port", 27017]));
await persistence.open(null);
var item = await persistence.set(null, MyData());
print(item);

IdentifiableMySqlPersistence 示例

class MyMySqlPersistence extends IdentifiableMySqlPersistence<MyData, String> {
  MyMySqlPersistence() : super('mydata', null);

  [@override](/user/override)
  void defineSchema_() {
    this.clearSchema();
    this.ensureSchema_('CREATE TABLE `' +
        this.tableName_! +
        '` (id VARCHAR(32) PRIMARY KEY, `key` VARCHAR(50), `content` TEXT)');
    this.ensureIndex_(this.tableName_! + '_key', {'key': 1}, {'unique': true});
  }

  [@override](/user/override)
  Future<DataPage<MyData>> getPageByFilter(
      IContext? context, FilterParams? filter, PagingParams? paging) async {
    filter = filter ?? new FilterParams();
    var key = filter.getAsNullableString('key');

    var filterCondition = null;
    if (key != null) {
      filterCondition += "`key`='" + key + "'";
    }

    return super
        .getPageByFilter_(context, filterCondition, paging, null, null);
  }
}

var persistence = MyMySqlPersistence();
persistence
    .configure(ConfigParams.fromTuples(["host", "localhost", "port", 27017]));
await persistence.open(null);
var item = await persistence.create(null, MyData());
var page = await persistence.getPageByFilter(
    null, FilterParams.fromTuples(["key", "ABC"]), null);
print(page.data);
var deleted = await persistence.deleteById(null, '1');

更多关于Flutter MySQL服务交互插件pip_services4_mysql的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter MySQL服务交互插件pip_services4_mysql的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


pip_services4_mysql 是一个用于在 Flutter 应用中与 MySQL 数据库进行交互的插件。它是 Pip.Services 库的一部分,Pip.Services 是一个用于构建微服务架构的跨平台库。pip_services4_mysql 提供了与 MySQL 数据库连接、查询和操作的功能。

安装

首先,你需要在 pubspec.yaml 文件中添加 pip_services4_mysql 依赖:

dependencies:
  pip_services4_mysql: ^1.0.0

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

基本用法

  1. 创建 MySQL 连接

    首先,你需要创建一个 MySQL 连接配置,并初始化 MySqlConnection 对象。

    import 'package:pip_services4_mysql/pip_services4_mysql.dart';
    
    void main() async {
      var config = ConfigParams.fromTuples([
        'connection.host', 'localhost',
        'connection.port', 3306,
        'connection.database', 'testdb',
        'credential.username', 'root',
        'credential.password', 'password'
      ]);
    
      var connection = MySqlConnection();
      connection.configure(config);
    
      await connection.open(null);
    
      print('Connected to MySQL database');
    }
    
  2. 执行查询

    你可以使用 MySqlPersistence 类来执行 SQL 查询。

    import 'package:pip_services4_mysql/pip_services4_mysql.dart';
    
    void main() async {
      var config = ConfigParams.fromTuples([
        'connection.host', 'localhost',
        'connection.port', 3306,
        'connection.database', 'testdb',
        'credential.username', 'root',
        'credential.password', 'password'
      ]);
    
      var persistence = MySqlPersistence();
      persistence.configure(config);
    
      await persistence.open(null);
    
      var result = await persistence.query('SELECT * FROM users');
      print(result);
    
      await persistence.close(null);
    }
    
  3. 执行命令

    你可以使用 MySqlPersistence 类来执行 SQL 命令,如 INSERTUPDATEDELETE 等。

    import 'package:pip_services4_mysql/pip_services4_mysql.dart';
    
    void main() async {
      var config = ConfigParams.fromTuples([
        'connection.host', 'localhost',
        'connection.port', 3306,
        'connection.database', 'testdb',
        'credential.username', 'root',
        'credential.password', 'password'
      ]);
    
      var persistence = MySqlPersistence();
      persistence.configure(config);
    
      await persistence.open(null);
    
      await persistence.execute('INSERT INTO users (name, email) VALUES (?, ?)', ['John Doe', 'john@example.com']);
    
      await persistence.close(null);
    }
    
  4. 关闭连接

    当你完成数据库操作后,记得关闭连接以释放资源。

    await persistence.close(null);
    

高级用法

pip_services4_mysql 还支持更高级的功能,如事务管理、连接池、重试策略等。你可以通过配置参数来启用这些功能。

var config = ConfigParams.fromTuples([
  'connection.host', 'localhost',
  'connection.port', 3306,
  'connection.database', 'testdb',
  'credential.username', 'root',
  'credential.password', 'password',
  'options.connect_timeout', 5000,
  'options.idle_timeout', 30000,
  'options.max_pool_size', 10
]);

错误处理

在处理数据库操作时,建议使用 try-catch 块来捕获和处理可能出现的异常。

try {
  await persistence.open(null);
  var result = await persistence.query('SELECT * FROM users');
  print(result);
} catch (e) {
  print('Error: $e');
} finally {
  await persistence.close(null);
}
回到顶部