Flutter查询构建器插件fluent_query_builder的使用
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
更多关于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'),
),
],
),
);
}
}
在这个示例中,我们:
- 初始化了
QueryBuilder
实例,并添加了几个查询条件。 - 使用
..where()
方法添加单个条件。 - 使用
..and()
方法组合条件,表示逻辑AND。 - 使用
queryBuilder.build()
方法生成最终的查询字符串。
fluent_query_builder
插件提供了丰富的API来构建复杂的查询条件,包括逻辑AND (..and()
)、逻辑OR (..or()
)、不等于 (..isNotEqualTo()
)、在范围内 (..isInRange()
) 等等。
请注意,queryBuilder.build().toString()
只是生成了一个字符串表示形式,用于演示。在实际应用中,你可能需要将这个查询对象传递给后端API或数据库查询函数。
务必查阅fluent_query_builder
的官方文档以获取更多信息和高级用法。