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

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

jaguar_orm

来源生成的ORM,支持关系(一对一、一对多、多对多)、预加载、级联、多态关系等。

特性

  • 关系
  • 预加载
  • 级联
    • 级联插入
    • 级联更新
    • 级联删除
  • 迁移
  • 多态关系
  • 复合主键
  • 复合外键

开始使用

声明模型

class User {
  [@PrimaryKey](/user/PrimaryKey)()
  String id;

  String name;

  static const String tableName = '_user';

  String toString() => "User($id, $name)";
}

声明Bean

Bean为模型执行数据库操作。例如,UserBeanUser模型执行操作。Bean的大部分功能将通过源代码生成。

[@GenBean](/user/GenBean)()
class UserBean extends Bean<User> with _UserBean {
  UserBean(Adapter adapter) : super(adapter);
}

生成Bean逻辑

jaguar_orm 使用 source_genjaguar_orm_gen 来从Bean规范生成Bean逻辑。

dev_dependencies 中添加以下依赖:

build_runner:
jaguar_orm_gen:

运行以下命令以生成Bean逻辑:

pub run build_runner build

连接到数据库

我们将使用PostgreSQL进行此教程。PgAdapter 在包 jaguar_query_postgres 中找到。

final PgAdapter _adapter = 
    new PgAdapter('example', username: 'postgres', password: 'dart_jaguar');
await _adapter.connect();

创建Bean实例

Bean内部使用 jaguar_queryAdapter 接口与数据库通信。让我们创建一个 UserBean 实例。

final userBean = new UserBean(_adapter);

删除表

await userBean.drop();

创建表

await userBean.createTable();

插入新记录

await userBean.insert(new User()
    ..id = '1'
    ..name = 'teja');

按主键获取记录

User user = await userBean.find('1');

获取所有记录

List<User> users = await userBean.getAll();

更新记录

User user = await userBean.find('1');
user.name = 'teja hackborn';
await userBean.update(user);

按ID删除

await userBean.remove('1');

删除所有记录

await userBean.removeAll();

示例

一对一示例

class User {
  [@PrimaryKey](/user/PrimaryKey)()
  String id;

  String name;

  [@HasOne](/user/HasOne)(AddressBean)
  Address address;

  static const String tableName = '_user';

  String toString() => "User($id, $name, $address)";
}

class Address {
  [@PrimaryKey](/user/PrimaryKey)()
  String id;

  [@BelongsTo](/user/BelongsTo)(UserBean)
  String userId;

  String street;

  static String tableName = 'address';

  String toString() => "Post($id, $userId, $street)";
}

[@GenBean](/user/GenBean)()
class UserBean extends Bean<User> with _UserBean {
  UserBean(Adapter adapter)
      : addressBean = new AddressBean(adapter),
        super(adapter);

  final AddressBean addressBean;

  Future createTable() {
    final st = Sql
        .create(tableName)
        .addStr('id', primary: true, length: 50)
        .addStr('name', length: 50);
    return execCreateTable(st);
  }
}

[@GenBean](/user/GenBean)()
class AddressBean extends Bean<Address> with _AddressBean {
  AddressBean(Adapter adapter) : super(adapter);

  Future createTable() {
    final st = Sql
        .create(tableName)
        .addStr('id', primary: true, length: 50)
        .addStr('street', length: 150)
        .addStr('user_id', length: 50, foreignTable: '_user', foreignCol: 'id');
    return execCreateTable(st);
  }
}

/// The adapter
PgAdapter _adapter =
    new PgAdapter('postgres://postgres:dart_jaguar@localhost/example');

main() async {
  // Connect to database
  await _adapter.connect();

  // Create beans
  final userBean = new UserBean(_adapter);
  final addressBean = new AddressBean(_adapter);

  // Drop old tables
  await addressBean.drop();
  await userBean.drop();

  // Create new tables
  await userBean.createTable();
  await addressBean.createTable();

  // Cascaded One-To-One insert
  {
    final user = new User()
      ..id = '1'
      ..name = 'Teja'
      ..address = (new Address()
        ..id = '1'
        ..street = 'Stockholm');
    await userBean.insert(user, cascade: true);
  }

  // Fetch One-To-One preloaded
  {
    final user = await userBean.find('1', preload: true);
    print(user);
  }

  // Manual One-To-One insert
  {
    User user = new User()
      ..id = '2'
      ..name = 'Kleak';
    await userBean.insert(user, cascade: true);

    user = await userBean.find('2');

    final address = new Address()
      ..id = '2'
      ..street = 'Stockholm';
    addressBean.associateUser(address, user);
    await addressBean.insert(address);
  }

  // Manual One-To-One preload
  {
    final user = await userBean.find('2');
    print(user);
    user.address = await addressBean.findByUser(user.id);
    print(user);
  }

  // Preload many
  {
    final users = await userBean.getAll();
    print(users);
    await userBean.preloadAll(users);
    print(users);
  }

  // Cascaded One-To-One update
  {
    User user = await userBean.find('1', preload: true);
    user.name = 'Teja Hackborn';
    user.address.street = 'Stockholm, Sweden';
    await userBean.update(user, cascade: true);
  }

  // Fetch One-To-One relationship preloaded
  {
    final user = await userBean.find('1', preload: true);
    print(user);
  }

  // Cascaded removal of One-To-One relation
  await userBean.remove('1', true);

  // Remove addresses belonging to a User
  await addressBean.removeByUser('2');

  exit(0);
}

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

1 回复

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


jaguar_orm 是一个用于 Flutter 的轻量级对象关系映射(ORM)插件,它允许开发者以面向对象的方式与数据库进行交互。jaguar_orm 支持 SQLite 数据库,并提供了简单易用的 API 来定义模型、执行查询和操作数据。

以下是如何使用 jaguar_orm 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  jaguar_orm: ^3.0.0
  sqflite: ^2.0.0+4

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

2. 定义模型

接下来,定义一个模型类并使用 jaguar_orm 的注解来映射数据库表。

import 'package:jaguar_orm/jaguar_orm.dart';
import 'package:jaguar_query_sqflite/jaguar_query_sqflite.dart';

part 'user_model.g.dart'; // 自动生成的文件

@GenBean()
class UserBean extends Bean<User> with _UserBean {
  UserBean(Adapter adapter) : super(adapter);

  factory UserBean.create(SqfliteAdapter adapter) => UserBean(adapter);
}

@Table(name: 'users')
class User {
  @PrimaryKey(auto: true)
  int id;

  @Column()
  String name;

  @Column()
  int age;

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

  @override
  String toString() => 'User(id: $id, name: $name, age: $age)';
}

3. 生成代码

使用 jaguar_orm 提供的代码生成工具生成 _UserBean 类。

在终端中运行以下命令:

flutter pub run build_runner build

这将生成 user_model.g.dart 文件,其中包含了 _UserBean 类的实现。

4. 初始化数据库

在你的应用程序中初始化数据库,并创建表。

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

Future<void> main() async {
  // 初始化数据库
  final databasePath = join(await getDatabasesPath(), 'my_database.db');
  final database = await openDatabase(databasePath, version: 1);

  // 创建 SqfliteAdapter
  final adapter = SqfliteAdapter(database);

  // 创建 UserBean
  final userBean = UserBean.create(adapter);

  // 创建表
  await userBean.createTable();

  // 插入数据
  final user = User(name: 'John Doe', age: 30);
  await userBean.insert(user);

  // 查询数据
  final users = await userBean.getAll();
  print(users);

  // 关闭数据库
  await database.close();
}

5. 执行 CRUD 操作

你可以使用 UserBean 类来执行各种 CRUD 操作,例如插入、查询、更新和删除数据。

// 插入数据
final user = User(name: 'Jane Doe', age: 25);
await userBean.insert(user);

// 查询数据
final users = await userBean.getAll();
print(users);

// 更新数据
user.age = 26;
await userBean.update(user);

// 删除数据
await userBean.delete(user.id);

6. 关闭数据库

在使用完数据库后,记得关闭它以释放资源。

await database.close();
回到顶部