基于java的身份證轉(zhuǎn)換函數(shù)的設(shè)計與實現(xiàn)_第1頁
基于java的身份證轉(zhuǎn)換函數(shù)的設(shè)計與實現(xiàn)_第2頁
基于java的身份證轉(zhuǎn)換函數(shù)的設(shè)計與實現(xiàn)_第3頁
基于java的身份證轉(zhuǎn)換函數(shù)的設(shè)計與實現(xiàn)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

基于java的身份證轉(zhuǎn)換函數(shù)的設(shè)計與實現(xiàn)

在許多使用數(shù)據(jù)庫管理系統(tǒng)而參與人員數(shù)據(jù)管理時,大多數(shù)會捕獲身份驗證信息,并將身份驗證信息用作表的密鑰段(主鍵、外鍵、唯一索引等)。近年來,國內(nèi)正在進(jìn)行身份證換代工程,號碼由15位升為18位,相當(dāng)多的信息系統(tǒng)都面臨一個類似的技術(shù)需求,即如何處理這兩種身份證號碼的唯一性。也就是說,每個15位號碼有一個對應(yīng)的18位號碼,雖然在數(shù)據(jù)庫層兩個號碼不重復(fù),但是在業(yè)務(wù)上,兩個號碼是一致的。單純從技術(shù)的角度上看,由于存在號碼轉(zhuǎn)換規(guī)則,將15位身份證轉(zhuǎn)換為18位身份證并不困難(反之亦然),所以判斷兩個不同版本的號碼是否一致也不困難。但是,如果放到技術(shù)實現(xiàn)的角度來考慮,就會暴露許多問題。首先,所有的數(shù)據(jù)庫產(chǎn)品都沒有內(nèi)建的函數(shù)(功能)支持兩個版本的身份證轉(zhuǎn)換,需要開發(fā)者自行開發(fā)相關(guān)的功能;其次,在目前15位身份證與18位身份證混用的狀態(tài)下,將一個信息系統(tǒng)中所有相關(guān)數(shù)據(jù)表里的15位身份證利用外部手段(外部程序或手工操作)一次性轉(zhuǎn)為18位在某些業(yè)務(wù)上是不允許的,比如電子檔案系統(tǒng),需要如實反映紙質(zhì)檔案的原始情況,除非紙質(zhì)檔案發(fā)生改變。因此,當(dāng)業(yè)務(wù)上需要同時在數(shù)據(jù)庫中保留兩種格式的身份證,同時又必須在業(yè)務(wù)上判斷唯一性的時候,技術(shù)處理的手段就非常重要了,目前,絕大多數(shù)的系統(tǒng)都是采用客戶機/服務(wù)器模式,因此,很多系統(tǒng)將身份證轉(zhuǎn)換的處理放到了客戶機上實現(xiàn)。在客戶機上實現(xiàn)這種功能無疑會帶來系統(tǒng)的復(fù)雜性,以在一個數(shù)據(jù)表(假設(shè)為T1)中判斷身份證字段(假設(shè)為SFD)是否存在某一個號碼id為例,客戶機程序首先需要將號碼id轉(zhuǎn)為兩個版本的身份證號碼:id15,id18,然后用以下邏輯判斷數(shù)據(jù)表中是否存在這個號碼:另外一種解決思路是利用數(shù)據(jù)庫的自定義函數(shù)功能,開發(fā)者按照身份證的號碼轉(zhuǎn)換規(guī)則編寫自定義函數(shù)實現(xiàn)該功能,使得在數(shù)據(jù)庫一級支持身份證的號碼轉(zhuǎn)換,大多數(shù)關(guān)系型數(shù)據(jù)庫都支持?jǐn)U展的結(jié)構(gòu)化查詢語言(SQL),可利用這些語句創(chuàng)建自定義的函數(shù)或存儲過程,但是遺憾的是,SQL的語法較為簡單,操作數(shù)據(jù)表效率尚可,用于實現(xiàn)身份證號碼轉(zhuǎn)換的邏輯就力不從心,強行要實現(xiàn),效率也會十分低。大多數(shù)關(guān)系型數(shù)據(jù)庫都支持外部功能擴展,本文以O(shè)racle為例,介紹一個用Java實現(xiàn)的身份證程序,然后將該程序改造為一個Oracle上的自定義函數(shù)。1java正在改變身份驗證號1.1結(jié)構(gòu)及別角公式在我國,身份證存在兩個版本,早期的15位長,稱為第一代身份證,現(xiàn)在使用的是第二代身份證,18位長,根據(jù)1999年公布的中華人民共和國國家標(biāo)準(zhǔn)GB11643-1999中有關(guān)身份證號碼的規(guī)定,第二代身份證號碼是特征組合碼,由17位數(shù)字本體碼和1位數(shù)字校驗碼組成,兩代身份證之間的結(jié)構(gòu)及差別主要反映在出身日期碼的長度及數(shù)字校驗碼上,假設(shè)一個出生于1982年1月1日,戶口所在地在廣州市天河區(qū)的男性公民,其兩代身份證號碼的結(jié)構(gòu)可能如圖1所示:可以看出,兩代身份證的數(shù)字本體碼區(qū)別不大,主要是出生日期的年份長度有別,區(qū)別主要在于第二代身份證多了一個校驗位,根據(jù)GB11643-1999中的規(guī)定,身份證的校驗位是根據(jù)身份證的前17位數(shù)字本體碼,按照ISO7064:1983.MOD11-2算法計算出來的,其算法邏輯如下:(1)首先計算十七位數(shù)字本體碼的加權(quán)和;S=Sum(Ci×Wi),其中,i—代表由右至左17位數(shù)字本體碼的位置序號,i=0,…16;Ci—代表第i位置上的身份證號碼字符值;Wi—代表第i位置上的權(quán)值,其取值為Mod(2(2)計算模M=Mod(S,11)(3)計算校驗位Y=Mod(M+11-3,11),如果Y=10,校驗位為X,其余為Y值字符。1.2證號碼轉(zhuǎn)換android根據(jù)上述身份證編號的規(guī)則,我們不難設(shè)計一個進(jìn)行身份證號碼轉(zhuǎn)換的程序,限于篇幅,本文僅給出Java類的框架,需要完整代碼的讀者可與作者聯(lián)系。身份證號碼轉(zhuǎn)換Java程序代碼框架如圖2所示:在上面的程序框架中,我們定義了一個Java類-IDTransfer,它擁有3個靜態(tài)的方法(Oracle中的Java存儲過程要求使用static的方法):(1)15To18:將15位身份證轉(zhuǎn)換為18位身份證;(2)18To15:將18位身份證轉(zhuǎn)換為15位身份證;(3)getVerify:計算17位數(shù)字本體碼的校驗位;完成了這一步,就可以準(zhǔn)備在Oracle中利用這個Java程序了。2系統(tǒng)技術(shù)方案大多數(shù)的Oracle開發(fā)者都習(xí)慣于利用PL/SQL開發(fā)與SQL數(shù)據(jù)緊密結(jié)合的服務(wù)器端應(yīng)用。但是,由Oracle8i開始,Oracle就增加了對Java技術(shù)的支持,O-racle可利用Java技術(shù)實現(xiàn)更加方便的擴展性和性能。Java技術(shù)的一個最大的吸引力在于其跨平臺的技術(shù)特征以及強大的應(yīng)用開發(fā)能力。Oracle為企業(yè)應(yīng)用開發(fā)者創(chuàng)建、部署和管理Java應(yīng)用程序提供了一個端到端的Java解決方案。該解決方案包括用以支持Java開發(fā)的客戶端和服務(wù)器端可編程接口、管理工具以及集成于Oracle數(shù)據(jù)庫中的虛擬機JVM。所有這些技術(shù)都100%兼容Java標(biāo)準(zhǔn)。除了集成于Oracle數(shù)據(jù)庫中的JVM,Oracle中的Java技術(shù)還包括:(1)JavaStoredProcedure(Java存儲過程)。用Java語言編寫的Oracle存儲過程(或函數(shù))對象,類似于用PL/SQL編寫的存儲過程(函數(shù))對象,可以支持用PL/SQL語句操作Java存儲過程對象;(2)SQLJ。SQLJ是一個與Java編程語言緊密集成的嵌入式SQL的版本,通過在Java程序中嵌入靜態(tài)SQL語句,實現(xiàn)對特定數(shù)據(jù)庫對象的訪問;(3)JDBCforOracle。JDBCforOracle是Oracle提供的一組符合JavaJDBC規(guī)范的數(shù)據(jù)庫訪問API,可支持由Java程序中動態(tài)地訪問各類Oracle對象;(4)管理工具。負(fù)責(zé)輔助Java類的裝載、管理、部署的一組工具(腳本)。上述技術(shù)中,客戶端方面以JDBC技術(shù)最靈活。而服務(wù)端方面則以Java存儲過程的利用最方便,很多Java程序可以不經(jīng)修改(或僅經(jīng)過簡單的修改)就可以直接部署成為Oracle上的存儲過程(函數(shù))對象,大大擴展了Oracle的功能。下面,我們將把前面的身份證號碼轉(zhuǎn)換Java程序轉(zhuǎn)換為Oracle上的Java函數(shù)對象。3類文件的部署編寫一個Java存儲過程(函數(shù))一般包括以下幾個步驟:(1)編寫實現(xiàn)特定功能的Java源程序(這部分與編寫一般的Java程序區(qū)別不大,但是要注意的是,需要被部署在Oracle上的方法應(yīng)申明為static);(2)用Javac編譯Java源程序,得到類文件;(3)用Loadjava將編譯后的類文件裝載到Oracle數(shù)據(jù)庫中;(4)將裝載后的Java類中的方法發(fā)布為若干個Java存儲過程(函數(shù))對象;(5)在PL/SQL中使用Java存儲過程(函數(shù))對象。下面,本文簡單描述以下將IDTransfer.java程序部署為Java函數(shù)的過程:(1)編譯程序,獲得類文件IDTransfer.calss;(2)將類文件裝載至Oracle數(shù)據(jù)庫;執(zhí)行命令Loadjava-userusername/passwordID-Transfer.class(3)將類中的方法15To18、18To15分別發(fā)布為兩個Java函數(shù)fnID15To18、fnID18To15,PL/SQL命令如下:CreateorReplaceFunctionfnID15To18(id15invarchar2)returnVARCHAR2aslanguagejavanameIDTransfer.15To18(java.lang.String)returnjava.lang.String;CreateorReplaceFunctionfnID18To15(id18invarchar2)returnVARCHAR2aslanguagejavanameIDTransfer.18To15(java.lang.String)returnjava.lang.String;(4)使用Java函數(shù)。一旦完成上述定義,則可以像使用Oracle中其它函數(shù)對象一樣使用Java函數(shù)對象,如將15位身份證id15轉(zhuǎn)換為18位,可以使用PL/SQL命令:將18位身份證id18轉(zhuǎn)換為15位,可以使用PL/SQL命令:SelectfnID18To15(id18)fromdual;而像本文最開始的例子中,在一個數(shù)據(jù)表(假設(shè)為T1)中判斷身份證字段(假設(shè)為SFD)是否存在某一個號碼id(假設(shè)是18位號碼),可以使用PL/SQL命令:4數(shù)據(jù)庫擴展功能Oracle的Java存儲過程擴展技術(shù),大大拓展了O-racle的服務(wù)端開發(fā)能力,很多利用PL/SQL語句很難處理的數(shù)據(jù)邏輯都可以通過Java的強大編程技巧予以實現(xiàn),同時,Java開發(fā)者也可充分利用其技術(shù)積累

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論