Flutter对象关系映射插件orm_plus的使用

Flutter对象关系映射插件orm_plus的使用

orm_plus 是一个为 Dart 设计的高级对象关系映射(ORM)库,旨在简化服务器端开发和数据库管理。它提供了一套强大的功能,以促进服务器的创建和管理、数据库连接以及各种数据操作。支持MySQL和PostgreSQL数据库,使您可以构建高效且可扩展的应用程序,只需最小的努力。

关键特性

orm_plus 提供了一套功能,简化了服务器端编程和数据库交互:

  • 服务器创建与管理:快速设置和配置服务器以处理传入的HTTP请求。
  • 模式定义:使用各种类型和约束定义并强制执行数据结构。
  • 数据库连接:无缝连接到MySQL和PostgreSQL数据库,并使用安全的身份验证。
  • CRUD 操作:简化记录的创建、检索、更新和删除。
  • 高级查询:支持复杂的查询,包括分页、排序和过滤。
  • 关系管理:通过嵌套查询和包含选项轻松处理相关数据。
  • 日志记录:可选的日志记录用于监控SQL查询和调试问题。

安装

要将 orm_plus 集成到您的Dart项目中,请按照以下步骤操作:

添加依赖项

打开您的 pubspec.yaml 文件并在 dependencies 下添加 orm_plus

dependencies:
  orm_plus: ^1.0.0

开始使用

创建服务器

使用 orm_plus 创建服务器涉及实例化 Server 类并配置其监听传入连接。以下是一个基本示例:

import 'package:orm_plus/orm_plus.dart';

void main() {
  // 实例化服务器
  Server server = Server();

  // 开始监听指定端口
  server.listen(
    port: 8080,
    callback: () {
      print("服务器正在监听端口 8080");
    },
  );
}

在这个示例中,服务器在端口8080上监听。您可以根据需要自定义端口号或其他配置。

定义模式

模式定义了数据库表的结构,包括字段、数据类型和约束。以下是如何为用户表定义模式:

Schema userSchema = Schema(
  table: "users",
  fields: {
    "id": {
      "type": DataType.SERIAL(),
      "primaryKey": true,
    },
    "username": {
      "type": DataType.STRING(50),
      "unique": true,
      "allowNull": false,
    },
    "first_name": DataType.STRING(50),
    "last_name": DataType.STRING(50),
    "gender": DataType.STRING(10),
    "email": {
      "type": DataType.STRING(100),
      "unique": true,
      "allowNull": false,
    },
    "verify": {
      "type": DataType.BOOLEAN(),
      "default": "FALSE",
      "allowNull": false,
    }
  },
);

此模式定义了用户表的结构,指定了每个字段的类型和约束。例如,username 是一个必填字段,具有唯一性约束。

连接到数据库

要连接到PostgreSQL或MySQL数据库,您需要使用您的凭据和连接详细信息来配置数据库客户端。以下是针对PostgreSQL的一个示例:

PostgresClient client = PostgresClient(
  host: 'localhost',
  database: 'test',
  userName: 'postgres',
  password: '123456'
);
await client.connect();

将占位符值替换为您实际的数据库主机、数据库名称、用户名和密码。

初始化ORM

一旦定义了模式并建立了数据库连接,您就可以初始化ORM并同步数据库模式:

ORM orm = ORM(client: client, schemas: [userSchema], logging: true);
await orm.sync(syncTable: true);

这段代码使用数据库客户端和模式初始化ORM,并将模式与数据库同步。syncTable 参数确保现有表根据需要进行更新或重新创建。

注册路由并执行CRUD操作

使用 orm_plus,您可以轻松设置路由以处理不同类型的HTTP请求。以下是一些执行各种CRUD操作的示例。

插入新记录

处理用于插入新记录的POST请求:

userRouter.post("/insert", (req, res) async {
  var data = await orm.insert(
    table: "users",
    returning: true,
    data: {
      "username": "test",
      "first_name": "Test",
      "last_name": "User",
      "email": "test@mailinator.com",
      "gender": "male",
      "verify": false,
    },
  );
  return res.json({'data': data});
});

此路由将新的用户记录插入到 users 表中,并返回插入的数据。

删除记录

处理用于删除记录的DELETE请求:

userRouter.delete("/delete", (req, res) async {
  var data = await orm.delete(
    table: "users",
    returning: true,
    where: {'id': 1}
  );
  return res.json({'data': data});
});

此路由删除具有指定ID的用户记录,并返回删除的结果。

更新现有记录

处理用于更新现有记录的PATCH请求:

userRouter.patch("/update", (req, res) async {
  var data = await orm.update(
    table: "users",
    returning: true,
    data: {'verify': true}
  );
  return res.json({'data': data});
});

此路由更新用户记录的 verify 字段,并返回更新的数据。

获取记录

处理用于检索所有记录的GET请求:

userRouter.get("/all", (req, res) async {
  var data = await orm.findAll(table: "users");
  return res.json({'data': data});
});

此路由从 users 表中检索所有用户记录,并将其返回在响应中。

高级查询能力

orm_plus 提供了一系列高级查询功能以满足复杂的检索需求。

计数记录

计算表中的记录数量:

var data = await orm.count(table: "users");

此查询返回 users 表中的总记录数。

获取特定字段

仅检索表中的特定字段:

var data = await orm.findAll(
  table: "users",
  fields: ['id', 'first_name', 'last_name']
);

此查询仅从 users 表中检索 idfirst_namelast_name 字段。

分页和排序

对查询应用分页和排序:

var data = await orm.findAncCountAll(
  table: "users",
  limit: 10,
  offset: 0,
  order: {'id': false}
);

此查询按ID降序检索记录,并分页(每页10条记录)。

过滤结果

对查询应用过滤器:

var data = await orm.findAncCountAll(
  table: "users",
  where: {
    Op.lte: {'id': 10},
    'gender': 'male'
  }
);

此查询过滤记录,仅包括 id 小于等于10且 gender 等于 male 的记录。

包含相关表

在查询中包含相关表:

var data = await orm.findAncCountAll(
  table: "users",
  include: [{'table': 'address'}]
);

此查询包含 users 表相关的 address 表中的数据。

性能考虑因素

在处理大量数据集时,请考虑以下提示以优化性能:

  • 索引:确保您的数据库表在经常查询的字段上有适当的索引,以加快搜索操作。
  • 分页:使用分页限制单个查询检索的数据量,提高性能并减少内存使用。
  • 查询优化:分析并优化您的SQL查询,以确保它们高效执行。
  • 连接池:使用连接池有效地管理数据库连接,减少建立新连接的开销。

完整示例

以下是完整的示例代码:

import 'package:orm_plus/orm_plus.dart';

const bool sync = false;
const int port = 5555;

void main() async {
  try {
    Server server = Server();

    PostgresClient client = PostgresClient(
      host: 'localhost',
      database: 'test',
      userName: 'postgres',
      password: "Dharmesh@123"
    );
    await client.connect();
    ORM orm = ORM(client: client, schemas: [userSchema], logging: true);
    await orm.sync(syncTable: sync);

    Router userRouter = Router(endPoint: '/users');

    userRouter.post("/insert", (req, res) async {
      var data = await orm.insert(
        table: "users",
        returning: true,
        data: {
          "username": "test",
          "first_name": "Test",
          "last_name": "User",
          "email": "test@mailinator.com",
          "gender": "male",
          "verify": false,
        },
      );
      return res.json({'data': data});
    });

    userRouter.delete("/delete", (req, res) async {
      var data = await orm.delete(
        table: "users",
        returning: true,
        where: {'id': 1}
      );
      return res.json({'data': data});
    });

    userRouter.patch("/update", (req, res) async {
      var data = await orm.update(
        table: "users",
        returning: true,
        data: {'verify': true}
      );
      return res.json({'data': data});
    });

    userRouter.get("/all", (req, res) async {
      var data = await orm.findAll(table: "users");
      return res.json({'data': data});
    });

    server.registerRouters([userRouter]);

    server.get("/", (req, res) async {
      return res.write("服务器正在运行。");
    });

    server.onError((error, res) {
      res.json({'error': error.toString()});
    });

    server.listen(
      port: port,
      callback: () {
        print("服务器正在监听端口 $port");
      },
    );
  } catch (e) {
    print("异常: ${e.toString()}");
  }
}

Schema userSchema = Schema(
  table: "users",
  fields: {
    "id": {
      "type": DataType.SERIAL(),
      "primaryKey": true,
    },
    "username": {
      "type": DataType.STRING(50),
      "unique": true,
      "allowNull": false,
    },
    "first_name": DataType.STRING(50),
    "last_name": DataType.STRING(50),
    "gender": DataType.STRING(10),
    "email": {
      "type": DataType.STRING(100),
      "unique": true,
      "allowNull": false,
    },
    "verify": {
      "type": DataType.BOOLEAN(),
      "default": "FALSE",
      "allowNull": false,
    }
  },
);

更多关于Flutter对象关系映射插件orm_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter对象关系映射插件orm_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


orm_plus 是一个用于 Flutter 的对象关系映射(ORM)插件,它可以帮助开发者更方便地在 Flutter 应用中进行数据库操作。orm_plus 基于 sqflite 插件,提供了更高层次的抽象,使得开发者可以通过 Dart 类来操作数据库,而不需要直接编写 SQL 语句。

以下是如何使用 orm_plus 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  orm_plus: ^1.0.0

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

2. 定义数据模型

你需要定义一个 Dart 类来表示数据库中的表。例如,假设你有一个 User 表:

import 'package:orm_plus/orm_plus.dart';

@Entity()
class User {
  @PrimaryKey(autoGenerate: true)
  int? id;

  String name;
  int age;

  User({this.id, required this.name, required this.age});
}

3. 初始化数据库

在使用 orm_plus 之前,你需要初始化数据库并注册你的数据模型:

import 'package:sqflite/sqflite.dart';
import 'package:orm_plus/orm_plus.dart';
import 'package:path/path.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 打开数据库
  final database = await openDatabase(
    join(await getDatabasesPath(), 'app_database.db'),
    onCreate: (db, version) {
      return db.execute(
        'CREATE TABLE User(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)',
      );
    },
    version: 1,
  );

  // 初始化 orm_plus
  OrmPlus.init(database);

  // 注册模型
  OrmPlus.registerModel(User);

  runApp(MyApp());
}

4. 插入数据

你可以使用 OrmPlus 来插入数据:

final user = User(name: 'John Doe', age: 30);
await OrmPlus.insert(user);

5. 查询数据

你可以使用 OrmPlus 来查询数据:

final users = await OrmPlus.getAll<User>();
users.forEach((user) {
  print('User: ${user.name}, Age: ${user.age}');
});

6. 更新数据

你可以使用 OrmPlus 来更新数据:

final user = await OrmPlus.getById<User>(1);
if (user != null) {
  user.age = 31;
  await OrmPlus.update(user);
}

7. 删除数据

你可以使用 OrmPlus 来删除数据:

await OrmPlus.deleteById<User>(1);

8. 关闭数据库

在应用退出时,记得关闭数据库:

await OrmPlus.close();
回到顶部