DataTable填补了实体类返回泛型集合
坤哥见我昨天找了一段代码,如下面:
略微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程。坤哥看了之后问我,假设实体有500多个属性,难道也要这样一条一条的写吗?假设返回多个实体时怎么办?这时,我才意识到自己的代码时非常有问题的。原来设计的是每一个方法最多返回一个实体,可是当遇到查询到多条记录的时候,就又冒着破坏三层结构的事返回Datatable去了,真的是非常有问题啊。
怎么改。我脑海中一下子就浮现了老办法:数组+循环,用循环读条读取列值。保存到对象数组。
之后查了查,发现我太OUT了。
明明就有又新又好的技术可我用过了也想不起来。
百度上是用的是这种:在实体层加入一个工具类,类似D层的工具类,仅仅只是这个工具类是完毕将datatable转换为一个包括实体的泛型集合的,然后每次返回的时候,将集合作为结果返回。
这种方法最好的地方还是在对每一个实体属性的赋值上面,通过内部的属性集合循环赋值,再也不用一条条写了,这样,不仅封装性好了,并且使代码更不easy出错。
可是,唯一遗憾的就是,使用这个工具类对于实体和datatable有一个条件限制。就是实体的属性名必须和datatable的列名相应。
在百度上找了非常多这种类,可是仅仅找到了C#版的。然后自己改写了个VB.NET版的。以下写出自己的DEMO:
首先,是实体类:
这个实体类是对教师信息表的映射。
Public Class EntityUser
Private FilUserName As String 'username
Private FilPwd As String 'password
Private FilTeaName As String '教师姓名
Private FilTeaLevel As String '教师级别
Private FilRegDate As String '注冊日期
Private FilRegTime As String '注冊时间
Private FilDelDate As String '注销日期
Private FilDelTime As String '注销时间
Private FilOnLineStatue As String '在线状态
''' <summary>
''' username
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property UserName() As String
Get
Return FilUserName
End Get
Set(ByVal value As String)
FilUserName = value
End Set
End Property
''' <summary>
''' password
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Pwd() As String
Get
Return FilPwd
End Get
Set(ByVal value As String)
FilPwd = value
End Set
End Property
''' <summary>
''' 教师姓名
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property TeaName() As String
Get
Return FilTeaName
End Get
Set(ByVal value As String)
FilTeaName = value
End Set
End Property
''' <summary>
''' 教师级别
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property TeaLevel() As String
Get
Return FilTeaLevel
End Get
Set(ByVal value As String)
FilTeaLevel = value
End Set
End Property
''' <summary>
''' 注冊日期
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property RegDate() As String
Get
Return FilRegDate
End Get
Set(ByVal value As String)
FilRegDate = value
End Set
End Property
''' <summary>
''' 注冊时间
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property RegTime() As String
Get
Return FilDelDate
End Get
Set(ByVal value As String)
FilDelTime = value
End Set
End Property
''' <summary>
''' 注销日期
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property DelDate() As String
Get
Return FilDelDate
End Get
Set(ByVal value As String)
FilDelDate = value
End Set
End Property
''' <summary>
''' 注销时间
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property DelTime() As String
Get
Return FilDelTime
End Get
Set(ByVal value As String)
FilDelTime = value
End Set
End Property
''' <summary>
''' 在线状态
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property OnLineStatue() As String
Get
Return FilOnLineStatue
End Get
Set(ByVal value As String)
FilOnLineStatue = value
End Set
End Property
End Class
我 的教师信息表例如以下:里面有3条记录,这个结果等一会咱们执行的时候会用到。
然后。写了个SqlHelper,这个代码不再写。由于这里是做个DEMO,所以没有採用3层架构,大家做的时候要注意不要破坏总体的结构。
然后以下就是本文主要要讨论的EntityHelper,不知道这样取名准不准确,可是假设要把这个类增加三层里面,我会把向SQLHelper那样对待,将它作为实体层的一个工具类加进去。
Imports System.Collections.Generic '添加泛型的命名空间
Imports System.Reflection '引入反射:为了使用PropertyInfo Public Class EntityHelper Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T) '将datatable转化为泛型集合
'注意:1,convertToList(Of T As {New}) 这里的new是用来约束T的,必须有。不然new T的时候会出现错误
'2,new约束在C#和VB.NET里面的写法是不一样的,C#里面用的是where来为T加上约束的 Dim myList As New List(Of T) '定义终于返回的集合 Dim myTpye As Type = GetType(T) '得到实体类的类型名
Dim dr As DataRow '定义行集 Dim tempName As String = String.Empty '定义一个暂时变量 '遍历DataTable的全部数据行
For Each dr In dt.Rows Dim myT As New T '定义一个实体类的对象
Dim propertys() As PropertyInfo = myT.GetType().GetProperties() '定义属性集合
Dim Pr As PropertyInfo '遍历该对象的全部属性
For Each Pr In propertys
tempName = Pr.Name '将属性名称赋值给暂时变量 '检查DataTable是否包括此列(列名==对象的属性名)
If (dt.Columns.Contains(tempName)) Then '将此属性与datatable里的列明比較,查看datatable是否包括此属性 '推断此属性是否有Setter
If (Pr.CanWrite = False) Then '推断此属性是否可写。假设不可写。跳出本次循环
Continue For
End If Dim value As Object = dr(tempName) '定义一个对象型的变量来保存列的值 If (value.ToString <> DBNull.Value.ToString()) Then '假设非空,则赋给对象的属性
Pr.SetValue(myT, value, Nothing) '在执行期间,通过反射,动态的訪问一个对象的属性
End If
End If
Next myList.Add(myT) '加入到集合
Next Return myList '返回实体集合
End Function End Class
至此,基本的类都写完了,以下来看下client该怎样调用:
<span style="font-size:18px;"> Dim strSQL As String = "select * from T_TeaInfo where TeaLevel ='管理员'" '注意,这样的破坏架构的写法不提倡
Dim mysqlhelper As New SQLHelper '定义查询助手类
Dim dt As New DataTable '定义查询到的表集
Dim myList As List(Of EntityUser) '保存转换后的泛型集合
dt = mysqlhelper.ExecSelect(strSQL, CommandType.Text) '运行查询
'将dt转换为泛型集合
myList = EntityHelper.convertToList(Of EntityUser)(dt)
TextBox1.Text = myList.Count '在文本框里面显示出查询到的教师数目
</span>
执行后。能够看到。结果例如以下:
小结下:
对于三层中,可能刚開始做的时候,我们从D层向上层传数据的时候用的是Datatable,仅仅能说,这是一种很破坏结构的方法国,我真正体会到了实体的优势。将用它。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
DataTable填补了实体类返回泛型集合的更多相关文章
- DataTable填充实体类返回泛型集合
昨天找坤哥看到我的一段代码.例如以下: 略微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程.坤哥看了之后问我.假设实体有500多个属性.难道 ...
- SpringMVC通过实体类返回json格式的字符串,并在前端显示
一.除了搭建springmvc框架需要的jar包外,还需要这两个jar包 jackson-core-asl-1.9.2.jar和jackson-mapper-asl-1.9.2.jar 二.web,. ...
- C#读取数据库返回泛型集合(DataSetToList)
一般我们用使用ADO.NET查询数据库返回泛型集合使用SqlDataReader逐行读取数据存入对象 代码 }
- ADO.Net创建数据模型和数据访问类及泛型集合
数据模型和数据访问类:数据模型: 使用面向对象中的封装特性,将数据表中的行数据组成一个同样结构的对象,来单独使用: 数据访问类: 将某一个表的全部增删改查操作的方法写进去,方便统一管理和调用: 数据模 ...
- 泛型学习第三天——C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
定义一个类: public class UserInfo { public System.Guid ID { get; set; } public string LoginName ...
- (转)DATATABLE(DATASET)与实体类之间的互转.
转自:http://www.cnblogs.com/zzyyll2/archive/2010/07/20/1781649.html dataset和实体类 之间的转换 //dataset转实体类 代 ...
- 【记录】spring boot 整合mybatis 实体类返回日期格式化
1:首先将返回的实体类的时间由Date类型 换成String类型 2:将mapper.xml里的created_time 不设置类型,并将查询字段时间格式化,注意此次查询需要使用别名 不然返回查不到此 ...
- 将java类的泛型集合转换成json对象
一般用extjs开发传输都是用json比较多,这个将来大家也许会用到... ConvertJsonUtils.java package com.sunweb.util.jsonfactory; imp ...
- java 封装返回结果实体类 返回结果以及错误信息
public class ResponseMessage { private final static String STATUS_OK = "0"; private final ...
随机推荐
- PHP监測memcache服务端的执行状况
. 代码例如以下,代码为memcache官方代码,引用在此.做一下简单的说明: 1.设置username和password define('ADMIN_USERNAME','admin'); // A ...
- CH BR4思考熊(恒等有理式-逆波兰表达式求值)
恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...
- JVM学习03_new对象的内存图讲解,以及引出static方法(转)
目录 -=-讲解对象创建过程中,-=-堆内存和栈内存的情况 -=-构造函数对类对象的成员变量的初始化过程 -=-构造函数出栈 -=-类的方法在不访问类对象的成员变量时造成的内存资源浪费怎么解决? -= ...
- 解压system.img
解压: All-Series:~$ simg2img system.img system.img.ext4 All-Series:~$ mkdir tmp All-Series:~$ mount -t ...
- 蓝缘管理系统第二个版本号开源了。springMVC+springSecurity3.x+Mybaits3.x 系统
蓝缘管理系统第二个版本号开源了 继于 http://blog.csdn.net/mmm333zzz/article/details/16863543 版本号一.版本号二 对springMVC+spri ...
- Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十三)
今天我们实验libvirt提供的快照功能,快照可以用于系统恢复,防止安装了某些软件或中病毒等情况导致系统损毁的情况. 一.快照类型 1) 磁盘快照 内部的:快照驻留在原来的镜像文件内部 ...
- unity3d由于Camera.main.transform报空引用错误的解决方案
今天在导入character包后,引用了内置的第三人称素材,但是在启动的时候程序报空引用的错误: 引起错误的位置在: 错误原因是因为没有将摄像机的tag设置为maincamera,改为maincame ...
- MySQL与Oracle的语法区别详细对比 (转)
Oracle和mysql的一些简单命令对比 1) SQL> select to_char(sysdate,'yyyy-mm-dd') from dual; SQL> select to_c ...
- IOS加强知识(1)理解力Objective-C
一直想写一般Objective-C帖子,总是没时间.所以,我希望有一个巨大的知识更小.温馨提示小的变化.写一点点,每天.东西把他们的学习分享,好了废话不多. 1.一门动态的语言OC Object-C( ...
- MATLAB导入数据importdata功能
用load函数导入mat文件大家都会.可是今天我拿到一个数据,文件后缀名竟然是'.data'.该怎么读呢? 我仅仅好用matlab界面Workspace区域的"import data&quo ...