単一例はデータベースのプライマリ・キー生成ポリシーを開発し、データベース・プラットフォームにまたがるプライマリ・キー生成方式
方向制御:管理するテーブルのプライマリ・キーとプライマリ・キーの値をすべて格納するテーブルを使用します.
表:keytable
このような1つのプライマリ・キーのバッファ値範囲を一度に取り出し、getNextKey()を呼び出すたびにそのプライマリ・キーの値を返し、次のプライマリ・キー値を設定します.値は範囲内、値は取り出し、値がバッファ範囲の最大値に達した場合、データベースとインタラクティブになります.次のバッファ範囲を生成します.バッファ範囲を取り出す前にデータベースのプライマリ・キー値を更新し、バッファ範囲の失敗を回避し、次回にプライマリ・キー値を取得するために使用されます.具体的なクラスは次のとおりです.
データベースツールクラス:JDBCconnectionFactory
Connectionオブジェクトとリソースのクローズの管理
/*
*(1)機能一:ユーザーに接続対象を提供する
*(2)機能3:共通のクローズを提供する
*/
友達の交流を歓迎します[email protected]
表:keytable
create table keytable(
keyname varchar2(20) primary key,
keyvalue number(10) not null);
クラスを使用してクラスの生成ポリシーを管理します:Class KeyInfoこのような1つのプライマリ・キーのバッファ値範囲を一度に取り出し、getNextKey()を呼び出すたびにそのプライマリ・キーの値を返し、次のプライマリ・キー値を設定します.値は範囲内、値は取り出し、値がバッファ範囲の最大値に達した場合、データベースとインタラクティブになります.次のバッファ範囲を生成します.バッファ範囲を取り出す前にデータベースのプライマリ・キー値を更新し、バッファ範囲の失敗を回避し、次回にプライマリ・キー値を取得するために使用されます.具体的なクラスは次のとおりです.
package singleton.keySequence;
public class KeyInfo {
private long minKey;
private long maxKey;
private int poolSize;
private long nextKey;
private String keyName;
/**
* @param poolSize
* @param keyName
*/
public KeyInfo(int poolSize,String keyName){
this.poolSize=poolSize;
this.keyName=keyName;
queryDB();
}
/**
* @return the value of nextKey
* , ,
*/
public long getNextKey(){
if(nextKey>maxKey){
queryDB();
}
return nextKey++;
}
/**
* ,
*/
private void queryDB(){
String updateSql="UPDATE KEYTABLE SET KEYVALUE=KEYVALUE+"
+poolSize+" WHERE KEYNAME='"+keyName+"'";
String querySql="select KEYVALUE FROM KEYTABLE WHERE KEYNAME='"+keyName+"'";
JDBCTemplate.update(updateSql);
// System.out.println(updateSql);
// System.out.println(querySql);
long valueFromDB=(Integer)JDBCTemplate.query(querySql); maxKey=valueFromDB;
minKey=maxKey-poolSize+1;
nextKey=minKey;
}
}
これらのプライマリ・キーの生成方法を管理するには、単一のクラスを使用します.package singleton.keySequence;
import java.util.HashMap;
import java.util.Map;
public class KeyGenerator {
private Map<String,KeyInfo> keyMap=new HashMap<String,KeyInfo>(10);
private static final int POOL_SIZE=30;
private static KeyGenerator keygen=new KeyGenerator();
private KeyGenerator() {
}
public static KeyGenerator getInstance(){
return keygen;
}
public long getNextKey(String keyName){
if(keyMap.containsKey(keyName)){
return keyMap.get(keyName).getNextKey();
}else{
KeyInfo keyInfo=new KeyInfo(POOL_SIZE,keyName);
keyMap.put(keyName, keyInfo);
return keyInfo.getNextKey();
}
}
}
JDBCアクセスデータベースクラス:データベースツールクラス:JDBCconnectionFactory
Connectionオブジェクトとリソースのクローズの管理
/*
*(1)機能一:ユーザーに接続対象を提供する
*(2)機能3:共通のクローズを提供する
*/
package common.db;
import java.sql.*;
import java.util.*;
import java.io.*;
public class JDBCConnectionFactory
{
static String url;
static String user;
static String password;
//
// : , 。
static
{
try
{
FileInputStream fis=new FileInputStream("common/db/dbtext");
Properties pro=new Properties();
pro.load(fis);
url=pro.getProperty("url");
user=pro.getProperty("username");
password=pro.getProperty("password");
fis.close();
}catch(Exception e)
{
e.printStackTrace();
}
}
// :
public static Connection getConnection()
{
Connection conn=null;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(url, user, password);
}catch(Exception e){
e.printStackTrace();
}
return conn;
}
// :
public static void close(Connection conn,ResultSet rs,Statement stmt)
{
try
{
if(conn!=null)
conn.close();
if(stmt!=null)
stmt.close();
if(rs!=null)
rs.close();
}catch(SQLException e){
System.out.println(e.getMessage());
}
}
}
特定のデータベース・アクセス・クラスpackage common.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCTemplate {
private static Connection conn=null;
private static Statement stmt=null;
private static ResultSet rs=null;
public static void update(String updateSql) throws Exception{
conn=JDBCConnectionFactory.getConnection();
stmt=conn.createStatement();
stmt.executeUpdate(updateSql);
JDBCConnectionFactory.close(conn, null, stmt);
conn=null;
stmt=null;
}
public static Object query(String querySql)throws Exception{
conn=JDBCConnectionFactory.getConnection();
stmt=conn.createStatement();
rs=stmt.executeQuery(querySql);
int i=-1;
while(rs.next()){
i=rs.getInt(1);
if(i!=-1)
break;
}
JDBCConnectionFactory.close(conn, rs, stmt);
conn=null;
stmt=null;
return i;
}
}
以下はテストクラスですpackage singleton.keySequence;
public class ClientTest {
public static void main(String[] args) throws Exception{
KeyGenerator key=KeyGenerator.getInstance();
for(int i=0;i<15;i++){
System.out.println(key.getNextKey("person_id"));
System.out.println(key.getNextKey("person_id"));
}
}
}
以上はMyEclipseとOracle 9 iでテストに合格しました.友達の交流を歓迎します[email protected]