首先弄懂身份证上数字都代表什么意思?
- 1-2位为省、自治区、直辖市代码;
- 3-4位为地级市、盟、自治州代码;
- 5-6位为县、县级市、区代码;
- 7-14位为出生年月日,比如19950301代表19957年3月1日出生;
- 15-17位为顺序码,是同一地址码所标示的区域范围内,对同年同月同日生的居民编订的顺序码。其中第17位表示性别,男性为单数,女性为双数;
- 18位为作为尾号的校验码,是由号码编制单位按照统一公式,通过前17位数字计算出来的。
知道了这些就好获取信息了。
效果展示:
接口:
为了测试,在接口中把身份证号码写死。
@GetMapping("/getIdCardInfo")
public String getIdCardInfo() {
String idCard = "37172119950321483x";
//substring(x,y),从第x位开始截取,到第y位。
String provinceId = idCard.substring(0, 6);
String cardInfoAddress = addressProvinceService.getIdCardInfo(provinceId);
String year = idCard.substring(6, 10);
String month = idCard.substring(10, 12);
String day = idCard.substring(12, 14);
String gender = idCard.substring(16, 17);
String inCardInfo="地址:" + cardInfoAddress + ",出生日期:" + year + ",月:" + month + ",日:" + day + ",性别:" + getGenderByIdCard(gender);
System.out.println(inCardInfo);
return inCardInfo;
}
备注:
addressProvinceService.getIdCardInfo(provinceId);是查询地区信息,每一个省市县的信息都在数据库存储,方法中包含的SQL是:
getGenderByIdCard(gender);是一个性别工具类。详情见文章最后。
SELECT
CONCAT(a.`name` , b.`name` , c.`name`) as '地址'
FROM
address_province a,
address_city b,
address_country c
WHERE
a.id=b.province_id and
b.id=c.city_id and
c.id=#{query}
地区获取表连接:
省份地址SQL数据
市区地址SQL数据
县地区SQL数据
性别工具类代码:
package com.excel.util;
/**
* @author lenovo
* @date 2022/4/20
*/
public class GenderUtil {
/**
* 男/女/未知 转换成 1/0/2
* @param gender 男/女
* @return
*/
public static String getGenderNum(String gender) {
if ("男".equals(gender)) {
return "1";
} else if ("女".equals(gender)) {
return "0";
} else {
return "2";
}
}
/**
* 1/0/2 转换成 男/女/未知
* @param gender
* @return
*/
public static String getGenderByNum(String gender) {
if ("1".equals(gender)) {
return "男";
} else if ("0".equals(gender)) {
return "女";
} else {
return "未知";
}
}
/**
* 根据身份证倒数第二位获取性别 单数男/双数女
* @param gender
* @return
*/
public static String getGenderByIdCard(String gender) {
int sex= Integer.parseInt(gender);
return ((sex%2==1) ? "男" : "女");
}
}