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为模型执行数据库操作。例如,UserBean为User模型执行操作。Bean的大部分功能将通过源代码生成。
[@GenBean](/user/GenBean)()
class UserBean extends Bean<User> with _UserBean {
UserBean(Adapter adapter) : super(adapter);
}
生成Bean逻辑
jaguar_orm 使用 source_gen 和 jaguar_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_query 的 Adapter 接口与数据库通信。让我们创建一个 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
更多关于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_orm 和 sqflite 的依赖:
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();

