您的位置:首页 > 运维架构 > 网站架构

三层架构——实践篇(二)

2013-01-31 17:11 302 查看
     三层学习进行至今也已一周多的时间,已经对其基本的理论思想有了大致的掌握,前两篇介绍了三层架构的基本理论以及一个小的登录demo,为了更好的练习,今天再说说另外一个例子:课程管理三层版.

       首先介绍方案实现的简单功能:1.对课程信息的添加;2.依据课程编号对课程信息的删除;3.课程信息浏览。

      
UI界面如下:



       三层架构划分:

      


       图中Modal存储对应数据库ELECTIVE中表T_Course的实体类Course,对应字段有:课程编号CourseID、课程名称CourseName、课程学分CourseCredit,到实体类中则对应相应属性存储,这种面向对象的类与关系数据库的表的对应称为ORM(对象关系映射)。

ORM的实现如下:

'定义实体类,存储数据表T_Course中记录信息
Public Class Course
'声明私有字段course_Id,course_Name,course_Credit
Private course_Id As String
Private course_Name As String
Private course_Credit As Integer
'定义CourseID属性,对应数据库表中第一个字段
Public Property CourseID As String
Get
Return course_Id
End Get
Set(value As String)
course_Id = value
End Set
End Property
'定义CourseName属性,对应数据库表中第二个字段
Public Property CourseName As String
Get
Return course_Name
End Get
Set(value As String)
course_Name = value
End Set
End Property
'定义CourseCredit属性,对应数据库表中第三个字段
Public Property CourseCredit As Integer
Get
Return course_Credit
End Get
Set(value As Integer)
course_Credit = value
End Set
End Property
End Class
       Common项目中存放公用文件,在这里存放Doutil类,用于存储访问数据库的基本操作,类似于DbHepler,供数据访问层调用.

Doutil实现代码如下:

'对数据库访问的操作公共方法
Public Class Doutil

'连接数据库字符串
Public Shared Function connstring() As String
connstring = "Server=LI;Database=ELECTIVE;User ID=sa;Password=123456"
End Function
'根据传入SQL执行语句,执行数据库的非查询操作,返回整型
Public Shared Function ExecNonQuery(strSql As String) As Integer
Dim conn As SqlClient.SqlConnection
Dim cmd As SqlClient.SqlCommand

conn = New SqlClient.SqlConnection(Doutil.connstring())  '调用Connstring方法连接数据库
cmd = conn.CreateCommand()          '创建执行命令
cmd.CommandText = strSql            '执行命令字符串
cmd.CommandType = CommandType.Text
conn.Open()
Try
cmd.ExecuteNonQuery()          '执行命令
Catch ex As Exception
Return 0                       '执行命令存在异常则返回0
End Try
Return 1                           '执行完成返回1
End Function
'对数据库表的查询操作方法,返回查询结果
Public Function GetReader(strSql As String) As SqlClient.SqlDataReader
Dim conn As SqlClient.SqlConnection
Dim cmd As SqlClient.SqlCommand
Dim reader As SqlClient.SqlDataReader

conn = New SqlClient.SqlConnection(Common.Doutil.connstring())  '调用connstring连接数据库
cmd = conn.CreateCommand()          '创建命令
cmd.CommandText = strSql            '执行命令字符串
cmd.CommandType = CommandType.Text
conn.Open()
reader = cmd.ExecuteReader()        '执行查询操作
Return reader                       '返回查询结果
conn.Close()
End Function
End Class

五个项目之间的关系如图:



数据添加的三层实现:

        设计流程:



         代码实现

         DAL:

          

'根据传入参数检查主键课程编号是否已经存在,返回布尔型
Public Function Exist(courseID As String) As Boolean
Dim strSql As String
Dim reader As SqlClient.SqlDataReader
Dim common = New Common.Doutil

strSql = "select * from T_Course where CourseID = " & courseID & ""        'SQL具体查询语句
reader = common.GetReader(strSql)             '调用GetReader方法,实现查询语句的具体执行

'判断结果集中是否有记录,存在则返回True,否则返回False
If (reader.HasRows) Then
Return True
Else
Return False
End If
End Function

'根据传入实体类Course参数,进行记录的添加,返回1说明添加成功,返回0说明添加失败
Public Function AddCourse(course As BFCourse.Modal.Course) As Integer
Dim strSql As String
strSql = "Insert into T_Course(CourseID,CourseName,CourseCredit) values(" & course.CourseID & " , " & course.CourseName & " , " & course.CourseCredit & ")"
Return Common.Doutil.ExecNonQuery(strSql)         '调用访问数据的模块方法实现插入数据操作
End Function


         BLL:

'添加课程方法AddCourse,无返回值,以弹出消息框方式显示是否成功
Public Sub AddCourse(course As BFCourse.Modal.Course)
Dim courseDAO = New BFCourse.DAL.CourseDAO      '调用DAL的数据访问对象

If courseDAO.Exist(course.CourseID) Then    '调用DAL的Exist方法判断账号是否存在,存在则弹出消息框提示并退出
MsgBox("此账号已存在,请重新输入")
Return
End If
If (courseDAO.AddCourse(course) > 0) Then   '调用DAL的AddCourse方法,返回1添加成功
MsgBox("添加成功")
Else                                        '返回0添加失败
MsgBox("添加失败")
End If
End Sub
        UI:

Public cb As New BFCourse.BLL.CourseBiz            '调用BLL
'课程添加功能实现
Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
Dim course As BFCourse.Modal.Course            '声明实体类Course

'判断用户输入课程编号框是否为空值,是则退出
If (Trim(txtCourseID.Text) = "") Then
MsgBox("请输入课程编号")
Return
End If

'判断用户输入课程名称框是否为空值,是则退出
If txtCourseName.Text = String.Empty Then
MsgBox("请输入课程名称")
Return
End If

'判断用户输入课程学分框是否为空值,是则退出
If txtCourseCredit.Text = String.Empty Then
MsgBox("请输入课程学分")
Return
End If

course = New BFCourse.Modal.Course         '实例化实体类Course
course.CourseID = "'" & Trim(txtCourseID.Text) & "'"   '根据用户输入向course属性CourseID赋值
course.CourseName = "'" & Trim(txtCourseName.Text) & "'"  '根据用户输入向course属性CoureName赋值
course.CourseCredit = Convert.ToInt32(Trim(txtCourseCredit.Text))    '根据用户输入向course属性CourseCredit赋值

cb.AddCourse(course)         '调用BLL的AddCourse方法实现添加课程
dvwCourse.DataSource = cb.GetCourseList()    '刷新课程浏览
End Sub


课程删除的三层实现

        设计流程:



        代码实现

       DAL:

'根据传入课程编号courseID实现删除该字段的功能
Public Function DelCourse(courseID As String) As Integer
Dim strSql As String

strSql = "delete from T_Course where CourseID= " & courseID & ""   '具体删除记录的SQL语句参数
Return Common.Doutil.ExecNonQuery(strSql)                   '根据传入的SQL语句参数,调用访问数据的模块方法实现具体操作
End Function
        BLL:

'删除课程方法DelCourse,无返回值,以弹出消息框方式显示是否成功
Public Sub DelCourse(courseID As String)

Dim courseDAO = New BFCourse.DAL.CourseDAO     '调用DAL的数据访问对象

If (courseDAO.Exist(courseID) = False) Then    '调用Exist方法判断对应课程编号记录是否存在
MsgBox("此课程号不存在,请重新输入")
Return                                     '存在则退出
End If
If courseDAO.DelCourse(courseID) > 0 Then      '调用DelCourse方法删除记录,返回1则成功,返回0则失败
MsgBox("删除成功")
Else
MsgBox("删除失败")
End If
End Sub


        UI:

'根据用户输入课程编号实现删除课程记录
Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
'判断用户输入课程编号是否为空,是则退出
If txtDCourseID.Text = String.Empty Then
MsgBox("请输入课程编码")
Return
End If

cb.DelCourse("'" & Trim(txtDCourseID.Text) & "'")    '调用BLL的DelCourse方法,实现课程删除操作
dvwCourse.DataSource = cb.GetCourseList()  '刷新浏览记录信息
End Sub


 课程浏览的三层实现:

        设计流程如记录添加的流程

        代码实现

     
  DAL:

'得到表T_Course的全部记录并传给集合
Public Function GetCourseList() As List(Of BFCourse.Modal.Course)
Dim list = New List(Of BFCourse.Modal.Course)
Dim rd As SqlClient.SqlDataReader
Dim strSql As String
Dim common = New Common.Doutil
Dim course As BFCourse.Modal.Course

strSql = "select * from T_Course"    '具体实现的SQL语句
rd = common.GetReader(strSql)        '根据具体SQL语句调用具体实现方法

'逐条读取记录,向集合中添加内容
While (rd.Read())
course = New BFCourse.Modal.Course
course.CourseID = rd(0).ToString()
course.CourseName = rd(1).ToString()
course.CourseCredit = rd(2).ToString()
list.Add(course)
End While
Return list       '返回读取结果集合
End Function


        BLL:

'获取整个T_Course的全部记录
Public Function GetCourseList() As List(Of BFCourse.Modal.Course)
Dim courseDAO = New BFCourse.DAL.CourseDAO    '调用DAL的数据访问对象CourseDAO
Return courseDAO.GetCourseList()              '调用GetCourseList方法返回集合信息
End Function


        UI:

       加载窗体时,删除或添加记录成功后调用BLL的GetCourseList()方法

'加载窗体时,实现课程记录的显示操作
Private Sub frmCourse_Load(sender As Object, e As EventArgs) Handles MyBase.Load
dvwCourse.DataSource = cb.GetCourseList()    '显示全部课程信息记录
End Sub


三层之间调用关系为:



       
小结:在对此阶段内容学习时,看到了对数据库实现操作的不足,主要还是缺少练习,希望能在今后的项目中多多实践,还有便是对设计方面的学习上始终还没有对自己真正的练习使用,期待接下来的学习吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: