利用反射把查询到的Table、Reader转换成List、Model

本文介绍了一种使用反射技术将数据库查询结果(DataReader或DataTable)转换为List或Model对象的方法,该方法可以有效减少代码修改的工作量,并提高代码的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

菜鸟一枚,入园已有两年三个月,这还是第一次写博客,请各位大神斧正。

 

这是我写的一个工具类,通常我们从数据库查询到一个  DataReader  或者是  一个 Table , 想要转换成 一个 list 或者是 一个model 的话 , 一般情况下是使用foreach 循环reader或是tablerows,然后在循环内创建个对象,通过reader[“列名”]来赋值对象的属性。如果表的字段少的话,用这种方式还可以,速度也快一点。但是如果后续还会增加字段的话,那就非常麻烦了,要改很多地方。这工作量太大了,而且还很容易出错。所以这个时候使用反射来转换的话就非常便捷了。我们只管增加字段,改一下数据表对应的model,调用这个工具类的方法,传入相对应的参数就能得到想要的结果。

 

诶,文笔不好,直接上代码吧。

  1 public class DynamicGeneric
  2     {
  3         /// <summary>
  4         /// table转list
  5         /// </summary>
  6         /// <typeparam name="T">list类型</typeparam>
  7         /// <param name="obj">model对象</param>
  8         /// <param name="table">数据源table</param>
  9         /// <returns>list</returns>
 10         public static List<T> FillListByDataTable<T>(T obj, DataTable table)
 11         {
 12 
 13             Type type = obj.GetType();
 14 
 15             List<T> list = new List<T>();
 16 
 17             PropertyInfo[] properties = type.GetProperties();//model对象的属性集合
 18 
 19             DataColumnCollection dcc = table.Columns;//列集合
 20 
 21             foreach (DataRow row in table.Rows)
 22             {
 23                 //复制一个model对象
 24                 MemoryStream stream = new MemoryStream();
 25                 BinaryFormatter formatter = new BinaryFormatter();
 26                 formatter.Serialize(stream, obj);
 27                 stream.Position = 0;
 28                 T newObj = (T)formatter.Deserialize(stream);
 29 
 30                 foreach (PropertyInfo pro in properties)
 31                 {
 32                     Type tp = pro.PropertyType;
 33 
 34                     if (dcc.Contains(pro.Name.ToString()))
 35                     {
 36                         if (!string.IsNullOrEmpty(row[pro.Name].ToString()))
 37                         {
 38                             //判断字段类型
 39                             if (tp.Name != "Nullable`1")
 40                             {
 41                                 pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], tp, null));
 42                             }
 43                             if (tp.Name != "Nullable`1")
 44                             {
 45                                 pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], tp));
 46                             }
 47                             else if (tp.FullName.IndexOf("System.DateTime") > 0)
 48                             {
 49                                 pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(DateTime), null));
 50                             }
 51                             else if (tp.FullName.IndexOf("System.Int32") > 0)
 52                             {
 53                                 pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(Int32), null));
 54                             }
 55                             else if (tp.FullName.IndexOf("System.Int64") > 0)
 56                             {
 57                                 pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(Int64), null));
 58                             }
 59                             else if (tp.FullName.IndexOf("System.Decimal") > 0)
 60                             {
 61                                 pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(Decimal), null));
 62                             }
 63                             else if (tp.FullName.IndexOf("System.Boolean") > 0)
 64                             {
 65                                 pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(Boolean), null));
 66                             }
 67                         }
 68 
 69                     }
 70                 }
 71                 list.Add(newObj);
 72             }
 73             return list;
 74         }
 75 
 76         /// <summary>
 77         /// reader转list
 78         /// </summary>
 79         /// <typeparam name="T">list类型</typeparam>
 80         /// <param name="obj">model对象</param>
 81         /// <param name="reader">数据源reader</param>
 82         /// <returns>list </returns>
 83         public static List<T> FillListByDataReader<T>(T obj ,IDataReader reader)
 84         {
 85             List<T> list = new List<T>();
 86 
 87             Type t = obj.GetType();
 88 
 89             PropertyInfo[] proList = t.GetProperties();
 90 
 91             while(reader.Read())
 92             {
 93                 MemoryStream stream = new MemoryStream();
 94                 BinaryFormatter formatter = new BinaryFormatter();
 95                 formatter.Serialize(stream, obj);
 96                 stream.Position = 0;
 97                 T newObj = (T)formatter.Deserialize(stream);
 98 
 99                 foreach (PropertyInfo pro in proList)
100                 {
101                     Type tp = pro.PropertyType;
102 
103                     DataFieldAttribute attr = pro.GetCustomAttributes().Count() > 0 ? pro.GetCustomAttributes().First() as DataFieldAttribute : null;
104 
105                     if (attr != null && attr.ColumnName == pro.Name)
106                     {
107                         if (ReaderExists(reader, pro.Name) && !string.IsNullOrEmpty(reader[pro.Name].ToString()))
108                         {
109                             if (tp.Name != "Nullable`1")
110                             {
111                                 pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], tp));
112                             }
113                             else if (tp.FullName.IndexOf("System.DateTime") > 0)
114                             {
115                                 pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(DateTime), null));
116                             }
117                             else if (tp.FullName.IndexOf("System.Int32") > 0)
118                             {
119                                 pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(Int32), null));
120                             }
121                             else if (tp.FullName.IndexOf("System.Int64") > 0)
122                             {
123                                 pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(Int64), null));
124                             }
125                             else if (tp.FullName.IndexOf("System.Decimal") > 0)
126                             {
127                                 pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(Decimal), null));
128                             }
129                             else if (tp.FullName.IndexOf("System.Boolean") > 0)
130                             {
131                                 pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(Boolean), null));
132                             }
133                         }
134                     }
135                 }
136                 list.Add(newObj);
137             }
138 
139             return list;
140         }
141 
142         /// <summary>
143         /// reader转model对象
144         /// </summary>
145         /// <typeparam name="T">类型</typeparam>
146         /// <param name="obj">model对象</param>
147         /// <param name="reader">数据源reader</param>
148         /// <returns>model对象</returns>
149         public static T FillObjectByDataReader<T>(T obj, IDataReader reader)
150         {
151             Type t = obj.GetType();
152 
153             PropertyInfo[] proList = t.GetProperties();
154 
155             if (reader.Read())
156             {
157                 foreach (PropertyInfo pro in proList)
158                 {
159                     Type tp = pro.PropertyType;
160 
161                     DataFieldAttribute attr = pro.GetCustomAttributes().Count() > 0 ? pro.GetCustomAttributes().First() as DataFieldAttribute : null;
162 
163                     if (attr != null && attr.ColumnName == pro.Name)
164                     {
165                         if (ReaderExists(reader, pro.Name) && !string.IsNullOrEmpty(reader[pro.Name].ToString()))
166                         {
167                             if (tp.Name != "Nullable`1")
168                             {
169                                 pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], tp));
170                             }
171                             else if (tp.FullName.IndexOf("System.DateTime") > 0)
172                             {
173                                 pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(DateTime), null));
174                             }
175                             else if (tp.FullName.IndexOf("System.Int32") > 0)
176                             {
177                                 pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(Int32), null));
178                             }
179                             else if (tp.FullName.IndexOf("System.Int64") > 0)
180                             {
181                                 pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(Int64), null));
182                             }
183                             else if (tp.FullName.IndexOf("System.Decimal") > 0)
184                             {
185                                 pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(Decimal), null));
186                             }
187                             else if (tp.FullName.IndexOf("System.Boolean") > 0)
188                             {
189                                 pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(Boolean), null));
190                             }
191                         }
192                     }
193                 }
194             }
195 
196             return obj;
197         }
198 
199         /// <summary>
200         /// row转model对象
201         /// </summary>
202         /// <typeparam name="T">model类型</typeparam>
203         /// <param name="obj">model对象</param>
204         /// <param name="row">数据源row</param>
205         /// <returns>model对象</returns>
206         public static T FillObjectByDataTable<T>(T obj, DataRow row)
207         {
208             Type t = obj.GetType();
209 
210             PropertyInfo[] proList = t.GetProperties();
211 
212             foreach (PropertyInfo pro in proList)
213             {
214                 Type tp = pro.PropertyType;
215 
216                 DataFieldAttribute attr = pro.GetCustomAttributes().Count() > 0 ? pro.GetCustomAttributes().First() as DataFieldAttribute : null;
217 
218                 if (attr != null && attr.ColumnName == pro.Name)
219                 {
220                     if (!string.IsNullOrEmpty(row[pro.Name].ToString()))
221                     {
222                         if (tp.Name != "Nullable`1")
223                         {
224                             pro.SetValue(obj, Convert.ChangeType(row[pro.Name], tp, null));
225                         }
226                         if (tp.Name != "Nullable`1")
227                         {
228                             pro.SetValue(obj, Convert.ChangeType(row[pro.Name], tp));
229                         }
230                         else if (tp.FullName.IndexOf("System.DateTime") > 0)
231                         {
232                             pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(DateTime), null));
233                         }
234                         else if (tp.FullName.IndexOf("System.Int32") > 0)
235                         {
236                             pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(Int32), null));
237                         }
238                         else if (tp.FullName.IndexOf("System.Int64") > 0)
239                         {
240                             pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(Int64), null));
241                         }
242                         else if (tp.FullName.IndexOf("System.Decimal") > 0)
243                         {
244                             pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(Decimal), null));
245                         }
246                         else if (tp.FullName.IndexOf("System.Boolean") > 0)
247                         {
248                             pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(Boolean), null));
249                         }
250                     }
251 
252                 }
253             }
254 
255 
256             return obj;
257         }
258 
259         /// <summary>
260         /// list转table
261         /// </summary>
262         /// <typeparam name="T">list类型</typeparam>
263         /// <param name="list">数据源list</param>
264         /// <param name="table">table</param>
265         /// <returns>table</returns>
266         public static DataTable FillDataTableByObject<T>(List<T> list , DataTable table)
267         {
268             if (list.Count > 0)
269             {
270                 Type type = list[0].GetType();
271 
272                 PropertyInfo[] properties = type.GetProperties();
273 
274                 DataColumnCollection dcc = table.Columns;
275 
276                 foreach (var obj in list)
277                 {
278                     DataRow row = table.NewRow();
279                     foreach (PropertyInfo p in properties)
280                     {
281                         if (dcc.Contains(p.Name.ToString()))
282                         {
283                             row[p.Name] = p.GetValue(obj);
284                         }
285                     }
286                     table.Rows.Add(row);
287                 }
288             }
289             return table;
290         }
291 
292         /// <summary>
293         /// 验证reader是否存在某列
294         /// </summary>
295         /// <param name="reader"></param>
296         /// <param name="columnName"></param>
297         /// <returns></returns>
298         private static bool ReaderExists(IDataReader reader,string columnName)
299         {
300             int count = reader.FieldCount;
301             for(int i = 0; i < count; i++)
302             {
303                 if(reader.GetName(i).Equals(columnName))
304                 {
305                     return true;
306                 }
307             }
308             return false;
309         }
310 
311         
312     }

 

转载于:https://www.cnblogs.com/lifuquan/p/5466043.html

<think>根据错误描述,问题可能是由于代码中同时使用了java.util.List和java.awt.List,导致编译器无法确定使用哪个List类。在代码中,我们主要使用java.util.List,因此需要显式导入或使用全限定名。由于我们的代码中没有使用java.awt.List,所以应该检查导入部分是否同时导入了这两个包。解决方案:1.检查导入语句,确保只导入java.util.List,或者不导入List而使用全限定名。2.如果使用了java.awt.List,应该替换为java.util.List,并且变量名不要命名为list(避免混淆)。在我们的代码中,并没有使用java.awt.List,所以问题可能出现在导入语句中。在NetBeans中,有时会自动导入java.awt.List,特别是当我们在GUI编程时。修改建议:在文件开头检查导入语句,如果存在:importjava.awt.*;将其改为具体的类,或者删除,然后使用显式导入:importjava.util.ArrayList;importjava.util.Arrays;importjava.util.HashMap;importjava.util.HashSet;importjava.util.List;importjava.util.Map;importjava.util.Set;另外,在代码中,我们使用了List,ArrayList等,所以应该确保只导入java.util包下的集合类。由于原代码中可能导入了java.awt.List,我们可以修改导入部分,只导入需要的类。下面是修改后的导入部分(替换原来的import部分):</think> 问题发生在 Java 的命名空间冲突上。当同时导入多个包含 `List` 类的包时,编译器无法确定具体引用哪个 `List` 类。以下是解决方案和修正后的代码: ### 问题原因 Java 的 `java.util.List` 和 `java.awt.List` 都包含 `List` 类定义,当使用通配符导入时会引发冲突: ```java import java.awt.*; // 包含 java.awt.List import java.util.*; // 包含 java.util.List ``` ### 修复方案 1. **避免通配符导入** 2. **显式指定具体的 List 类型** 3. **使用全限定类名** 修正后的导入语句: ```java import java.sql.*; import java.util.List; // 显式导入所需接口 import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.swing.*; import java.awt.*; import java.io.*; // 移除 org.eclipse.jgit.util.io.LineReader(用替代方案) ``` ### 完整修正代码 ```java package academicmanager; import java.sql.*; import java.util.List; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.Collections; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.table.DefaultTableModel; public class AcademicManager { private static final String DB_URL = "jdbc:sqlite:academic.db"; private static final Set<String> STOP_WORDS = new HashSet<>(Arrays.asList( "the", "and", "in", "of", "to", "a", "is", "for", "with", "on" )); public static void main(String[] args) { SwingUtilities.invokeLater(() -> { MainFrame frame = new MainFrame(); frame.setVisible(true); }); } static class DatabaseManager { // ... 数据库管理代码保持不变 ... } static class BibtexParser { public static List<Map<String, String>> parse(File file) throws IOException { List<Map<String, String>> entries = new ArrayList<>(); // 替换LineReader为标准BufferedReader try (BufferedReader reader = new BufferedReader(new FileReader(file))) { Map<String, String> currentEntry = null; String line; while ((line = reader.readLine()) != null) { line = line.trim(); if (line.startsWith("@ARTICLE")) { currentEntry = new HashMap<>(); } else if (line.startsWith("}")) { entries.add(currentEntry); currentEntry = null; } else if (currentEntry != null && line.contains("=")) { String[] parts = line.split("=", 2); if (parts.length == 2) { String key = parts[0].trim().toLowerCase(); String value = parts[1].replaceAll("[\",}]", "").trim(); currentEntry.put(key, value); } } } } return entries; } } static class MainFrame extends JFrame { // ... 界面代码保持不变 ... // 修改displayResults方法确保使用正确类型 private void displayResults(List<Map<String, String>> results) { String[] columns = {"标题", "摘要", "关键词", "年份"}; DefaultTableModel model = new DefaultTableModel(columns, 0); for (Map<String, String> paper : results) { model.addRow(new Object[]{ paper.get("title"), paper.get("abstract"), paper.get("keywords"), paper.get("year") }); } resultTable.setModel(model); } } } ``` ### 关键修改点 1. **导入语句调整**: ```java import java.util.List; // 显式导入所需接口 import java.util.ArrayList; // 移除 import java.awt.*; ``` 2. **替换冲突的 LineReader**: ```java // 替换前 import org.eclipse.jgit.util.io.LineReader; // 替换后 try (BufferedReader reader = new BufferedReader(new FileReader(file))) ``` 3. **修复显示方法**: ```java // 使用DefaultTableModel避免类型歧义 DefaultTableModel model = new DefaultTableModel(columns, 0); model.addRow(new Object[]{...}); ``` ### 其他潜在改进 1. 添加缺失的`Iterator`导入(如果使用迭代器): ```java import java.util.Iterator; ``` 2. 处理`stream()`方法的兼容性问题(JDK8+): ```java wordCounts.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .limit(limit) .map(Map.Entry::getKey) .collect(Collectors.toList()); ``` 3. 添加必需的停用词: ```java private static final Set<String> STOP_WORDS = new HashSet<>(Arrays.asList( "the", "and", "in", "of", "to", "a", "is", "for", "with", "on", "as", "by", "that", "this" )); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值