delphi三层架构简单实例源码

在软件开发中,使用三层架构可以更好地管理我们的代码,将业务逻辑和数据访问分开,使得程序易于扩展和维护。本文将介绍如何使用 Delphi 实现一个简单的三层架构程序。

一、什么是三层架构?

三层架构是一种常用的软件架构模式,它将整个系统分为三个层次,每个层次专注于自己的任务,层次之间通过明确定义的接口进行通信。

三层架构包含以下三个层次:

1. 表现层(Presentation Layer):这一层是用户与系统交互的界面,通常是图形用户界面(GUI)或者网页界面。

2. 业务逻辑层(Business Logic Layer):这一层是系统的主要逻辑部分,通常包含所有的业务逻辑。这一层通常不直接访问数据库,而是通过数据访问层进行访问。

3. 数据访问层(Data Access Layer):这一层主要负责与数据库交互,包含所有的数据库访问逻辑和存储过程。

通过将系统分为三个层次,我们可以更好地管理代码,提高系统的可扩展性和可维护性。下面我们来看看如何使用 Delphi 实现一个简单的三层架构程序。

二、使用 Delphi 实现三层架构程序

我们将使用 Delphi 10.4 进行开发,并使用 FireDAC 进行数据库访问。下面是程序的基本结构:

1. 表现层(Presentation Layer)

我们使用 Delphi 的 VCL 库来实现表现层,可以通过拖拽控件的方式快速构建界面。我们的界面主要包含一个 TListBox 控件和一些基本的按钮,用于显示数据和操作数据。

2. 业务逻辑层(Business Logic Layer)

我们使用一个单独的单元来实现业务逻辑层,包含以下函数和过程:

1) LoadData:该函数负责从数据访问层加载数据,并返回一个 TList 类型的结果。该函数不应该直接访问数据库,而应该通过数据访问层进行访问。

2) AddPerson:该过程负责向数据访问层添加新的人员记录,并更新界面上的列表。该过程也不应该直接访问数据库,而应该通过数据访问层进行访问。

3) DeletePerson:该过程负责从数据访问层删除人员记录,并更新界面上的列表。同样也应该通过数据访问层进行访问。

4) UpdatePerson:该过程负责更新数据访问层中的人员记录,并更新界面上的列表。同样也应该通过数据访问层进行访问。

3. 数据访问层(Data Access Layer)

我们使用一个单独的单元来实现数据访问层,包含以下函数和过程:

1) LoadData:该函数负责从数据库中加载人员数据,并返回一个 TList 类型的结果。可以使用 FireDAC 的 TFDQuery 控件来执行 SQL 查询,并将结果装载到 TList 中。

2) AddPerson:该过程负责向数据库中添加新的人员记录。可以使用 TFDQuery 的 ExecSQL 方法执行 SQL 插入语句来实现。添加成功后,需要重新调用 LoadData 方法来更新列表。

3) DeletePerson:该过程负责从数据库中删除人员记录。可以使用 TFDQuery 的 ExecSQL 方法执行 SQL 删除语句来实现。删除成功后,也需要重新调用 LoadData 方法来更新列表。

4) UpdatePerson:该过程负责更新数据库中的人员记录。可以使用 TFDQuery 的 ExecSQL 方法执行 SQL 更新语句来实现。更新成功后,也需要重新调用 LoadData 方法来更新列表。

当然,上面的过程和函数只是一个简单的例子,实际的程序中可能需要更多的处理和逻辑。我们可以根据实际需求来添加更多的过程和函数。

三、案例说明

下面是我们的程序界面:

![image](https://user-images.githubusercontent.com/8468571/132090021-35497f67-0449-45b8-94af-b49962e53a08.png)

我们可以通过下面的代码来实现对界面的初始化和事件响应:

```delphi

unit Main;

interface

uses

System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,

FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,

FMX.StdCtrls, FMX.ListBox, BusinessLogic;

type

TfrmMain = class(TForm)

lbPersonList: TListBox;

btnAdd: TButton;

btnDelete: TButton;

btnUpdate: TButton;

procedure FormCreate(Sender: TObject);

procedure btnAddClick(Sender: TObject);

procedure btnDeleteClick(Sender: TObject);

procedure btnUpdateClick(Sender: TObject);

private

FPersonList: TList;

FBusinessLogic: TBusinessLogic;

procedure LoadData;

procedure UpdateUI;

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.fmx}

procedure TfrmMain.FormCreate(Sender: TObject);

begin

FBusinessLogic := TBusinessLogic.Create;

FPersonList := TList.Create;

LoadData;

end;

procedure TfrmMain.LoadData;

begin

FPersonList.Free;

FPersonList := FBusinessLogic.LoadData;

UpdateUI;

end;

procedure TfrmMain.UpdateUI;

var

i: Integer;

begin

lbPersonList.Clear;

for i := 0 to FPersonList.Count - 1 do

begin

lbPersonList.Items.Add(FPersonList[i].Name + ' (' + FPersonList[i].Gender + ')');

end;

end;

procedure TfrmMain.btnAddClick(Sender: TObject);

begin

FBusinessLogic.AddPerson;

LoadData;

end;

procedure TfrmMain.btnDeleteClick(Sender: TObject);

var

i: Integer;

begin

i := lbPersonList.ItemIndex;

if i >= 0 then

begin

FBusinessLogic.DeletePerson(FPersonList[i].Id);

LoadData;

end;

end;

procedure TfrmMain.btnUpdateClick(Sender: TObject);

var

i: Integer;

begin

i := lbPersonList.ItemIndex;

if i >= 0 then

begin

FBusinessLogic.UpdatePerson(FPersonList[i].Id);

LoadData;

end;

end;

end.

```

在上面的代码中,我们使用 TListBox 控件来显示人员列表,通过 TBusinessLogic 来进行数据操作。下面是 TBusinessLogic 的代码实现:

```delphi

unit BusinessLogic;

interface

uses

SysUtils, Classes, DataAccess;

type

TPerson = record

Id: Integer;

Name: string;

Gender: string;

end;

TBusinessLogic = class

public

function LoadData: TList;

procedure AddPerson;

procedure DeletePerson(AId: Integer);

procedure UpdatePerson(AId: Integer);

end;

implementation

{ TBusinessLogic }

procedure TBusinessLogic.AddPerson;

begin

inherited;

DataAccess.AddPerson;

end;

procedure TBusinessLogic.DeletePerson(AId: Integer);

begin

inherited;

DataAccess.DeletePerson(AId);

end;

function TBusinessLogic.LoadData: TList;

var

lst: TList;

begin

inherited;

lst := DataAccess.LoadData;

Result := lst;

end;

procedure TBusinessLogic.UpdatePerson(AId: Integer);

begin

inherited;

DataAccess.UpdatePerson(AId);

end;

end.

```

在上面的代码中,我们使用 TList 来存储人员列表,并通过 DataAccess 来实现数据访问。下面是 DataAccess 的代码实现:

```delphi

unit DataAccess;

interface

uses

SysUtils, Classes, FireDAC.Comp.Client, FireDAC.Stan.Param;

type

TPerson = record

Id: Integer;

Name: string;

Gender: string;

end;

TDataAccess = class

public

class function LoadData: TList;

class procedure AddPerson;

class procedure DeletePerson(AId: Integer);

class procedure UpdatePerson(AId: Integer);

end;

const

strConn = 'DriverID=SQLite;Database=test.db;';

implementation

{ TDataAccess }

class procedure TDataAccess.AddPerson;

var

qry: TFDQuery;

begin

qry := TFDQuery.Create(nil);

try

qry.Connection := TFDConnection.Create(nil);

qry.Connection.Params.DriverID := 'SQLite';

qry.Connection.Params.Database := 'test.db';

qry.Connection.LoginPrompt := False;

qry. SQL.Text := 'INSERT INTO Person (Name, Gender) VALUES (:Name, :Gender)';

qry.ParamByName('Name').AsString := 'New Person';

qry.ParamByName('Gender').AsString := 'Male';

qry.ExecSQL;

finally

qry.Free;

end;

end;

class procedure TDataAccess.DeletePerson(AId: Integer);

var

qry: TFDQuery;

begin

qry := TFDQuery.Create(nil);

try

qry.Connection := TFDConnection.Create(nil);

qry.Connection.Params.DriverID := 'SQLite';

qry.Connection.Params.Database := 'test.db';

qry.Connection.LoginPrompt := False;

qry.SQL.Text := 'DELETE FROM Person WHERE Id = :Id';

qry.ParamByName('Id').AsInteger := AId;

qry.ExecSQL;

finally

qry.Free;

end;

end;

class function TDataAccess.LoadData: TList;

var

qry: TFDQuery;

begin

Result := TList.Create;

qry := TFDQuery.Create(nil);

try

qry.Connection := TFDConnection.Create(nil);

qry.Connection.Params.DriverID := 'SQLite';

qry.Connection.Params.Database := 'test.db';

qry.Connection.LoginPrompt := False;

qry.SQL.Text := 'SELECT * FROM Person';

qry.Open;

while not qry.Eof do

begin

Result.Add(TPerson.Create);

Result.Last.Id := qry.FieldByName('Id').AsInteger;

Result.Last.Name := qry.FieldByName('Name').AsString;

Result.Last.Gender := qry.FieldByName('Gender').AsString;

qry.Next;

end;

finally

qry.Free;

end;

end;

class procedure TDataAccess.UpdatePerson(AId: Integer);

var

qry: TFDQuery;

begin

qry := TFDQuery.Create(nil);

try

qry.Connection := TFDConnection.Create(nil);

qry.Connection.Params.DriverID := 'SQLite';

qry.Connection.Params.Database := 'test.db';

qry.Connection.LoginPrompt := False;

qry.SQL.Text := 'UPDATE Person SET Name = :Name, Gender = :Gender WHERE Id = :Id';

qry.ParamByName('Id').AsInteger := AId;

qry.ParamByName('Name').AsString := 'Updated Person';

qry.ParamByName('Gender').AsString := 'Female';

qry.ExecSQL;

finally

qry.Free;

end;

end;

end.

```

在上面的代码中,我们使用 FireDAC 的 TFDQuery 来进行数据库访问,并将结果装载到 TList 中。下面是本示例的数据库结构:

```sql

CREATE TABLE IF NOT EXISTS `Person` (

`Id` INTEGER PRIMARY KEY AUTOINCREMENT,

`Name` TEXT,

`Gender` TEXT

);

```

四、运行效果

运行程序后,我们可以看到一个空的列表和三个按钮,我们点击 Add 按钮可以在列表中添加一个新的记录。我们可以双击列表中的记录,然后点击 Update 按钮,将记录更新后重新加载列表。点击 Delete 按钮可以删除列表中的选定记录。

![image](https://user-images.githubusercontent.com/8468571/132090106-06e22b64-10ea-4a5a-912b-823f5d89b377.png)

以上就是如何使用 Delphi 实现一个简单的三层架构程序的全部内容。本文的示例可以运行在 Windows 平台上,读者可以根据自己的需要进行修改和扩展。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(52) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部