DataTable和java使用泛型的好处哪个好

VB.NET(7)
& & & & &一开始重构的时候是用的DataTable,后来师父说要转为泛型,当初很不理解,为什么要这样呢?
& & & & & DataTable和泛型哪个好?
& & & & & 答案是各有千秋……每一样东西都不可能是完美的,各有各的好处和缺点,如果完全能够被另外一种更先进的代替,那么这个东东就会被淘汰了。
& & & & & ①操作方便:DataTable
& & & & & & & 访问方便:EntityList &
& & & & & ②按需索取那就是 泛型
& & & & & & & 不管什么全部取出来 就用 datatable
二、DataTable的坏处
& & & & & 无论是何种情况,使用DataTable不可避免的要填写读取的字段,这样做的坏处不言而喻:
& & & & & & ⑴非常容易写错,而且编译器不检查。
& & & & & & ⑵必须了解数据库的结构。
& & & & & & ⑶不符合面向对象编程思想。
& & & & & & ⑷DataTable为弱类型,无法直观的看出字段的数据类型。
三、泛型优点
& & & & & 实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,存放到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。
& & & & & 试想一下,这样一来,传到B层或U层的将是一个实体类集合,读取数据将会是如下场景:list[0].
& & & & & 这样做的优点如下:
& & & & & & ⑴编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况。
& & & & & & ⑵不必了解数据库结构。
& & & & & & ⑶符合面向对象思想。
& & & & & & ⑷实体类的属性是强类型,每个字段的类型都是已知的。
四、转换方法
& & & & & & & 要想从DataTable转换成泛型,很简单,首先将DataTable类型的数据全部转化为实体,将实体提取出来放到一个泛型集合中,返回这个集合,下面以一个Demo为例讲解如何使用泛型:
& & & & 1、首先有一个实体转换的类来完成这个转换:
'将datatable转化为泛型集合
Public Shared Function convertToList(Of Turn As {New})(ByVal table As DataTable) As IList(Of Turn)
'convertToList(Of Turn As {New}) 这里的new是用来约束T的
Dim myList As New List(Of Turn)
'定义最终返回的集合
Dim myTpye As Type = GetType(Turn) '得到实体类的类型名
Dim dr As DataRow
'定义行集
Dim tempName As String = String.Empty
'定义一个临时变量
'遍历DataTable的所有数据行
For Each dr In table.Rows
Dim myTurn As New Turn
'定义一个实体类的对象
Dim propertys() As PropertyInfo = myTurn.GetType().GetProperties()
'定义属性集合
Dim Pr As PropertyInfo
'遍历该对象的所有属性
For Each Pr In propertys
tempName = Pr.Name '将属性名称赋值给临时变量
If (table.Columns.Contains(tempName)) Then
'将此属性与datatable里的列明比较,查看datatable是否包含此属性
'判断此属性是否有Setter
If (Pr.CanWrite = False) Then
'判断此属性是否可写,如果不可写,跳出本次循环
Continue For
Dim value As Object = dr(tempName)
'定义一个对象型的变量来保存列的值
If (value.ToString && DBNull.Value.ToString()) Then '如果非空,则赋给对象的属性
Pr.SetValue(myTurn, value, Nothing)
'在运行期间,通过反射,动态的访问一个对象的属性
myList.Add(myTurn)
'添加到集合
Return myList
'返回实体集合
End Function& & & & &2、在D层中我们每次将用table接收的数据,利用convertEntityToList函数进行转换即可,它的含义就是遍历表中的各个属性,将表中的每一行记录作为一个对象。
&strong&&span style=&font-size:18&&Dim mylist As New List(Of Entity.StudentCardEntity)
Dim table As DataTable
table = SqlHelper.SqlHelper.GetDataTable(sql, CommandType.Text, paras)
mylist = SqlHelper.SqlHelper.convertEntityToList(Of Entity.StudentCardEntity)(table)
Return mylist
&/span&&/strong&& & & & & & &&
& & & & & &说的好像有点混乱,希望能给大家帮助!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:28983次
积分:3626
积分:3626
排名:第6219名
原创:81篇
评论:1596条
阅读:4009
(2)(3)(5)(6)(4)(1)(5)(7)(5)(4)(4)(4)(6)(2)(10)(2)(4)(4)(3)(2)(1)DataTable与泛型
刚刚开始机房重构的时候用的最多的就是DataTable,在用的时候感觉有一点点别扭,因为D层从中
把数据取出来之后直接通过DataTable返回到B层和U层了,这样对于数据库数据的安全性不太好。然后慢慢知
道了泛型,通过泛型可以很好的解决数据安全的问题
一、DataTable
Public Function QueryCard(card As Entity.CardEntity) As Entity.CardEntity Implements ICard.QueryCard
Dim helper As New SqlHelper()
'实例化SqlHelper的对象为helper
Dim dt As DataTable
'接收从SqlHelper中返回的DataTable
Dim CardInfo As Entity.CardEntity = New Entity.CardEntity()
Dim Query As String = "select * from card_info where cardno=@cardno"
'存储Sql字段
'实例化SqlParameter,并传入参数
Dim sqlParams As SqlParameter() = {New SqlParameter("@cardno", card.CardNo)}
dt = helper.ExecSelect(Query, sqlParams)
'调用对象helper的方法
'把DataTable中的数据分别放入实体CardInfo中对应的字段
CardInfo.CardNo = dt.Rows(0)(0)
CardInfo.Dates = dt.Rows(0)(5)
CardInfo.Time = dt.Rows(0)(6)
CardInfo.Status = dt.Rows(0)(7)
CardInfo.IsCheck = dt.Rows(0)(8)
CardInfo.Explain = dt.Rows(0)(9)
CardInfo.CardType = dt.Rows(0)(1)
CardInfo.Cash = dt.Rows(0)(2)
CardInfo.StudentNo = dt.Rows(0)(3)
Catch ex As Exception
'出错以后的提示
MsgBox("卡号不存在或错误", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "提示")
Return CardInfo
'返回实体
End Function
这是把DataTable中的数据在D层中直接赋值给实体了,个人认为这样做会相对好一点,因为从数据库
取得的数据不会直接返回给U层和B层;当然也可以在D层直接将获得的DataTable返回给U层B层,然后在U层
对DataTable中的数据进行操作,很明显这样对数据来说是很不安全的,而且三层之间通过DataTable传输
数据也会增加三层的耦合度
'DataTable转换为泛型
Public Shared Function ConvertList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)
Dim MyList As New List(Of T)
'定义返回的集合
Dim Mytype As Type = GetType(T)
'得到类型名
Dim dr As DataRow
'定义DataTable的行集
Dim TmpName 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
'PropertyInfo的实例化
'遍历pr对象在集合中的所有属性
For Each pr In Propertys
TmpName = pr.Name
'属性名称赋值给定义的临时变量
'检查DataTable中是否包含此属性,如果包含继续执行
If (dt.Columns.Contains(TmpName)) Then
If (pr.CanWrite = False) Then
'判断属性是否可写,如果不可写跳出本次循环
Continue For
Dim Value As Object = dr(TmpName) '定义对象型的变量保存列的值
'如果非空,给对象属性赋值
If (Value.ToString
DBNull.Value.ToString()) Then
pr.SetValue(MyT, Value, Nothing)
'通过反射,动态访问对象属性并赋值
MyList.Add(MyT)
'把获得的属性添加到集合中
Return MyList
'返回集合
End Function
D层直接调用该方法即可
Public Function SelectStudent(ByVal student As Entity.StudentEntity) As IList(Of Entity.StudentEntity) Implements ISelectStudent.SelectStudent
Dim helper As New SqlHelper
Dim dt As DataTable
Dim sql As String = "select * from student_info where studentno=@studentno"
Dim stuInfo As List(Of Entity.StudentEntity)
Dim para As SqlParameter() = {New SqlParameter("@studentno", student.StudentNo)} '调用SqlHelper方法
dt = helper.ExecSelect(sql, para)
'DataTable类型转换为泛型
stuInfo = Entity.Genericity.ConvertList(Of Entity.StudentEntity)(dt)
Return stuInfo
End Function
这样通过泛型的转换可以让B层和D层之间解耦,泛型定义的类型限制也可以在很大程度上保证数据的安
在使用泛型的时候一定要注意数据类型,实体中的数据类型与数据库的数据类型一定要保持一直
在多用一些自己没用的技术,对自己很有帮助的。。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'数据源用dataTable还是泛型集合好?
[问题点数:40分,结帖人cal_wu]
数据源用dataTable还是泛型集合好?
[问题点数:40分,结帖人cal_wu]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2016年7月 .NET技术大版内专家分月排行榜第一
2016年6月 .NET技术大版内专家分月排行榜第二2016年3月 .NET技术大版内专家分月排行榜第二2016年1月 .NET技术大版内专家分月排行榜第二2015年12月 .NET技术大版内专家分月排行榜第二2015年2月 .NET技术大版内专家分月排行榜第二2015年1月 .NET技术大版内专家分月排行榜第二2014年11月 .NET技术大版内专家分月排行榜第二2014年5月 .NET技术大版内专家分月排行榜第二2014年4月 .NET技术大版内专家分月排行榜第二2012年2月 多媒体/设计/Flash/Silverlight 开发大版内专家分月排行榜第二
2014年4月 扩充话题大版内专家分月排行榜第三
2010年 总版技术专家分年内排行榜第一2009年 总版技术专家分年内排行榜第一
2011年 总版技术专家分年内排行榜第二
本帖子已过去太久远了,不再提供回复功能。机房收费系统(13)
& &&重构刚开始敲的时候一直用的是DataTable,等到了做查询余额的时候发现一个个的显示到窗体的时候很是麻烦,要知道字段在数据库中对应的位置,这样就破坏了七层的结构,使得程序的耦合性增强,在这种情况下,我们可以去使用泛型,结合着DataTable和泛型的一些基本知识,下面在说DataTable和泛型之间的区别。
&Datatable是一个临时保存数据的网格,是一个虚拟表。我们在使用Datatable时,通过D层直接将数据库中的数据选出来,返回到B层和U层,在返回的时候我们要是想显示到窗体,就需要将U层的文本框与这个表中的字段一一对应。如果不小心就会写错,然后数据显示就不对。这样对数据库的耦合性太大,不能保证数据库的安全性。
泛型听起来很高深的一个词,但实际上它的作用很简单,就是提高程序的性能.比如在计算机中经常用到一些数据结构,如队列,链表等,而其中的元素以前一般这么定义:object a=new object();这样就带来一个严重的问题,用object来表示元素没有逻辑问题,但每次拆箱、封箱就占用了大量的计算机资源,导致程序性能低下,而这部分内容恰恰一般都是程序的核心部分,如果使用object,那么程序的表现就比较糟糕.而使用泛型则很好的解决这个问题,本质就是在编译阶段就告诉编译器,数据结构中元素的种类,既然编译器知道了元素的种类,自然就避免了拆箱、封箱的操作,从而显著提高c#程序的性能.比如List就直接使用string对象作为List的元素,而避免使用object对象带来的封箱、拆箱操作,从而提高程序性能。
在架构中实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。这样一来,传到B层或U层的将是一个实体类的泛型集合。使用泛型集合传递数据,编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况;你不必了解数据库结构;符合面向对象思想。
下面以查询学生余额功能来展示泛型集合的使用,因为我们在机房收费系统的时候有多个查询功能,而我们通过Sqlhelper类返回的都是DataTable,所以我们需要多次进行泛型集合的转换,为了体现代码的复用,我们将这个转换的方法抽象出单独的一个类放在D层,以供调用。
&span style=&font-family:KaiTi_GB2312;font-size:18&&'将datatable转化为泛型集合
Public Shared Function convertToList(Of Turn As {New})(ByVal table As DataTable) As IList(Of Turn)
'convertToList(Of Turn As {New}) 这里的new是用来约束T的
Dim myList As New List(Of Turn)
'定义最终返回的集合
Dim myTpye As Type = GetType(Turn) '得到实体类的类型名
Dim dr As DataRow
'定义行集
Dim tempName As String = String.Empty
'定义一个临时变量
'遍历DataTable的所有数据行
For Each dr In table.Rows
Dim myTurn As New Turn
'定义一个实体类的对象
Dim propertys() As PropertyInfo = myTurn.GetType().GetProperties()
'定义属性集合
Dim Pr As PropertyInfo
'遍历该对象的所有属性
For Each Pr In propertys
tempName = Pr.Name '将属性名称赋值给临时变量
If (table.Columns.Contains(tempName)) Then
'将此属性与datatable里的列明比较,查看datatable是否包含此属性
'判断此属性是否有Setter
If (Pr.CanWrite = False) Then
'判断此属性是否可写,如果不可写,跳出本次循环
Continue For
Dim value As Object = dr(tempName)
'定义一个对象型的变量来保存列的值
If (value.ToString && DBNull.Value.ToString()) Then '如果非空,则赋给对象的属性
Pr.SetValue(myTurn, value, Nothing)
'在运行期间,通过反射,动态的访问一个对象的属性
myList.Add(myTurn)
'添加到集合
Return myList
'返回实体集合
End Function
在D层中我们每次将用table接收的数据,利用convertToList函数进行转换即可,它的含义就是遍历表中的各个属性,将表中的每一行记录作为一个对象。
&span style=&font-family:KaiTi_GB2312;font-size:18&&Dim mylist As New List(Of Entity.StudentCardEntity)
Dim table As DataTable
table = SqlHelper.SqlHelper.GetDataTable(sql, CommandType.Text, paras)
mylist = SqlHelper.SqlHelper.convertToList(Of Entity.StudentCardEntity)(table)
Return mylist
&/span&&/strong&
&/span&【总结】
《夏目友人帐》中夏目说过这样一句话:“我寂寞的时候,会害怕踏出第一步,不会想到要去做什么事,所以,可能没有发觉很多很多东西”。在学习的过程中也是我们每当要学习心得知识的时候,总是想到这个会怎么怎么难,从一开始就否定了知识也否定了自己,因此,我们错过了很多学习的机会。其实知识并不可怕,可怕的是自己先觉得可怕,所以just do it!!!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9485次
积分:3107
积分:3107
排名:第7765名
原创:47篇
评论:1061条
(2)(5)(3)(5)(3)(3)(5)(4)(4)(2)(3)(4)(4)关于datatable,dataset,还有list泛型,到底哪个更好一些???-.NET技术/ASP.NET-asp.net-电脑编程网关于datatable,dataset,还有list泛型,到底哪个更好一些???-.NET技术/ASP.NET作者:yasire 和相关&&一开始我都用datatable,后来老师教给了我们list&&+实体类的方法,我感觉很好用,就一直用泛型。后来去面试,人家都用的dataTable。我想问下,到底哪个更好些?各有什么优缺点?------回答---------------其他回答(5分)---------各有各的用处吧。 &有的地方必须得用dataset,但现在尽量用datatable,实体类还是用list&&------其他回答(5分)---------list中的每一个对象实体是datatable的每一行。直接用datatable更方便,不需要编写对象,不需要一个一个的添加到列表。------其他回答(5分)---------List中的每个对象实体跟datatable的datarow比较一下,datarow中有很多不必要的冗余的东西。至于你说的面试的时候人家都用datatable,个人感觉纯属习惯问题,早期vs2003做开发没有泛型这个东东,大家都习惯了datatable。------其他回答(5分)---------datatable比较小------其他回答(5分)---------引用 1 楼 king 的回复:各有各的用处吧。 有的地方必须得用dataset,但现在尽量用datatable, 实体类还是用list &&根据需要 一般实际用得是datatable但是不止一个表时候就用dataset列表就用list------其他回答(5分)---------个人感觉DataTable 简单相关资料:|||||||关于datatable,dataset,还有list泛型,到底哪个更好一些???-.NET技术/ASP.NET来源网络,如有侵权请告知,即处理!编程Tags:                &                    }

我要回帖

更多关于 java泛型好处 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信