欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA流水号生成, 支持数据库查询,Spring注入(二) java流水号springsql自动 

程序员文章站 2022-06-14 16:09:10
...
第一篇文章http://numen06.iteye.com/blog/1420694介绍了,流水号的生成,可惜忘了加入循环操作,比如日循环,月循环,年循环,这次来补上。

注入方法已经在一写过了,就不写了。主要是代码部分。
直接上代码
package com.wesley.framework.dao;

import java.text.ParseException;
import java.util.GregorianCalendar;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;

/**
 * 流水号参数封装类
 * 
 * @author it.zl
 * 
 */
public class PrimaryBean {
	// select 'SP-' as prefix,'yyyyMMdd' as dataString,'000000' startNumber
	public final static String YEAR = "year";
	public final static String MONTH = "month";
	public final static String DAY = "day";
	/**
	 * 表示流水号中的前缀,比如测试操作可以加'TETS-'那么流水号的前缀就会加上'TEST-201207250000001'
	 */
	private String prefix;
	/**
	 * 表示日期的格式如'yyyyMMdd',那么会生产流水号中的日期为'20120725','yyyy-MM-dd'则会是'2012-07-25'
	 */
	private String dataString;
	/**
	 * 开始第一个数是多少,定义长度和其实数值,如000000
	 */
	private String startNumber;
	/**
	 * 表示流水号中的日期,如20120725
	 */
	private String dateTimeString;
	/**
	 * 可以设置循环类型,如每日生成新的流水号从0开始,默认为日,循环 数值为year,month,day
	 */
	private String repeatCycle = DAY;
	/**
	 * 是否每次都从数据库验证
	 */
	private Boolean isDataBase = false;

	public String getPrefix() {
		return prefix;
	}

	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

	public String getDataString() {
		return dataString;
	}

	public void setDataString(String dataString) {
		this.dataString = dataString;
	}

	public String getStartNumber() {
		return startNumber;
	}

	public void setStartNumber(String startNumber) {
		this.startNumber = startNumber;
	}

	public Boolean getIsDataBase() {
		return isDataBase;
	}

	public void setIsDataBase(Boolean isDataBase) {
		this.isDataBase = isDataBase;
	}

	public String getRepeatCycle() {
		return repeatCycle;
	}

	public void setRepeatCycle(String repeatCycle) {
		this.repeatCycle = repeatCycle;
	}

	public String getDateTimeString() {
		return dateTimeString;
	}

	public void setDateTimeString(String dateTimeString) {
		this.dateTimeString = dateTimeString;
	}

	/**
	 * 把dateTimeString转换正GregorianCalendar
	 * 
	 * @return DateTime
	 */
	public GregorianCalendar getDateTime() {
		if (StringUtils.isEmpty(dateTimeString))
			return new GregorianCalendar();
		GregorianCalendar date = new GregorianCalendar();
		try {
			date.setTime(DateUtils.parseDate(this.getDateTimeString(),
					new String[] { this.getDataString() }));
		} catch (ParseException e) {
			return new GregorianCalendar();
		}
		return date;
	}

}

package com.wesley.framework.dao;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;

import com.wesley.framework.dao.dbutils.DBHelper;

/**
 * 流水号生成类
 * 
 * @author it.zl
 * 
 */
public class PrimaryGenerater {

	/**
	 * 单例
	 */
	private static PrimaryGenerater primaryGenerater = null;
	/**
	 * 数据库访问类
	 */
	private DBHelper dbHelper;
	/**
	 * 生成流水号的SQL,支持多种格式,如业务BIZ,非业务NOBIZ
	 */
	private Map<String, String> sqls = new HashMap<String, String>();
	/**
	 * 对应不用的SQL生产的不同参数类
	 */
	private Map<String, PrimaryBean> primarBeans = new HashMap<String, PrimaryBean>();

	private PrimaryGenerater() {
		super();
	}

	public PrimaryGenerater(BasicDataSource database, Map<String, String> sqls) {
		super();
		this.dbHelper = new DBHelper(database);
		this.sqls = sqls;
		for (String key : sqls.keySet()) {
			this.primarBeans.put(key, this.getPrimaryBeanByDatabase(key));
		}
	}

	public static PrimaryGenerater newInstance(BasicDataSource database,
			Map<String, String> sqls) {
		synchronized (PrimaryGenerater.class) {
			primaryGenerater = new PrimaryGenerater(database, sqls);
		}
		return primaryGenerater;
	}

	/**
	 * 
	 * 取得PrimaryGenerater的单例实现
	 * 
	 * @return
	 */
	public static PrimaryGenerater getInstance() {
		if (primaryGenerater == null) {
			synchronized (PrimaryGenerater.class) {
				if (primaryGenerater == null) {
					primaryGenerater = new PrimaryGenerater();
				}
			}
		}
		return primaryGenerater;
	}

	/**
	 * 通过 数据库查询键获得封装类
	 * 
	 * @param key
	 * @return
	 */
	public synchronized PrimaryBean getPrimaryBeanByDatabase(String key) {
		if (!this.sqls.containsKey(key))
			return null;
		PrimaryBean primaryBean = this.primarBeans.get(key);
		if (primaryBean != null && !primaryBean.getIsDataBase())
			return primaryBean;
		primaryBean = dbHelper.findFirst(PrimaryBean.class, this.sqls.get(key));
		return primaryBean;
	}

	/**
	 * 通过数据库查询键位生成流水号
	 * 
	 * @param key
	 * @return
	 */
	public synchronized String geneterNextNumberByKey(String key) {
		PrimaryBean primaryBean = this.getPrimaryBeanByDatabase(key);
		return this.geneterNextNumber(primaryBean);
	}

	/**
	 * 通过封装类生成流水号
	 * 
	 * @param primaryBean
	 * @return
	 */
	public synchronized String geneterNextNumber(PrimaryBean primaryBean) {
		String nextNumber = this.geneterNextNumber(isRestart(primaryBean),
				primaryBean.getStartNumber());
		primaryBean.setStartNumber(nextNumber);
		String dataString = this.geneterDataString(primaryBean.getDataString());
		primaryBean.setDateTimeString(dataString);
		String serialNumber = primaryBean.getPrefix() + dataString + nextNumber;
		return serialNumber;
	}

	private synchronized Boolean isRestart(PrimaryBean primaryBean) {
		GregorianCalendar gcNow = new GregorianCalendar();
		GregorianCalendar date = primaryBean.getDateTime();
		if (StringUtils.equalsIgnoreCase(PrimaryBean.YEAR,
				primaryBean.getRepeatCycle())) {
			if (gcNow.get(GregorianCalendar.YEAR) == date
					.get(GregorianCalendar.YEAR))
				return false;
		}
		if (StringUtils.equalsIgnoreCase(PrimaryBean.MONTH,
				primaryBean.getRepeatCycle())) {
			if (gcNow.get(GregorianCalendar.YEAR) == date
					.get(GregorianCalendar.YEAR)
					&& gcNow.get(GregorianCalendar.MONTH) == date
							.get(GregorianCalendar.MONTH))
				return false;
		}
		if (StringUtils.equalsIgnoreCase(PrimaryBean.DAY,
				primaryBean.getRepeatCycle())) {
			if (DateUtils.isSameDay(gcNow, date))
				return false;
		}
		return true;
	}

	/**
	 * 通过开始数字字符串生成下一个流水号
	 * 
	 * @param startNumber
	 * @return
	 */
	public synchronized String geneterNextNumber(Boolean isRestart,
			String startNumber) {
		Long temp = Long.valueOf(startNumber) + 1;
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < startNumber.length(); i++)
			sb.append("0");
		DecimalFormat df = new DecimalFormat(sb.toString());
		return isRestart ? sb.toString() : df.format(temp);
	}

	/**
	 * 通过 格式生成日期格式
	 * 
	 * @param dataformat
	 * @return
	 */
	private synchronized String geneterDataString(String dataformat) {
		SimpleDateFormat formatter = new SimpleDateFormat(dataformat);
		return formatter.format(new Date());
	}
}

package com.wesley.framework.dao.dbutils;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.wesley.framework.commen.StringFormat;

public class DBHelper {
	private static final Log logger = LogFactory.getLog(DBHelper.class);

	private BasicDataSource dataSource;
	private QueryRunner queryRunner;

	public DBHelper(BasicDataSource dataSource) {
		super();
		this.dataSource = dataSource;
	}

	public void setDataSource(BasicDataSource dataSource) {
		this.dataSource = dataSource;
	}

	/**
	 * 执行sql语句
	 * 
	 * @param sql
	 *            sql语句
	 * @return 受影响的行数
	 */
	public int update(String sql) {
		return update(sql, null);
	}

	/**
	 * 执行sql语句 <code> 
	 * executeUpdate("update user set username = 'kitty' where username = ?", "hello kitty"); 
	 * </code>
	 * 
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 受影响的行数
	 */
	public int update(String sql, Object param) {
		return update(sql, new Object[] { param });
	}

	/**
	 * 执行sql语句
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 受影响的行数
	 */
	public int update(String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		int affectedRows = 0;
		try {
			if (params == null) {
				affectedRows = queryRunner.update(sql);
			} else {
				affectedRows = queryRunner.update(sql, params);
			}
		} catch (SQLException e) {
			logger.error("Error occured while attempting to update data", e);
		}
		return affectedRows;
	}

	/**
	 * 执行批量sql语句
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            二维参数数组
	 * @return 受影响的行数的数组
	 */
	public int[] batchUpdate(String sql, Object[][] params) {
		queryRunner = new QueryRunner(dataSource);
		int[] affectedRows = new int[0];
		try {
			affectedRows = queryRunner.batch(sql, params);
		} catch (SQLException e) {
			logger.error("Error occured while attempting to batch update data",
					e);
		}
		return affectedRows;
	}

	/**
	 * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
	 * 
	 * @param sql
	 *            sql语句
	 * @return 查询结果
	 */
	public List<Map<String, Object>> find(String sql) {
		return find(sql, null);
	}

	/**
	 * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
	 * 
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 查询结果
	 */
	public List<Map<String, Object>> find(String sql, Object param) {
		return find(sql, new Object[] { param });
	}

	/**
	 * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 查询结果
	 */
	public List<Map<String, Object>> find(String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		try {
			if (params == null) {
				list = (List<Map<String, Object>>) queryRunner.query(sql,
						new MapListHandler());
			} else {
				list = (List<Map<String, Object>>) queryRunner.query(sql,
						new MapListHandler(), params);
			}
		} catch (SQLException e) {
			logger.error("Error occured while attempting to query data", e);
		}
		return list;
	}

	/**
	 * 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @return 查询结果
	 */
	public <T> List<T> find(Class<T> entityClass, String sql) {
		return find(entityClass, sql, null);
	}

	/**
	 * 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 查询结果
	 */
	public <T> List<T> find(Class<T> entityClass, String sql, Object param) {
		return find(entityClass, sql, new Object[] { param });
	}

	/**
	 * 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 查询结果
	 */
	public <T> List<T> find(Class<T> entityClass, String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		List<T> list = new ArrayList<T>();
		try {
			if (params == null) {
				list = queryRunner.query(sql, new BeanListHandler<T>(
						entityClass, new BasicRowProcessor(
								new StrategyBeanProcessor(new HumpMatcher()))));
			} else {
				list = queryRunner.query(sql, new BeanListHandler<T>(
						entityClass, new BasicRowProcessor(
								new StrategyBeanProcessor(new HumpMatcher()))),
						params);
			}
		} catch (SQLException e) {
			logger.error("Error occured while attempting to query data", e);
		}
		return list;
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成对象
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @return 对象
	 */
	public <T> T findFirst(Class<T> entityClass, String sql) {
		return findFirst(entityClass, sql, null);
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成对象
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 对象
	 */
	public <T> T findFirst(Class<T> entityClass, String sql, Object param) {
		return findFirst(entityClass, sql, new Object[] { param });
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成对象
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 对象
	 */
	@SuppressWarnings({ "unchecked" })
	public <T> T findFirst(Class<T> entityClass, String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		Object object = null;
		try {
			if (params == null) {
				object = queryRunner
						.query(sql, new BeanHandler<T>(entityClass));
			} else {
				object = queryRunner.query(sql,
						new BeanHandler<T>(entityClass), params);
			}
		} catch (SQLException e) {
			logger.error("Error occured while attempting to query data", e);
		}
		return (T) object;
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成Map对象
	 * 
	 * @param sql
	 *            sql语句
	 * @return 封装为Map的对象
	 */
	public Map<String, Object> findFirst(String sql) {
		return findFirst(sql, null);
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成Map对象
	 * 
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 封装为Map的对象
	 */
	public Map<String, Object> findFirst(String sql, Object param) {
		return findFirst(sql, new Object[] { param });
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成Map对象
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 封装为Map的对象
	 */
	public Map<String, Object> findFirst(String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		Map<String, Object> map = null;
		try {
			if (params == null) {
				map = (Map<String, Object>) queryRunner.query(sql,
						new MapHandler());
			} else {
				map = (Map<String, Object>) queryRunner.query(sql,
						new MapHandler(), params);
			}
		} catch (SQLException e) {
			logger.error("Error occured while attempting to query data", e);
		}
		return map;
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnName
	 *            列名
	 * @return 结果对象
	 */
	public Object findBy(String sql, String columnName) {
		return findBy(sql, columnName, null);
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnName
	 *            列名
	 * @param param
	 *            参数
	 * @return 结果对象
	 */
	public Object findBy(String sql, String columnName, Object param) {
		return findBy(sql, columnName, new Object[] { param });
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnName
	 *            列名
	 * @param params
	 *            参数数组
	 * @return 结果对象
	 */
	public Object findBy(String sql, String columnName, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		Object object = null;
		try {
			if (params == null) {
				object = queryRunner.query(sql, new ScalarHandler(columnName));
			} else {
				object = queryRunner.query(sql, new ScalarHandler(columnName),
						params);
			}
		} catch (SQLException e) {
			logger.error("Error occured while attempting to query data", e);
		}
		return object;
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnIndex
	 *            列索引
	 * @return 结果对象
	 */
	public Object findBy(String sql, int columnIndex) {
		return findBy(sql, columnIndex, null);
	}

	public boolean exist(String sql, Object... params) {
		int x = this.findInteger(
				StringFormat.format("SELECT COUNT(*) FROM ({0})", sql), params);
		return x <= 0 ? false : true;
	}

	public int findInteger(String sql, Object... params) {
		Object o = findBy(sql, null, params);
		if (BigDecimal.class.equals(o.getClass()))
			return ((BigDecimal) o).intValue();
		return (Integer) o;
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnIndex
	 *            列索引
	 * @param param
	 *            参数
	 * @return 结果对象
	 */
	public Object findBy(String sql, int columnIndex, Object param) {
		return findBy(sql, columnIndex, new Object[] { param });
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnIndex
	 *            列索引
	 * @param params
	 *            参数数组
	 * @return 结果对象
	 */
	public Object findBy(String sql, int columnIndex, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		Object object = null;
		try {
			if (params == null) {
				object = queryRunner.query(sql, new ScalarHandler(columnIndex));
			} else {
				object = queryRunner.query(sql, new ScalarHandler(columnIndex),
						params);
			}
		} catch (SQLException e) {
			logger.error("Error occured while attempting to query data", e);
		}
		return object;
	}

}