Flutter查询构建器插件fluent_query_builder的使用

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

Flutter查询构建器插件fluent_query_builder的使用

简介

fluent_query_builder 是一个 Dart 库,允许你以流畅的方式在 PostgreSQL 和 MySQL 数据库中执行 SQL 查询。这个库实现了连接池,并且支持大多数 SQL 语句和子句。未来还将支持无需反射和代码生成的简单一致的 ORM。

使用方法

连接数据库

首先,你需要定义数据库连接信息。以下是一个 PostgreSQL 和 MySQL 的连接示例:

import 'package:fluent_query_builder/fluent_query_builder.dart';

void main() async {
  // PostgreSQL 连接信息
  final pgsqlCom = DBConnectionInfo(
    host: 'localhost',
    database: 'banco_teste',
    driver: ConnectionDriver.pgsql,
    port: 5432,
    username: 'user',
    password: 'pass',
    charset: 'utf8',
    schemes: ['public'],
  );

  // MySQL 连接信息
  final mysqlCom = DBConnectionInfo(
    host: 'localhost',
    database: 'banco_teste',
    driver: ConnectionDriver.mysql,
    port: 3306,
    username: 'user',
    password: 'pass',
    charset: 'utf8',
  );

  // 连接到 MySQL 数据库
  await DbLayer().connect(mysqlCom).then((db) {
    // 执行查询
    // ...
  });

  // 连接到 PostgreSQL 数据库
  await DbLayer().connect(pgsqlCom).then((db) {
    // 执行查询
    // ...
  });
}

插入数据

MySQL 插入数据

await DbLayer().connect(mysqlCom).then((db) {
  // 插入数据
  db
      .insert()
      .into('pessoas')
      .set('nome', 'Isaque Neves Sant\'Ana')
      .set('telefone', '(22) 2771-6265')
      .exec()
      .then((result) => print('mysql insert $result'));
});

PostgreSQL 插入数据

await DbLayer().connect(pgsqlCom).then((db) {
  // 插入数据
  db
      .insert()
      .into('usuarios')
      .set('username', 'isaque')
      .set('password', '123456')
      .exec()
      .then((result) => print('pgsql insert $result'));
});

更新数据

MySQL 更新数据

await DbLayer().connect(mysqlCom).then((db) {
  // 更新数据
  db
      .update()
      .table('pessoas')
      .set('nome', 'João')
      .where('id=?', 13)
      .exec()
      .then((result) => print('mysql update $result'));
});

PostgreSQL 更新数据

await DbLayer().connect(pgsqlCom).then((db) {
  // 更新数据
  db
      .update()
      .table('usuarios')
      .set('username', 'isaque')
      .where('id=?', 1)
      .exec()
      .then((result) => print('pgsql update $result'));
});

删除数据

MySQL 删除数据

await DbLayer().connect(mysqlCom).then((db) {
  // 删除数据
  db
      .delete()
      .from('pessoas')
      .where('id=?', 14)
      .exec()
      .then((result) => print('mysql delete $result'));
});

PostgreSQL 删除数据

await DbLayer().connect(pgsqlCom).then((db) {
  // 删除数据
  db
      .delete()
      .from('usuarios')
      .where('id=?', 1)
      .exec()
      .then((result) => print('pgsql delete $result'));
});

查询数据

MySQL 查询数据

await DbLayer().connect(mysqlCom).then((db) {
  // 查询数据
  db
      .select()
      .from('pessoas')
      .whereSafe('nome', 'like', '%Sant\'Ana%')
      .firstAsMap()
      .then((result) => print('mysql select $result'));
});

PostgreSQL 查询数据

await DbLayer().connect(pgsqlCom).then((db) {
  // 查询数据
  db
      .select()
      .from('usuarios')
      .whereSafe('username', 'like', '%isaque%')
      .getAsMap()
      .then((result) => print('pgsql select $result'));
});

原生查询

MySQL 原生查询

await DbLayer().connect(mysqlCom).then((db) {
  // 原生查询
  db
      .raw("SELECT * FROM `pessoas`")
      .firstAsMap()
      .then((result) => print('mysql raw $result'));
});

PostgreSQL 原生查询

await DbLayer().connect(pgsqlCom).then((db) {
  // 原生查询
  db
      .raw("SELECT * FROM usuarios")
      .firstAsMap()
      .then((result) => print('pgsql raw $result'));
});

计数记录

MySQL 计数记录

await DbLayer().connect(mysqlCom).then((db) {
  // 计数记录
  db
      .select()
      .from('pessoas')
      .orWhereSafe('nome', 'like', '%Sant\'Ana%')
      .orWhereSafe('id', '<', 20)
      .count()
      .then((result) => print('mysql count $result'));
});

PostgreSQL 计数记录

await DbLayer().connect(pgsqlCom).then((db) {
  // 计数记录
  db
      .select()
      .from('usuarios')
      .count()
      .then((result) => print('pgsql count $result'));
});

事务处理

PostgreSQL 事务处理

await DbLayer().connect(pgsqlCom).then((db) {
  // 事务处理
  await db.transaction((ctx) async {
    var result = await ctx
        .insert()
        .into('usuarios')
        .set('username', 'isaque')
        .set('password', '123456')
        .exec();
    print('pgsql transaction $result');
  });
});

关联查询

PostgreSQL 关联查询

await DbLayer().connect(pgsqlCom).then((db) {
  // 关联查询
  var data = await db
      .select()
      .from('pessoas')
      .orWhereGroup((query) {
        return query.orWhereSafe('nome', 'ilike', '%5%').orWhereSafe('cpf', 'ilike', '%5%');
      })
      .whereSafe('id', '>', 0)
      .getAsMap();

  data = await db.getRelationFromMaps(data, 'usuarios', 'idPessoa', 'id');

  print('pgsql select \r\n ${jsonEncode(data)}');
});

ORM 示例

定义模型

class Usuario implements FluentModelBase {
  Usuario({this.username});

  Usuario.fromMap(Map<String, dynamic> map) {
    id = map['id'] as int;
    username = map['username'] as String;
    password = map['password'] as String;
    ativo = map['ativo'] as bool;
    idPerfil = map['idPerfil'] as int;
  }

  int id;
  String username;
  String password;
  bool ativo;
  int idPerfil;

  @override
  Map<String, dynamic> toMap() {
    final Map<String, dynamic> data = {};
    if (id != null) {
      data['id'] = id;
    }
    data['username'] = username;
    data['password'] = password;
    data['ativo'] = ativo;
    data['idPerfil'] = idPerfil;
    return data;
  }

  @override
  String get tableName => 'usuarios';
}

使用 ORM

void main() async {
  // 连接设置
  final com = DBConnectionInfo(
    host: '192.168.133.13',
    database: 'sistemas',
    port: 5432,
    username: 'user',
    password: 'pass',
    charset: 'utf8',
    schemes: ['riodasostrasapp'],
  );

  // 连接到数据库并设置模型工厂
  await DbLayer(factories: [
    {Usuario: (x) => Usuario.fromMap(x)}
  ]).connect(com).then((db) {
    // 插入用户
    db.putSingle<Usuario>(Usuario(username: 'jon.doe', password: '123456'));
    // 更新用户
    db.update().where('id=?', 20).updateSingle<Usuario>(Usuario(username: 'jon.doe', password: '987'));
    // 查询用户
    db.select().from(Usuario().tableName).where('id>?', 2).fetchAll<Usuario>().then((result) {
      print(result);
    });
    // 删除用户
    db.delete().deleteSingle<Usuario>(Usuario(id: 20, username: 'jon.doe', password: '123456'));
  });
}

以上是 fluent_query_builder 插件的基本使用方法,包括连接数据库、插入、更新、删除、查询、原生查询、计数记录、事务处理和关联查询等操作。希望这些示例能帮助你更好地理解和使用这个插件。


更多关于Flutter查询构建器插件fluent_query_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter查询构建器插件fluent_query_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用fluent_query_builder插件的示例代码。fluent_query_builder是一个用于构建复杂查询条件的Flutter插件,通常用于过滤和搜索功能。

首先,确保在你的pubspec.yaml文件中添加fluent_query_builder依赖项:

dependencies:
  flutter:
    sdk: flutter
  fluent_query_builder: ^最新版本号  # 替换为当前最新版本号

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

接下来,我们来看一个基本的例子,展示如何使用fluent_query_builder来构建查询条件:

import 'package:flutter/material.dart';
import 'package:fluent_query_builder/fluent_query_builder.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fluent Query Builder Example'),
        ),
        body: QueryBuilderExample(),
      ),
    );
  }
}

class QueryBuilderExample extends StatefulWidget {
  @override
  _QueryBuilderExampleState createState() => _QueryBuilderExampleState();
}

class _QueryBuilderExampleState extends State<QueryBuilderExample> {
  late QueryBuilder<String, dynamic> queryBuilder;

  @override
  void initState() {
    super.initState();
    queryBuilder = QueryBuilder<String, dynamic>()
      ..where('name').isLike('A%')  // 示例条件:name字段以A开头
      ..where('age').isGreaterThan(18)  // 示例条件:age字段大于18
      ..and()  // 逻辑AND
      ..where('city').isEqualTo('New York');  // 示例条件:city字段等于New York
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text('Generated Query:', style: TextStyle(fontWeight: FontWeight.bold)),
          Text(queryBuilder.build().toString()),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: () {
              // 示例:执行查询操作
              // 这里可以调用你的数据获取函数,并将queryBuilder.build()作为参数传递
              print('Executing query: ${queryBuilder.build()}');
            },
            child: Text('Execute Query'),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们:

  1. 初始化了QueryBuilder实例,并添加了几个查询条件。
  2. 使用..where()方法添加单个条件。
  3. 使用..and()方法组合条件,表示逻辑AND。
  4. 使用queryBuilder.build()方法生成最终的查询字符串。

fluent_query_builder插件提供了丰富的API来构建复杂的查询条件,包括逻辑AND (..and())、逻辑OR (..or())、不等于 (..isNotEqualTo())、在范围内 (..isInRange()) 等等。

请注意,queryBuilder.build().toString()只是生成了一个字符串表示形式,用于演示。在实际应用中,你可能需要将这个查询对象传递给后端API或数据库查询函数。

务必查阅fluent_query_builder的官方文档以获取更多信息和高级用法。

回到顶部