利用JDBC来访问身份证信息

这是我在博客园写的第一篇技术博文,很有纪念意义啊,之前一直拖了好久没有写,主要忙着复习考研。以后尽量抽出时间来写博文,保证一周一篇的频率吧

这个程序的想法源于老师布置的一个Java实验,让用户输入一个身份证号码,然后来判断是新身份证(18位)还是老身份证(15位),并把老的身份证号码转换为新的身份证号码;其中还要对身份证的各项信息进行正误提醒(例如出生年月等),最后就是根据身份证的前六位来判断用户的所在地。

下面来把我的思路来说一下:

1.在数据库中新建一个数据库,用于存储地区编码,脚本如下:

create database idinfo;
use idinfo;

create table location
(num int primary key,
address varchar(32));

 

1.把地区的编码整理并存入数据库,地区编码可以到国家统计局网站查询(http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/),在这里我使用的是最新的2013年8月31日的版本。先把地区编码保存成为一个txt文件,并进行格式处理,然后利用Java数据流依次扫描存Mysql数据库。代码贴出来如下:

package JdbcTest;

import java.io.*;
import java.sql.*;
import java.util.Scanner;

/**
 * Created by WangKang on 14-3-15.
 */
public class ID {
    public static String dbdriver="com.mysql.jdbc.Driver";
    public static String dburl="jdbc:mysql://localhost:3306/idinfo";
    public static String dbusr="root";
    public static String dbpassword="password";
    static Connection connection=null;
    static PreparedStatement preparedStatement=null;
    static ResultSet resultSet=null;
//连接数据库,并将所给的参数存入数据库
public static void Insert(int idtemp,String locationtemp){ try{ Class.forName(dbdriver); connection= DriverManager.getConnection(dburl,dbusr,dbpassword); String SqlInsert="insert into location(num,address) values(?,?);"; preparedStatement=connection.prepareStatement(SqlInsert); preparedStatement.setInt(1,idtemp); preparedStatement.setString(2,locationtemp); preparedStatement.executeUpdate(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally { try { connection.close(); preparedStatement.close(); }catch (Exception e){ e.printStackTrace(); } } }
public static String getLocation(int temp){ String location=""; int city=temp-temp%100; int province=temp-temp%10000; try { Class.forName(dbdriver); connection=DriverManager.getConnection(dburl,dbusr,dbpassword); String SqlSelect="select address from location where num=? or num=? or num=?;"; preparedStatement=connection.prepareStatement(SqlSelect); preparedStatement.setInt(1,province); preparedStatement.setInt(2,city); preparedStatement.setInt(3,temp); resultSet=preparedStatement.executeQuery(); while (resultSet.next()) location+=resultSet.getString(1); }catch (Exception e){ e.printStackTrace(); }finally { try { connection.close(); preparedStatement.close(); }catch (Exception e){ e.printStackTrace(); } } return location; } public static void main(String[] args) throws IOException { File file=new File("d:/id.txt"); InputStreamReader inputStreamReader=new FileReader(file); Scanner scanner =new Scanner(inputStreamReader); while(scanner.hasNext()){ int num=scanner.nextInt(); String location=scanner.nextLine(); Insert(num,location); } } }

其中我在Intellij IDEA下运行这段代码时,存进去的地址是乱码,但我到cmd下运行时就正常了,这一点我还没搞清怎么回事,大家有明白的,还希望多多指教。

3.接下来就是对输入的身份证进行判断,需要新建一个类IDCheck,代码如下:

package JdbcTest;

import javax.swing.*;

/**
 * Created by WangKang on 14-3-16.
 */
public class IDCheck {
    private int location,year,month,day,code;
    private static StringBuffer temp=new StringBuffer();
    public boolean check(String str){
        boolean bool=true;
        String err="出生年月有误,请确认后再次输入!";
        if (str.length()==15){
            year=Integer.parseInt(str.substring(6, 8));
            month=Integer.parseInt(str.substring(8, 10));
            day=Integer.parseInt(str.substring(10, 12));
        }
        else if (str.length()==18){
            year=Integer.parseInt(str.substring(6, 10));
            month=Integer.parseInt(str.substring(10, 12));
            day=Integer.parseInt(str.substring(12, 14));
        }
        else {
            JOptionPane.showMessageDialog(null, "您输入的身份证长度有误(15位或18位)", "错误", JOptionPane.ERROR_MESSAGE);
            bool=false;
        }
        if (month==1||month==3||month==5||month==7||month==8||month==10||month==12){
            if(day>30) {
                JOptionPane.showMessageDialog(null,err,"错误",JOptionPane.ERROR_MESSAGE);
                bool=false;
            }
        }
        else if (month==4||month==6||month==9||month==11){
            if (day>29) {
                JOptionPane.showMessageDialog(null, err, "错误", JOptionPane.ERROR_MESSAGE);
                bool=false;
            }
        }
        else if(month==2){
            if (day>27) {
                JOptionPane.showMessageDialog(null, err, "错误", JOptionPane.ERROR_MESSAGE);
                bool=false;
            }
        }
        return bool;
    }
    public void getMessage(String str){
        if (str.length()==15){
            temp.append("身份证类型:旧\n");
            location=Integer.parseInt(str.substring(0, 6));
            year=Integer.parseInt(str.substring(6, 8));
            month=Integer.parseInt(str.substring(8, 10));
            day=Integer.parseInt(str.substring(10, 12));
            code=Integer.parseInt(str.substring(12));
            String address=ID.getLocation(location);
            temp.append("地址:"+address+"\n");
            temp.append("出生年月:").append("19").append(year).append(‘年‘).append(month).append(‘月‘).append(day).append("日\n");
            if(code%2==0) temp.append("性别:女\n");
            else temp.append("性别:男\n");
        }
        else {
            temp.append("身份证类型:新\n");
            location=Integer.parseInt(str.substring(0, 6));
            year=Integer.parseInt(str.substring(6, 10));
            month=Integer.parseInt(str.substring(10, 12));
            day=Integer.parseInt(str.substring(12, 14));
            code=Integer.parseInt(str.substring(14,17));
            String address=ID.getLocation(location);
            temp.append("地址:"+address+"\n");
            temp.append("出生年月:").append(year).append(‘年‘).append(month).append(‘月‘).append(day).append("日\n");
            if(code%2==0) temp.append("性别:女\n");
            else temp.append("性别:男\n");
        }
    }
    public void convert(String str){
        char[] verify={‘1‘,‘0‘,‘x‘,‘9‘,‘8‘,‘7‘,‘6‘,‘5‘,‘4‘,‘3‘,‘2‘};
        char[] ch=new char[str.length()];
        ch=str.toCharArray();
        StringBuffer stringBuffer=new StringBuffer();
        int count=0;
        for(int i=0;i<str.length();i++){
            if (i<6) stringBuffer.append(ch[i]);
            if (i==6) stringBuffer.append("19").append(ch[6]);
            if (i>6) stringBuffer.append(ch[i]);
        }
        ch=stringBuffer.toString().toCharArray();
        for(int i=0;i<stringBuffer.toString().length();i++){
            count+=ch[16-i]*(Math.pow(2,i-1)%11);
        }
        count%=11;
        stringBuffer.append(verify[count]);
        StringBuffer IDnumber=new StringBuffer();
        IDnumber.append("您的新身份证号:").append(stringBuffer.toString());
        JOptionPane.showMessageDialog(null,IDnumber.toString(),"信息",JOptionPane.INFORMATION_MESSAGE);
    }
    public static void main(String[] args){
        String input= JOptionPane.showInputDialog("请输入您的身份证号");
        IDCheck IDCheck=new IDCheck();
        if (IDCheck.check(input)) {
            IDCheck.getMessage(input);
            JOptionPane.showMessageDialog(null,temp.toString(),"信息",JOptionPane.INFORMATION_MESSAGE);
            if (input.length()==15) IDCheck.convert(input);
        }

    }
}

这个代码我觉得写得很冗余,但一时又想不出怎么改,也希望大家提点意见

最后就来看下运行的效果

随便输入了一个身份证号

显示出了相应的信息!

利用JDBC来访问身份证信息,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。