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
表中检索 id
、first_name
和 last_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
更多关于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_plus
和 sqflite
的依赖:
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();