字符串不能转换为 DAO Receiver
Posted
技术标签:
【中文标题】字符串不能转换为 DAO Receiver【英文标题】:Strings can not be converted to DAO Receiver 【发布时间】:2019-08-15 17:17:12 【问题描述】:我正在尝试使用列表对象执行批量插入操作,但在插入时,我无法将字符串转换为 DAO。迭代器循环中的接收器。
我试图列出列表对象,当时它正在打印列表中的值。但是,当我使用泛型是正常列表时,它显示错误,我没有找到任何插入的解决方案 通过这种方法,我正在读取 excel 文件并存储到列表中
public List collect(Receiver rec)
//ReadFromExcel rd = new ReadFromExcel();
List<String> up = new ArrayList<String>();
//List<String> details = rd.reader();
//System.out.println(details);
try( InputStream fileToRead = new FileInputStream(new File(rec.getFilePath())))
XSSFWorkbook wb = new XSSFWorkbook(fileToRead);
wb.setMissingCellPolicy(Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
XSSFSheet sheet = wb.getSheetAt(0);
DataFormatter fmt = new DataFormatter();
String data ="";
for(int sn = 0;sn<wb.getNumberOfSheets()-2;sn++)
sheet = wb.getSheetAt(sn);
for(int rn =sheet.getFirstRowNum();rn<=sheet.getLastRowNum();rn++)
Row row = sheet.getRow(rn);
if(row == null)
System.out.println("no data in row ");
else
for(int cn=0;cn<row.getLastCellNum();cn++)
Cell cell = row.getCell(cn);
if(cell == null)
// System.out.println("no data in cell ");
// data = data + " " + "|";
else
String cellStr = fmt.formatCellValue(cell);
data = data + cellStr + "|";
up = Arrays.asList(data.split("\\|"));
// System.out.println(details);
catch (FileNotFoundException ex)
Logger.getLogger(BImplementation.class.getName()).log(Level.SEVERE, null, ex);
catch (IOException ex)
Logger.getLogger(BImplementation.class.getName()).log(Level.SEVERE, null, ex);
Iterator iter = up.iterator();
while(iter.hasNext())
System.out.println(iter.next());
String row="";
Receiver info = null;
String cid = "";
String cname = "";
String address = "";
String mid = "";
boolean b = false;
List<Receiver> res = new ArrayList<Receiver>();
int c = 0;
try
String str = Arrays.toString(up.toArray());
//System.out.println(str);
String s = "";
s = s + str.substring(1,str.length());
// System.out.println("S:"+s);
StringTokenizer sttoken = new StringTokenizer(s,"|");
int count = sttoken.countTokens();
while(sttoken.hasMoreTokens())
if(sttoken.nextToken() != null)
// System.out.print(sttoken.nextToken());
cid = sttoken.nextToken();
cname = sttoken.nextToken();
address = sttoken.nextToken();
mid = sttoken.nextToken();
info = new Receiver(cid,cname,address,mid);
res.add(info);
System.out.println("cid :"+cid+ " cname : "+cname +" address : "+address+" mid : "+mid);
c = res.size();
// System.out.println(c);
else
break;
System.out.println(count);
// System.out.println("s");
catch(NoSuchElementException ex)
System.out.println("No Such Element Found Exception" +ex);
return up;
我正在尝试使用这种方法插入数据库
public boolean insert(List res)
String sqlQuery = "insert into records(c_id) values (?)";
DBConnection connector = new DBConnection();
boolean flag = false;
// Iterator itr=res.iterator();
// while(it.hasNext())
//
// System.out.println(it.next());
//
try( Connection con = connector.getConnection();)
con.setAutoCommit(false);
PreparedStatement pstmt = con.prepareStatement(sqlQuery);
Iterator it = res.iterator();
while(it.hasNext())
Receiver rs =(Receiver) it.next();
pstmt.setString(1,rs.getcID());
pstmt.setString(2,rs.getcName());
pstmt.setString(3,rs.getAddress());
pstmt.setString(4,rs.getMailID());
pstmt.addBatch();
int [] numUpdates=pstmt.executeBatch();
for (int i=0; i < numUpdates.length; i++)
if (numUpdates[i] == -2)
System.out.println("Execution " + i +": unknown number of rows updated");
flag=false;
else
System.out.println("Execution " + i + "successful: " + numUpdates[i] + " rows updated");
flag=true;
con.commit();
catch(BatchUpdateException b)
System.out.println(b);
flag=false;
catch (SQLException ex)
Logger.getLogger(BImplementation.class.getName()).log(Level.SEVERE, null, ex);
System.out.println(ex);
flag=false;
return flag;
我想使用 JDBC 批量插入将列表对象插入到数据库中。
【问题讨论】:
字符串不是任何类型的接收器。该错误消息非常清楚为什么会抛出它。 泛型从 Java 5 开始就存在并且允许拥有类型安全的集合。 Java 5 于 2004 年问世。我们在 15 年后的 2019 年,您仍然使用原始 List 类型,因此显然会因此而出现运行时异常。不要使用原始类型。如果列表应该是接收者列表,那么它的类型应该是List<Receiver>
,而不是List
。它应该命名为receivers
,而不是res
。
您在列表中存储了哪些对象?当您执行转换操作 (Receiver) it.next(); 时,它期望列表中的这个元素是一个 Receiver 对象。
请在您创建此列表的位置添加代码。
@Reynard 我更新了代码请检查一次
【参考方案1】:
您的方法 collect(Receiver rec) 返回名为 up 的字符串列表。
return up;
但是(如果您确实使用方法 collect 将 List 传递给 insert(List res) 方法),您希望此列表包含 Receiver 对象。这是不正确的,因为它 collect(..) 返回字符串列表。
当您尝试投射时会导致错误 Receiver rs =(Receiver) it.next();
您需要检查并修复您的代码,因此您将传递 Receiver 对象列表而不是字符串。
我真的建议您在使用 List 类的任何地方开始使用泛型。在这种情况下,编译器会立即显示所有数据类型错误。
【讨论】:
以上是关于字符串不能转换为 DAO Receiver的主要内容,如果未能解决你的问题,请参考以下文章