追加時に自動的に流れ番号IDを生成します。

4872 ワード

プロジェクトでは、あるレコードを追加する際、重複してはいけない値を定義するために、自動的にストリーム番号を生成する方式でこの値を定義します。必要に応じて、定義の方法も多様であり、例えば、日付に3ビットのストリーム番号(例:201801151001)を加算する。このため、2つの流れ番号を生成する方法が分かった。
一、Javaから流れ番号を生成する
生成ストリーム番号フォーマットはyyyMMddxxxxです。
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PrimaryGenerater {

	private static final String SERIAL_NUMBER = "XXXX"; //      
	private static PrimaryGenerater primaryGenerater = null;

	private PrimaryGenerater() {
	}

	/**
	 *   PrimaryGenerater     
	 * 
	 * @return
	 */
	public static PrimaryGenerater getInstance() {
		if (primaryGenerater == null) {
			synchronized (PrimaryGenerater.class) {
				if (primaryGenerater == null) {
					primaryGenerater = new PrimaryGenerater();
				}
			}
		}
		return primaryGenerater;
	}

	/**
	 *        
	 */
	public synchronized String generaterNextNumber(String sno) {
		String id = null;
		Date date = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		if (sno == null) {
			id = formatter.format(date) + "0001";
		} else {
			int count = SERIAL_NUMBER.length();
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < count; i++) {
				sb.append("0");
			}
			DecimalFormat df = new DecimalFormat("0000");
			id = formatter.format(date)
					+ df.format(1 + Integer.parseInt(sno.substring(8, 12)));
		}
		return id;
	}
}
  
二、SQLから流れ番号を生成する
同様に、ストリーム番号を生成するフォーマットをyyyMMddxxxxとする。
SELECT

IF (
    max(a.st_no) IS NULL,
    CONCAT(
        date_format(now(),'%Y%m%d'),
        LPAD('1', '11' - LENGTH(date_format(now(),'%Y%m%d'), '0')
    ),
    CONCAT(
        LEFT (max(a.st_no), 8),
        LPAD(
            CONVERT (
                SUBSTRING(max(a.st_no), 9),
                SIGNED
            ) + 1,
            LENGTH(max(a.st_no)) - 8,
            '0'
        )
    )
) AS st_no
FROM
    Student a
WHERE
    a.st_no LIKE concat(
        date_format(now(),'%Y%m%d'),'%') AND LENGTH(a.st_no) = '11'
 注意:
①例ではdate_format(now()'%Y%m%d')は、バックグラウンドサービス論理層で現在の時間をパラメータとして取得して入ることができます。
②concat関数、括弧内の文字列をつづり合わせる  【例:呼び出しconcat(「abc」、「d」、「ef」、「g」)関数はabcdefgに戻る】
③lpad関数は、第三のパラメータで第一のパラメータの左側に塗りつぶします。パラメータの総長が第二の数値に達するまで  【例:呼び出し lpad('sd',5'*')関数は***sdに戻ります。
④substringには三つの用法があります。【substring(‘abcdefg’,3)>>defg //   substring('abcdefg',2,3)->bcd   //    'abc defg'.substring(2,4)->cd】
⑤この方法は後三桁が999以下のデータに対してのみ使用され、一定の制限があります。
転載先:https://www.cnblogs.com/smileToSunshine/p/8288417.html