ダウンロード
コチラからMySQL Connector/J の最新版をダウンロードします。落としたら解凍して mysql-connector-java-5.1.29-bin.jar を
ウェッブアプリのディレクトリ(/WEB-INF/lib )にコピーしておきます。Build Path(クラスパス) にも含めておきます。
SDB クラスを使う
自作のデータベース接続用クラスを使います。詳しい使い方はStruts2 [データベース]を参考ください。ソースコード(SMail.java)
郵便番号データベースを作る
テーブルの作成
MySQL のセットアップは MySQL5 [Mroonga 日本語検索] を参考にしてください。テーブルは郵便番号、都道府県、市区町村、番地その他の4つです。
create database tools_db;
create table zipcode(
num INT UNSIGNED,
pref TEXT,
city TEXT,
address TEXT,
index(num),
FULLTEXT INDEX(pref,city,address) COMMENT 'parser "TokenMecab"'
) engine=mroonga DEFAULT CHARSET utf8;
実行ソース (UpdateZipcode.java)
CSV からSQL文を作り、クエリー更新を行います。
package ROOT;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import slib.SDB;
public class UpdateZipcode {
public static void main(String[] args)
{
// "d:\\zipcode\\ken_all.csv"
String strCSV = args[0];
List<String> listSQL = new ArrayList<String>();
{
//01101,"060 ","0600007","ホッカイドウ","サッポロシチュウオウク","キタ7ジョウニシ","北海道","札幌市中央区","北七条西",0,0,1,0,0,0
Pattern pattern = Pattern.compile("^.+?,.+?,\"([0-9]+)\",.+?,.+?,.+?,\"(.+?)\",\"(.+?)\",\"(.+?)\",.*$");
File file = new File(strCSV);
if (file.canRead())
{
System.out.println("Start reading the CSV.");
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try
{
fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
int nValues = 0;
StringBuffer bufSQL = new StringBuffer();
while(true)
{
String strLine = bufferedReader.readLine();
if (strLine != null)
{
Matcher matcher = pattern.matcher(strLine);
if (matcher.find())
{
String strZipcode = matcher.group(1);
String strPref = matcher.group(2);
String strCity = matcher.group(3);
String strAddress = matcher.group(4);
if (strAddress.startsWith("以下に掲載がない場合"))
{
strAddress = "";
}
if (bufSQL.length() != 0)
{
bufSQL.append(",");
}
bufSQL.append("(");
bufSQL.append(strZipcode);
bufSQL.append(",\"");
bufSQL.append(strPref);
bufSQL.append("\",\"");
bufSQL.append(strCity);
bufSQL.append("\",\"");
bufSQL.append(strAddress);
bufSQL.append("\")");
nValues++;
}
}
if (nValues == 100 || strLine == null)
{
listSQL.add(bufSQL.toString());
nValues = 0;
bufSQL = new StringBuffer();
}
if (strLine == null)
{
break;
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
try
{
if (bufferedReader != null)
{
bufferedReader.close();
bufferedReader = null;
}
if (fileReader != null)
{
fileReader.close();
fileReader = null;
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
if (listSQL.size() != 0)
{
SDB db = new SDB();
Boolean bConnect = db.connectDirect("jdbc:mysql://192.168.24.6:3306/tools_db", "root", password);
if (bConnect)
{
System.out.println("Delete all records.");
db.executeUpdate("delete from zipcode");
for (int n = 0; n < listSQL.size(); n++)
{
String strSQL = listSQL.get(n);
int nRet = db.executeUpdate("insert into zipcode (num, pref, city, address) values " + strSQL);
if (nRet == 0)
{
System.out.println("Error");
}
}
System.out.println("Finished.");
db.close();
}
}
}
}
一度のクエリー文で12万3584件を登録できると思ったんですが、エラーになったので分割して更新しています。廃止になる住所もあるので、
レコードを一度全部消してから再登録という形を取っています。その方が早いというのもデータベースならでは。
検索
以下のクエリ文などで検索できれば成功
select * from zipcode where num=4820003;
select * from zipcode where match(pref,city,address) against('岩倉市');