我在数据库表中有4条记录。该表具有id、name、score1、score2、score3、total、email列。每个记录具有不同的电子邮件。代码的目的是循环通过每个记录,通过记录“ID”为每个记录生成PDF,并将PDF作为电子邮件发送到记录的电子邮件值。我使用了while循环,但我很努力地尝试,我的代码生成了所有记录的PDF,并发送给每个收件人的电子邮件。'我只希望它只生成每个记录的PDF,并一次发送给收件人电子邮件'。我真的不知道我错在哪里。
try{
String sql="select * from score_table where id=score_table.id";
pst=con.prepareStatement(sql);
rs=pst.executeQuery();
// Loop through each record
while (rs.next()) {
// Retrieve data for current record
String name = rs.getString("name");
String score1 = rs.getString("score1");
String score2 = rs.getString("score2");
String score3 = rs.getString("score3");
String score4 = rs.getString("score4");
int total = rs.getInt("total");
String recipientEmail = rs.getString("email");
// Create parameters for the report
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", name);
parameters.put("score1", score1);
parameters.put("score2", score2);
parameters.put("score3", score3);
parameters.put("score4", score4);
parameters.put("total", total);
// Load report template
JasperReport jasperReport = JasperCompileManager.compileReport("studentSco.jrxml");
// Populate report with data
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, con);
// Export report to PDF file
byte[] pdfBytes = JasperExportManager.exportReportToPdf(jasperPrint);
// Create new email message
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("rodysoftonline@gmail.com", "wdmssbarmwfgxxxw");
}
});
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("rodysoftonline@gmail.com"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientEmail));
message.setSubject("Report for " + name);
MimeBodyPart attachment = new MimeBodyPart();
ByteArrayDataSource source = new ByteArrayDataSource(pdfBytes, "application/pdf");
attachment.setDataHandler(new DataHandler(source));
attachment.setFileName("report_" + name + ".pdf");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(attachment);
message.setContent(multipart);
// Send email
Transport.send(message);
System.out.println("email sent successfully");
}
}catch(SQLException | MessagingException | JRException e){
JOptionPane.showMessageDialog(null,e);
}
// Close database connection and resources
finally{
try{
rs.close();
pst.close();
}
catch(SQLException e){
}
}
这就是我目前所拥有的。虽然它在while循环中,但它只为所有记录生成一次pdf,并发送到记录中的每个电子邮件。我希望它只为每个记录生成PDF并发送到记录的电子邮件,生成下一个记录的PDF,发送到电子邮件等…直到完成表中的所有记录
1条答案
按热度按时间jogvjijk1#
下面是我如何重构你的代码。我最终得到了四个接口和四个类。您需要为其中两个接口添加实现。
首先对数据进行封装-
User
:我使用运行在JDK 17下的IntelliJ 2023.1创建了User类。这可能是使用记录类的一个很好的例子。
创建一个接口
UserRepository
和一个实现,它只与关系数据库交互:下面是一个实现:
存储库实现使用
RowMapper
接口和UserMapper
实现:下面是
UserMapper
的实现:碧玉报告生成器和电子邮件客户端有以下接口:
这是比你的单一方法更多的类。这种方法有几个优点:
看看这个方法是否对你有帮助。