当前位置: 首页 > news >正文

使用简单ORM开发框架进行快速开发

使用简单ORM开发框架进行快速开发

第一部分ORM快速开发框架介绍

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。

ORM快速开发框架分为两部分,一部分为ORM核心类库,用于系统与数据库之间的操作交互和实体类与SQL语句之间的转换。另一部分为ORM自动生成工具,用于实体类,前台HTML代码,业务逻辑调用代码的自动生成。

第二部分 使用简单ORM框架进行快速开发

我们以一个简单的新闻系统作为实例来讲解如何使用ORM框架进行快速开发。

一 新闻系统功能介绍

二 业务流程定义

(1)新闻添加

正常流程:用户进入新闻添加页面,输入标题,内容等信息,点提交按钮,完成新闻录入操作。

异常流程:如果用户输入的数据不合法或没有输入标题,内容等信息,系统应该给与提示信息告知用户。

(2)新闻修改

前置条件:用户进入新闻查询页面,进行查询,系统返回新闻查询列表。

正常流程:选择要修改的新闻点击,打开新闻修改页,修改完毕,点保存完成修改操作。

异常流程:如果用户输入的数据不合法或没有输入标题,内容等信息,系统应该给与提示信息告知用户。

(3)新闻删除

前置条件:用户进入新闻查询页面,进行查询,系统返回新闻查询列表。

正常流程:用户选择要删除的新闻点【删除】,系统出现【确认删除?】对话框,点【确认】,完成新闻删除。

异常流程:如果此信息不存在或用户在【确认删除?】对话框,点【否】,则删除操作停止。

(4)新闻查询

前置条件:用户进入新闻查询页面。

正常流程:用户输入新闻标题,点提交,页面返回查询信息的列表。

异常流程:如果查询的信息不存在,则页面返回【您查询的信息不存在】。

三 数据库设计

数据库名称:ORMNewsSystem

表名:ORMNewsTable

表结构:

字段名

字段类型

是否主键

默认值

是否可空

说明

Id

int

新闻ID

Title

nvarchar(50)

新闻标题

Content

ntext

新闻内容

CreateDate

datetime

Getdate()

创建日期

四 页面原型设计

页面原型法是一种表达需求和实现软件之间真实程度的很好的表达方式,是在系统未开发出来时,与客户进行沟通的重要方式。通过原型法可以更小的缩短开发与客户需求之间的理解差距,是需求获取和分析阶段的重要的手段之一。

(1)查询页面

(2)添加页面

(3)修改页面

(4)详细页

五 建立解决方案

新闻系统的解决方案分为两个项目,一个项目为Web站点项目,主要实现系统的页面层和业务逻辑层。

另一个为ORMModel类库项目,主要存在数据库与类之间的对应关系(O-R-M)。

两个工程必须引用ORM快速开发框架的核心DLL【SoftWare.SimpleORM.Library.dll】。

Web项目中的Web.config配置如下

<appSettings>

<!--定义ORM数据库访问链接字符串-->

<add key="ORMConnectionString" value="Server=.;database=ORMNewsSystem;uid=sa;pwd=sa;"/>

<!--定义ORM数据库访问提供者-->

<add key="ORMDataBaseProvider" value="System.Data.SqlClient"/>

</appSettings>

六 ORM实体类生成

(1) 打开【ORM生成工具】。

(2)设置要生成的数据库信息,一级批量生成目录【如下图】。

(3)完成批量生成,并把生成后的代码拷贝到项目中。

七 完成业务逻辑

(1)完成模型页面到aspx页面的转换,输入部分可以使用工具自动生成前台代码。

(2)为【添加】,【修改】,【查询】等添加业务逻辑代码,业务逻辑代码可以直接使用生成工具生成。

(3)必须引用的命名空间

using ORMNewsSystem.Model;

using SoftWare.SimpleORM.Library;

(4)添加逻辑

ORMNewsTable model = new ORMNewsTable();

//model.id = (int)this.txtid.Text.Trim();

model.content = this.txtContent.Text.Trim();

model.title = this.txtTitle.Text.Trim();

model.createdate = DateTime.Now;//日期类型不要使用sql server的默认值 防止web服务器与数据库服务器日期不一致

bool result = false;

int identityId = 0;

result = ORMManager.ORMMangerInstance.CreateInsertSQL(model, out identityId);

if (result)

{

Response.Write("新闻添加成功");

}

else

{

Response.Write("新闻添加失败");

}

(5)修改逻辑

public partial class NewsEdit : System.Web.UI.Page

{

private string newsid;//记录新闻Id

protected void Page_Load(object sender, EventArgs e)

{

if (Request.QueryString["Id"] == null)

{

Response.Write("<script>alert('新闻ID参数传递失败');history.back(-1);</script>");

return;

}

else

{

newsid = Request.QueryString["Id"].ToString();

}

if (!Page.IsPostBack)

{

BindNewsEdit();

}

}

/// <summary>

/// 查询代码

/// </summary>

protected void BindNewsEdit()

{

string strOrderBy = string.Empty;

string strWhere = " AND Id="+newsid;//查询条件

ORMNewsTable model = new ORMNewsTable();

model = ORMManager.ORMMangerInstance.CreateSelectSingleSQL(model, strWhere, strOrderBy);

this.txtTitle.Text = model.title;

this.txtContent.Text = model.content;

}

/// <summary>

/// 更新代码

/// </summary>

protected void btnSave_Click(object sender, EventArgs e)

{

//获取原对象的数据

string strOrderBy = string.Empty;

string strWhere = " AND Id=" + newsid;//查询条件

ORMNewsTable model = new ORMNewsTable();

model = ORMManager.ORMMangerInstance.CreateSelectSingleSQL(model, strWhere, strOrderBy);

//创建新的对象

model.content = this.txtContent.Text.Trim();

model.title = this.txtTitle.Text.Trim();

string insertSQL = string.Empty;

bool result = false;

int identityId = 0;

result = ORMManager.ORMMangerInstance.CreateUpdateSQL(model, out identityId);

if (result)

{

Response.Write("新闻修改成功");

}

else

{

Response.Write("新闻修改失败");

}

}

}

(6)查询,删除逻辑

public partial class NewsList : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack)

{

BindNewsList();

}

}

/// <summary>

/// 查询代码

/// </summary>

protected void BindNewsList()

{

IList<ORMNewsTable> list = new List<ORMNewsTable>();

string strOrderBy = string.Empty;

strOrderBy = " Id ASC ";//排序规则

string strWhere = string.Empty;//查询条件

string title = string.Empty;

title = this.txtTitle.Text.Trim();

if (title.Length > 0)

{

strWhere = " AND Title LIKE '%" + title + "%'";

}

ORMNewsTable model = new ORMNewsTable();

list = ORMManager.ORMMangerInstance.CreateSelectSQL(model, strWhere, strOrderBy);

//绑定控件代码

gvList.DataSource = list;

gvList.DataBind();

}

/// <summary>

/// 删除代码

/// </summary>

protected void gvList_RowDeleting(object sender, GridViewDeleteEventArgs e)

{

int newsId = 0;

int.TryParse(gvList.Rows[e.RowIndex].Cells[0].Text, out newsId);

ORMNewsTable model = new ORMNewsTable();

string strWhere = string.Empty;

bool result = false;

int identityId = 0;

strWhere = " AND Id= " + newsId.ToString();

result = ORMManager.ORMMangerInstance.CreateDeleteSQL(model, strWhere, out identityId);

if (result)

{

Response.Write("新闻删除成功");

}

else

{

Response.Write("新闻执行失败");

}

BindNewsList();//重新绑定

}

/// <summary>

/// 分页

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void gvList_PageIndexChanging(object sender, GridViewPageEventArgs e)

{

gvList.PageIndex = e.NewPageIndex;

BindNewsList();

}

/// <summary>

/// 查询

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void btnSearch_Click(object sender, EventArgs e)

{

gvList.PageIndex = 0;

BindNewsList();

}

}

(7)查看详细信息逻辑

public partial class NewsShow : System.Web.UI.Page

{

private string newsid;//记录新闻Id

protected void Page_Load(object sender, EventArgs e)

{

if (Request.QueryString["Id"] == null)

{

Response.Write("<script>alert('新闻ID参数传递失败');history.back(-1);</script>");

return;

}

else

{

newsid = Request.QueryString["Id"].ToString();

}

if (!Page.IsPostBack)

{

BindNewsShow();

}

}

/// <summary>

/// 查询代码

/// </summary>

protected void BindNewsShow()

{

string strOrderBy = string.Empty;

string strWhere = " AND Id="+newsid;//查询条件

ORMNewsTable model = new ORMNewsTable();

model = ORMManager.ORMMangerInstance.CreateSelectSingleSQL(model, strWhere, strOrderBy);

this.lblTitle.Text = model.title;

this.lblContent.Text = model.content;

this.lblCreateDate.Text = model.createdate.ToString();

}

}

八 系统演示

请直接看代码演示。

演示项目下载地址:http://d.hongxuecn.com/ORMNewsSystem.rar

开发工具下载地址:http://d.hongxuecn.com/Tool.rar

开发框架下载地址;http://d.hongxuecn.com/Library.rar

本文档doc文件整体下载地址:http://d.hongxuecn.com/help.rar

九 共享学习
这套框架和开发工具是业余时间开发完成的,没有经过专业的测试,在这里与大家分享出来,一起讨论交流,里面有很多问题和设计不足的地方,请大家批评指正。

相关文章:

  • LeetCode -- Largest Number
  • LeetCode -- Length of last word
  • 编程是一种“组合的艺术”
  • LeetCode -- Majority Element II
  • 3G上网卡招标,华为成最大赢家
  • LeetCode -- Nim Game
  • 近期阅读关注(200905)
  • LeetCode -- Pascal's Triangle II
  • LeetCode -- Permutation Sequence
  • FreeBSD中替换系统调用监视系统文件打开记录
  • LeetCode -- Remove Element
  • 刚做的H1N1猪流感分布图Demo
  • LeetCode -- Same Tree
  • 与辛鹏和王昕聊OPUG(开放流程社区)
  • LeetCode -- Search in Rotated Sorted Array II
  • [case10]使用RSQL实现端到端的动态查询
  • 【前端学习】-粗谈选择器
  • AHK 中 = 和 == 等比较运算符的用法
  • angular2 简述
  • Apache Pulsar 2.1 重磅发布
  • Bootstrap JS插件Alert源码分析
  • C# 免费离线人脸识别 2.0 Demo
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • es6--symbol
  • ES学习笔记(12)--Symbol
  • FastReport在线报表设计器工作原理
  • IDEA常用插件整理
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js继承的实现方法
  • Laravel 菜鸟晋级之路
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Redis字符串类型内部编码剖析
  • 对JS继承的一点思考
  • 开发基于以太坊智能合约的DApp
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​secrets --- 生成管理密码的安全随机数​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #《AI中文版》V3 第 1 章 概述
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (14)Hive调优——合并小文件
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Note)C++中的继承方式
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (五)关系数据库标准语言SQL
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)c++ std::pair 与 std::make
  • (转)拼包函数及网络封包的异常处理(含代码)