上次程序得到的所有简历信息均都存在了Excel表中,但是最终要对这些数据进行去重的处理—-需要对获取到的每条简历信息与数据库的表内信息进行判断是否有重复的情况,新的数据才会存储在Excel表中,同时,也存在数据库的Resume的数据表中
连接数据库修改部分代码对于连接数据库的方法,我也是在网上找来的,现在写这篇博客的目的是自己重新回顾复习下以及与大家分享交流
这个就要使用另一个jar包了,下载链接如下,导入Java的工程里就能用了: http://download.csdn.net/detail/yixiesuifeng/9833096
我将连接数据库的代码封装成了一个方法,返回一个Connection连接对象,代码如下:
//连接数据库并打开,返回一个Connection对象 //连接数据库,返回Connection对象 public static Connection openMySql(){ /*数据库名称:a1 * 数据表名字:test1 * 端口号:3306 * 用户名:root * 密码:root * 以上信息需要提前准备好!!!*/ Connection con=null;//声明Connection对象 String driver = "com.mysql.jdbc.Driver";//驱动程序名 String url = "jdbc:mysql://localhost:3306/a1?useUnicode=true&characterEncoding=UTF-8";//URL指向要访问的数据库名mydata String user = "root";//MySQL配置时的用户名 String password = "root";//MySQL配置时的密码 try{ Class.forName(driver); //①getConnection()方法,连接数据库 con = DriverManager.getConnection(url,user,password); if(!con.isClosed()){ System.out.println("成功的连接上数据库!!!"); } }catch(ClassNotFoundException e){ System.out.println("数据库驱动异常!!!"); }catch(SQLException e){ System.out.println("sql语句的执行出现问题!!!"); } return con; }另外,在运行程序前要记得启动数据库的服务器,我电脑安装的时Apache服务器,端口是3306,数据库是从PHPAdmin的终端打开的。
既然返回的有对象,那么就在receive()的方法里调用了这个对象,另外,Connection co作为参数还需要传到其他的方法里面去调用,最后在receive()的方法里关闭数据库的连接con.close();
1、连接上数据库,即调用openMySql(),程序内的部分方法添加Connection的参数; 2、对每一封邮件都要进行解析,那么parseMessage(Connection con,Message …messages)内Connection参数也要添加了; 3、解析过程中要多添加一个判断语句,就是手机号的判断,在主题及时间判断完后再判断数据库表内是否有相同号码的存在…… 修改后的parseMessage()方法代码如下:
public static void parseMessage(Connection con,Message ...messages) throws MessagingException, IOException { if (messages == null || messages.length < 1) throw new MessagingException("未找到要解析的邮件!"); //58简历整理工具,使用正则表达式匹配相应的信息:姓名,性别,年龄,电话,邮箱,经验 Pattern p1 = Pattern.compile("<h3.*?>([\\s\\S]*)<span.*?>([\\s\\S]*)</span></h3>"); Pattern p2 = Pattern.compile("<label.*?>([\\s\\S]*)<span.*?><span.*?>([\\s\\S]*)</span></span></label>"); Pattern p3 = Pattern.compile("<ul.*?>[\\s]*?<li.*?>([^\n]*)</li>[\\s]*?<li.*?>([^\n]*)</li>[\\s]*?<li.*?>([^\n]*)</li>[\\s]*?<li.*?>([^\n]*)</li>[\\s\\S]*?</ul>"); Pattern p4 = Pattern.compile("<label.*?>([\\s\\S]*)<span.*?>([\\s\\S]*)</span></label>"); //斗米简历整理工具,使用正则表达式匹配相应的信息:姓名,性别,年龄,电话,邮箱,经验 //??? Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd_hh:mm:ss");//可以方便地修改日期格式 String nowDate = dateFormat.format( now ); System.out.println(nowDate); Calendar c = Calendar.getInstance();//可以对每个时间域单独修改 int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH)+1; int date = c.get(Calendar.DATE); try{ //创建及打开Excel表,存储58同城的简历信息 String path="C:\\resume\\58Resume"+year+"."+month+"."+date+".xlsx"; //String path="/Users/LiuDuan/workspace/temp_edm/58Resume"+year+"."+month+"."+date+".xlsx"; //InputStream is = new FileInputStream("C:\\Users\\yang\\Desktop\\ResumeData.xlsx");; WritableWorkbook wb = Workbook.createWorkbook(new File(path)); WritableSheet ws = wb.createSheet("Sheet1", 0); //创建及打开Excel表,存储58同城的简历信息 int j=0; int count = messages.length; // 解析所有邮件 for (int i = 130; i < count; i++) { MimeMessage msg = (MimeMessage) messages[i]; //解决邮件主题乱码的问题 String subject1 = getSubject(msg); //获得邮件主题 String subject = ""; //前面必须判断下是否为null,否则会有异常 if (subject1 ==null || subject1 == "" || "".equals(subject1) || "null".equals(subject1)) { subject = "此邮件没有主题"; continue; } else { subject = subject1; } // System.out.println("第"+i+"封邮件主题是: " + subject); String str=getSentDate(msg, null); System.out.println("------发送时间:" +str); //if(subject.indexOf("58.com")>0 && nowDate.equals(getSentDate(msg, null))){ if(subject.indexOf("58.com")>0 &&judgeDate(nowDate,str)){ StringBuffer content = new StringBuffer(300); getMailTextContent(msg, content); //System.out.println(content); //checkhtml(content.toString(),i); //得到每条邮件的三个信息 Matcher m = p1.matcher(content); Matcher n = p2.matcher(content); Matcher p = p3.matcher(content); Matcher q = p4.matcher(content); StringBuilder sb = new StringBuilder(); if (n.find()) {//存在手机号的话进行判断是否与数据库有重复 boolean is_new_phone=true; String ephone=n.group(2); try{ //对于每次读邮件时需要重新执行一次select * from 数据表名 //对每一封主题和时间都符合条件的邮件都进行一次查询 Statement statement=con.createStatement();//创建statement对形象,用来执行SQL语句 String sql = "select * from resume where phone="+ephone+" limit 0,1";//编写要执行的SQL语句 ResultSet rs=statement.executeQuery(sql);//③ResultSet类,执行SQL语句,用来存放获取的结果集 //System.out.println("执行结果如下:"); String dphone=null; if(rs.next()){ is_new_phone=false; }else{ String sql_for_member = "select * from member where phone="+ephone+" limit 0,1";//编写要执行的SQL语句 ResultSet rs_for_member=statement.executeQuery(sql_for_member);//③ResultSet类,执行SQL语句,用来存放获取的结果集 //System.out.println("执行结果如下:"); if(rs_for_member.next()){ System.out.println(rs_for_member.getString(1)); is_new_phone=false; } } if(is_new_phone){ String s1=null,s2=null,s3=null,s4=null,s5=null; if (m.find()) {//添加姓名、性别、年龄 s1=m.group(1); s2=m.group(2).substring(1, 2); s3=m.group(2).substring(3, 5); sb.append(m.group(1)+","+m.group(2)); Label label1 = new Label(0,j,s1); ws.addCell(label1); Label label2 = new Label(1,j,s2); ws.addCell(label2); Label label3 = new Label(2,j,s3); ws.addCell(label3); sb.append(","); } sb.append(ephone);//添加手机号 Label label4 = new Label(3,j,ephone); ws.addCell(label4); sb.append(","); if (p.find()) {//工作经验 for(int ii=1;ii<p.groupCount();ii++){ if(p.group(ii).indexOf("家教")>-1 || p.group(ii).indexOf("经验")>-1){ s4=p.group(ii);break; } } //s4=p.group(2); sb.append(s4); Label label5 = new Label(4,j,s4); ws.addCell(label5); sb.append(","); } if (q.find()) {//邮箱号 s5=q.group(2); sb.append(q.group(2)); Label label6 = new Label(5,j,s5); ws.addCell(label6); sb.append(","); } System.out.println(sb); SimpleDateFormat sdf_hms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = sdf_hms.format(new Date()); String ss = "insert into resume (name, sex,age,phone,experience,email,source,date_add) values ('"+s1+"','"+s2+"','"+s3+"','"+ephone+"','"+s4+"','"+s5+"','58','"+dateStr+"')"; statement.execute(ss); } rs.close(); }catch(SQLException e){ e.printStackTrace(); System.out.println("sql语句的执行出现问题!!!"); } } j++; }else{ continue; } } wb.write(); wb.close(); }catch(IOException e){ e.printStackTrace(); System.out.println("parseMessage内部1"); }catch(MessagingException e){ e.printStackTrace(); System.out.println("parseMessage内部2"); }catch (RowsExceededException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } }之前的程序运行后再数据表中发现了一个错误,就是匹配的工作经验处的信息有误,所以这次稍稍修改了p3及p.find()出的代码!!!!!!
这次需要添加的头文件如下,供参考:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;另外,这次修改敲代码时出现最多的错误就是SQL语句的编写规范,单引号双引号什么的错误多多,说明了自己这方面还得多加练习。