ylbtech-架构-层-DAL:DAL

DAL是数据访问层的英文缩写,即为数据访问层(Data Access Layer)。其功能主要是负责数据库的访问。简单地说就是实现对数据表的Select(查询)、Insert(插入)、Update(更新)、Delete(删除)等操作

1.返回顶部
1、
中文名:DAL为数据访问层
外文名:Data Access Layer
结构层数:3层
别    称:DAL层
定    义:主要是负责数据库的访问
学    科:计算机技术

目录

2、
2.返回顶部
1、

基本介绍

在企业级应用中,很少有不与数据库打交道的。只要是用到数据库,就有把业务数据持久化到数据库的需求
在项目实际开发过程,有的直接采用JDBC技术进行数据库持久化操作,有的采用目前很好用的ORM框架来进行数据库持久化操作。
抽取数据库访问层的主要作用是进行隔离,把与数据库打交道的事情都放在数据访问层解决,在服务层则只要调用数据访问层就可以了,不必和具体的ORM层实现相耦合。
数据库访问层:又称为DAL层,有时候也称为是持久层,其功能主要是负责数据库的访问。简单地说就是实现对数据表的Select(查询)、Insert(插入)、Update(更新)、Delete(删除)等操作。如果要加入ORM的思想,就会包括对象和数据表之间的映射,以及对象实体的持久化操作
讲到数据库访问层,不得不提下三层架构,通常会把应用系统划分为:表现层、业务逻辑层和数据库访问层。这样的设计目的是为了实现“高内聚,低耦合”的设计思想。数据库访问层在三层架构中只负责数据存储与读取。业务逻辑层作为数据库访问层的上层,内部调用数据库访问层提供的方法,来完成数据的存储与读取。数据库访问层与底层数据库应该是独立的,好的数据库访问层方案是能够在不修改程序代码功能的基础之上实现不同类型数据库的动态切换。我们比较熟悉的做法就是通过XML配置文件来完成底层数据库的切换。目前很多流行的数据库访问层框架都是采用这种方式来实现数据库的动态切换。数据访问层能够将应用程序中的数据持久化到存储介质中,通常我们使用的数据库都是关系型的数据库,采用的数据模型都是对象模型,这就需要数据库访问层实现对象模型与关系模型直接的、互相的转换

 

特点

三层结构为:
1.表示层(USL):主要表示WEB方式,也可以表示成WINFORM方式。如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。
2.业务逻辑层(BLL):主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理。如果说数据层是积木,那逻辑层就是对这些积木的搭建。
3.数据访问层(DAL):主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务。
 

设计

数据访问层DataAccessLayer用于数据库数据的读写操作,该层只包含一个类文件Database.cs。在该类文件中需要创建一些方法以完成建立数据库连接、向数据库提交SQL语句并返回相应的操作结果等功能。
添加类文件
在DataAccessLayer文件夹下添加新项,在“选择新项”对话框中选择模板为“类”给类文件命名为Database.cs,单击“添加”按钮。
引用命名空间
由于类的代码中要使用ADO.NET相关对象,需要引用以下命名空间:
using System.Data.SqlClient;
类文件结构
将Database类的定义代码放在命名空间MessageBoard.DataAccessLayer的定义中,付码结构如下:
namespace MessageBoard.DataAccessLayer
{
public class Database
{
自定义方法()
{ }
}
}
在Database类中添加方法
(1)DBCon()方法
功能:返回SqlConnection对象的数据库连接参数,属于无参函数。代码如下:
using System.Data.SqlClient;

public class DBConnection
{
SqlConnection conn = null; public DBConnection()
{
//TODO:创建对象
// Windows 身份验证
//conn = new SqlConnection("Server=.;Database=db1;Integrated Security=SSPI"); // 本地连接 // SQL Server 身份验证
// .,locahost,127.0.0.1 都代表本地
//conn.ConnectionString = "Server=.;Database=db1;Uid=sa;Pwd=123456";
//conn.ConnectionString = "Server=locahost;Database=db1;Uid=sa;Pwd=123456";
//conn.ConnectionString = "Server=127.0.0.1;Database=db1;Uid=sa;Pwd=123456";
conn = new SqlConnection( "Server=.;User ID=sa;Password=123456;Initial Catalog=db1;Min Pool Size=30;Max Pool Size=100;Connect Timeout=60" ); // 远程连接
} public SqlConnection Conn
{
get { return conn; }
set { conn = value; }
}
}
也可以用以下方法直接返回数据库连接字符串:
// 创建Conn对象
SqlConnection conn = new DBConnection().Conn;
(2)GetDataSet(String)方法
功能:接收传来的SQL语句,执行查询操作,返回查询结果集。该方法的参数为字符类型,代码如下:
(3)ExecuteSQL(String)方法
功能:接收传来的SQL语句,执行非查询操作,完成将留言信息写到数据库中的操作。该方法的参数为字符串类型,代码如下:
2、
3. 代码返回顶部
·DBConnection.cs
using System.Data.SqlClient;

public class DBConnection
{
SqlConnection conn = null; public DBConnection()
{
//TODO:创建对象
// Windows 身份验证
//conn = new SqlConnection("Server=.;Database=db1;Integrated Security=SSPI"); // 本地连接 // SQL Server 身份验证
// .,locahost,127.0.0.1 都代表本地
//conn.ConnectionString = "Server=.;Database=db1;Uid=sa;Pwd=123456";
//conn.ConnectionString = "Server=locahost;Database=db1;Uid=sa;Pwd=123456";
//conn.ConnectionString = "Server=127.0.0.1;Database=db1;Uid=sa;Pwd=123456";
conn = new SqlConnection( "Server=.;User ID=sa;Password=123456;Initial Catalog=db1;Min Pool Size=30;Max Pool Size=100;Connect Timeout=60" ); // 远程连接
} public SqlConnection Conn
{
get { return conn; }
set { conn = value; }
}
}
·ProductInfo.cs
public class ProductInfo
{
public int? ProductId { get; set; }
public string ProductName { get; set; }
public decimal? UnitPrice { get; set; }
public string Type { get; set; } }
·Product.cs
using System.Collections.Generic;

using System.Data.SqlClient;

public class Product
{
/// <summary>
/// ylb: 1,GetAll
/// remark: 获取所有产品,并以productId降序排列
/// </summary>
/// <returns></returns>
public IList<ProductInfo> GetAll()
{ IList<ProductInfo> dals = new List<ProductInfo>(); string sql = "select productId,productName,unitPrice,type from Product"; SqlConnection conn = new DBConnection().Conn;
SqlCommand com = conn.CreateCommand(); com.CommandText = sql;
conn.Open();
try
{
SqlDataReader sdr = com.ExecuteReader();
while( sdr.Read() )
{
ProductInfo dal = new ProductInfo()
{
ProductId = sdr.GetInt32( ),
ProductName = sdr.GetString( ),
UnitPrice = sdr.GetDecimal( ),
Type = sdr.GetString( )
}; dals.Add( dal );
}
}
finally
{
conn.Close();
}
return dals;
} /// <summary>
/// ylb: 2,Add
/// remark: 添加一个产品
/// field: productName,unitPrice,type
/// </summary>
/// <param name="dal"></param>
public void Add( ProductInfo dal )
{ string sql = "insert into Product(productName,unitPrice,type) values(@productName,@unitPrice,@type)"; SqlConnection conn = new DBConnection().Conn;
SqlCommand com = conn.CreateCommand(); com.Parameters.Add( new SqlParameter( "@productName", dal.ProductName ) );
com.Parameters.Add( new SqlParameter( "@unitPrice", dal.UnitPrice ) );
com.Parameters.Add( new SqlParameter( "@type", dal.Type ) );
com.CommandText = sql; conn.Open();
try
{
com.ExecuteNonQuery();
}
finally
{
conn.Close();
} } /// <summary>
/// ylb: 3,GetModel
/// remark: 获得一个实体对象,根据productId
/// </summary>
/// <param name="productId"></param>
/// <returns></returns>
public ProductInfo GetModel( int productId )
{
ProductInfo dal = null; string sql = "select productId,productName,unitPrice,type from Product where productId=@productId"; SqlConnection conn = new DBConnection().Conn;
SqlCommand com = conn.CreateCommand(); com.Parameters.Add( new SqlParameter( "@productId", productId ) );
com.CommandText = sql;
conn.Open();
try
{
SqlDataReader sdr = com.ExecuteReader();
while( sdr.Read() )
{
dal = new ProductInfo()
{
ProductId = sdr.GetInt32( ),
ProductName = sdr.GetString( ),
UnitPrice = sdr.GetDecimal( ),
Type = sdr.GetString( )
};
}
}
finally
{
conn.Close();
}
return dal;
} /// <summary>
/// ylb: 4,Update
/// remark: 修改一条信息 ,根据productId
/// </summary>
/// <param name="dal"></param>
public void Update( ProductInfo dal )
{ string sql = "update Product set productName=@productName,unitPrice=@unitPrice,type=@type where productId=@productId"; SqlConnection conn = new DBConnection().Conn;
SqlCommand com = conn.CreateCommand(); com.Parameters.Add( new SqlParameter( "@productName", dal.ProductName ) );
com.Parameters.Add( new SqlParameter( "@unitPrice", dal.UnitPrice ) );
com.Parameters.Add( new SqlParameter( "@type", dal.Type ) );
com.Parameters.Add( new SqlParameter( "@productId", dal.ProductId ) );
com.CommandText = sql; conn.Open();
try
{
com.ExecuteNonQuery();
}
finally
{
conn.Close();
} } /// <summary>
/// ylb: 5,Delete
/// remark: 删除一条信息,根据productId
/// </summary>
/// <param name="productId"></param>
public void Delete( int productId )
{ string sql = "delete Product where productId=@productId"; SqlConnection conn = new DBConnection().Conn;
SqlCommand com = conn.CreateCommand(); com.Parameters.Add( new SqlParameter( "@productId", productId ) );
com.CommandText = sql; conn.Open();
try
{
com.ExecuteNonQuery();
}
finally
{
conn.Close();
}
}
}
·
4.返回顶部
 
5.返回顶部
1、
2、
 
6.返回顶部
 
作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

架构-层-DAL:DAL的更多相关文章

  1. asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦

    学习asp.net 已经有近三个月的时间了,在asp.net mvc上花的时间最多,但个人真是有些菜,不得不说,asp.net mvc的水真的还是蛮深的.目前在公司实习,也见过公司几个项目的代码了.对 ...

  2. IOC的理解,整合AOP,解耦对Service层和Dal层的依赖

    DIP依赖倒置原则:系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖依赖抽象,而不是细节 贯彻依赖倒置原则,左边能抽象,右边实例化的时候不能直接用抽象,所以需要借助一个第三方 高层本来是依 ...

  3. 三层架构BLL+DAL+Model & MVC & MVVM

    三层架构 - 国内版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=%E4%B8%89%E5%B1%82%E6%9E%B6% ...

  4. 架构-层-Model:Model

    ylbtech-架构-层-Model:Model 1.返回顶部 1. Model,意思是模特儿,模特儿是英文“model”的音译.模特一般来说要五官端正,身材良好,有气质,展示能力强,另外身高要具备一 ...

  5. 架构-层-BLL:BLL

    ylbtech-架构-层-BLL:BLL 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的 ...

  6. 从架构层面谈web加载优化(个人整理)

    最近听了阿里一位大牛的讲座,讲web架构优化对网页加载的影响,看完之后对他所讲的一些优化方法进行一些总结和整理,发现收获还是蛮多的,下面多为个人整理和个人见解,希望有说的不对的,能及时指出 1.DNS ...

  7. JDBC——架构层、驱动

    JDBC(java Datebase Connector) jdbc驱动程序 四种类型: jdbc-odbc桥接驱动程序 Native-API JDBC-Net Native-Protocol (常见 ...

  8. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. 使用ABP框架踩过的坑系列1

        企业级(例如ERP)应用, 一遍一遍的在重复:认证.验证.异常处理.日志.国际化和本地化.数据库连接管理.配置管理. 审计记录等,同时.NET有很多最佳实践:分层.模块化.DDD领域驱动.DI ...

随机推荐

  1. A广搜

    <span style="color:#330099;">/* A - 广搜 基础 Time Limit:2000MS Memory Limit:65536KB 64b ...

  2. activemq高可用

    这里是基于 zookeeper 选举方式实现的集群配置,服务器过半数才可提供服务,所以是2n+1台这里以三台为例. 只有master节点能提供服务,slave节点无法提供服务,只有当master节点挂 ...

  3. jQuery之操作样式的css方法

    注意点都在代码里 <style> div { width: 200px; height: 200px; background-color: pink; } </style> & ...

  4. SpringCloud入门(二)

    ribbon实现负载均衡 上文只是将服务注册到eureka上,但是consumer还是硬编码调用,前文也有提到这种硬编码方式肯定是不合理的,一来服务上线之后,IP地址肯定是变动的, 再则,采用硬编码的 ...

  5. Linux-date函数

    rhel7 date函数 显示本地时间?设定当前系统的时间,以一定格式显示当前时间,如X-X-X /X:X:X 使用man date命令查看关于date的使用方法 SYNOPSIS           ...

  6. Linux服务器安装系统之1-LSI阵列卡Raid10配置方法

  7. PAT Advanced 1036 Boys vs Girls (25 分)

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  8. PAT Basic 1010 一元多项式求导 (25 分)(活用stringstream,昨天学习的)

    设计函数求一元多项式的导数.(注:x​n​​(n为整数)的一阶导数为nx​n−1​​.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数).数字间以空格分隔. ...

  9. 最佳实践:深度学习用于自然语言处理(Deep Learning for NLP Best Practices) - 阅读笔记

    https://www.wxnmh.com/thread-1528249.htm https://www.wxnmh.com/thread-1528251.htm https://www.wxnmh. ...

  10. bzoj4238 & loj2881 电压 二分图判定+dfs树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4238 https://loj.ac/problem/2881 题解 如果想要让每一条边都有电流 ...