`
numen06
  • 浏览: 75971 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JAVA流水号生成, 支持数据库查询,Spring注入

阅读更多
package com.wesley.framework.dao;

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

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

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

public class PrimaryGenerater {

	private static PrimaryGenerater primaryGenerater = null;
	private DBHelper<PrimaryBean> dbHelper;
	private Map<String, String> sqls = new HashMap<String, String>();
	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<PrimaryBean>(database, PrimaryBean.class);
		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.query(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(primaryBean.getStartNumber());
		primaryBean.setStartNumber(nextNumber);
		String dataString = this.geneterDataString(primaryBean.getDataString());
		String serialNumber = primaryBean.getPrefix() + dataString + nextNumber;
		return serialNumber;
	}

	/**
	 * 通过开始数字字符串生成下一个流水号
	 * 
	 * @param startNumber
	 * @return
	 */
	public synchronized String geneterNextNumber(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 df.format(temp);
	}

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

	public static void main(String[] args) throws Exception {
		XmlBeanFactory context = new XmlBeanFactory(new ClassPathResource(
				"applicationContext.xml"));
		BasicDataSource dataSource = (BasicDataSource) context
				.getBean("dataSource");
		Map<String, String> map = new HashMap<String, String>();
		map.put("new",
				"select 'SP-' as prefix,'yyyyMMdd' as dataString,'000000' as startNumber from business union select 'SP-' as prefix,'yyyyMMdd' as dataString,'000000' as startNumber");
		PrimaryGenerater.newInstance(dataSource, map);
		for (int i = 0; i < 100; i++) {
			System.out.println(PrimaryGenerater.getInstance()
					.geneterNextNumberByKey("new"));
		}
	}

}

package com.wesley.framework.dao;

public class PrimaryBean {
	// select 'SP-' as prefix,'yyyyMMdd' as dataString,'000000' startNumber
	private String prefix;
	private String dataString;
	private String startNumber;
	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;
	}

}

package com.wesley.framework.dao.dbutils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.unitils.thirdparty.org.apache.commons.dbutils.DbUtils;

public class DBHelper<T> {
	private static final Logger logger = LoggerFactory
			.getLogger(DBHelper.class);

	private BasicDataSource pool;

	private Class<T> beanClass = null;

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

	public DBHelper(BasicDataSource pool, Class<T> beanClass) {
		super();
		this.pool = pool;
		this.beanClass = beanClass;
	}

	/**
	 * 根据无参sql语句进行查询,并返回一个对象,用于单条记录的查询
	 * 
	 * @param sql
	 * @return Object
	 */
	public T query(String sql) {
		Connection conn = this.getPoolConnection();
		if (conn == null || beanClass == null)
			return null;
		QueryRunner run = new QueryRunner();
		ResultSetHandler<T> h = new BeanHandler<T>(beanClass);
		T result = null;
		try {
			result =   run.query(conn, sql, h);
		} catch (SQLException e) {
			logger.info("SQLException in [" + sql + "]");
			logger.error(e.getMessage());
		} finally {
			DbUtils.closeQuietly(conn);
		}
		return result;
	}

	/**
	 * 根据有参sql语句进行查询,并返回一个对象,用于单条记录的查询
	 * 
	 * @param sql
	 * @param args
	 * @return Object
	 */

	public T query(String sql, Object... args) {
		Connection conn = this.getPoolConnection();
		if (conn == null || beanClass == null)
			return null;
		QueryRunner run = new QueryRunner();
		ResultSetHandler<T> h = new BeanHandler<T>(beanClass);
		T result = null;
		try {
			result = (T) run.query(conn, sql, h, args);
		} catch (SQLException e) {
			logger.info("SQLException in [" + sql + "]");
			logger.error(e.getMessage());
		} finally {
			DbUtils.closeQuietly(conn);
		}
		return result;
	}

	/**
	 * 根据无参sql语句进行查询,并返回一个数据集,用于多条记录的查询
	 * 
	 * @param sql
	 * @return ArrayList
	 */
	public List<T> queryRecords(String sql) {
		Connection conn = this.getPoolConnection();
		if (conn == null || beanClass == null)
			return null;
		// ResultSetHandler<?> h = new BeanListHandler(beanClass);
		ResultSetHandler<List<T>> h = new BeanListHandler<T>(beanClass,
				new BasicRowProcessor(new StrategyBeanProcessor(
						new HumpMatcher())));
		QueryRunner run = new QueryRunner();
		List<T> result = null;
		try {
			result = run.query(conn, sql, h);
		} catch (SQLException e) {
			logger.info("SQLException in [" + sql + "]");
			logger.error(e.getMessage());
		} finally {
			DbUtils.closeQuietly(conn);
		}
		return result;
	}

	/**
	 * 根据有参sql语句进行查询,并返回一个数据集,用于多条记录的查询
	 * 
	 * @param sql
	 * @param args
	 * @return
	 */
	public List<T> queryRecords(String sql, Object... args) {
		Connection conn = this.getPoolConnection();
		if (conn == null || beanClass == null)
			return null;
		QueryRunner run = new QueryRunner();
		ResultSetHandler<List<T>> h = new BeanListHandler<T>(beanClass,
				new BasicRowProcessor(new StrategyBeanProcessor(
						new HumpMatcher())));
		List<T> result = null;

		try {
			result = run.query(conn, sql, h, args);
			System.out.println(result.size());
		} catch (SQLException e) {
			logger.info("SQLException in [" + sql + "]");
			logger.error(e.getMessage());
		} finally {
			DbUtils.closeQuietly(conn);
		}
		return result;
	}

	/**
	 * 根据无参sql语句进行数据更新,并返回更新后影响的记录数
	 * 
	 * @param sql
	 * @return int
	 */
	public int update(String sql) {
		Connection conn = this.getPoolConnection();
		if (conn == null)
			return 0;
		QueryRunner run = new QueryRunner();
		int result = 0;

		try {
			result = run.update(conn, sql);
		} catch (SQLException e) {
			logger.info("SQLException in [" + sql + "]");
			logger.error(e.getMessage());
		} finally {
			DbUtils.closeQuietly(conn);
		}
		return result;
	}

	/**
	 * 根据有参sql语句进行数据更新,并返回更新后影响的记录数
	 * 
	 * @param sql
	 * @param args
	 * @return int
	 */
	public int update(String sql, Object... args) {
		Connection conn = this.getPoolConnection();
		if (conn == null)
			return -1;

		QueryRunner run = new QueryRunner();
		int result = 0;

		try {
			result = run.update(conn, sql, args);
		} catch (SQLException e) {
			logger.info("SQLException in [" + sql + "]");
			logger.error(e.getMessage());
		} finally {
			DbUtils.closeQuietly(conn);
		}
		return result;
	}

	/**
	 * 设置存放查询结果的Bean类,每个Bean类对象对应一条查询的结果记录
	 * 
	 * @param beanClass
	 *            ,如User.class
	 */
	public void setBeanClass(Class<T> beanClass) {
		this.beanClass = beanClass;
	}

	public Connection getPoolConnection() {
		int x = 3;
		while (x > 0) {
			try {
				return pool.getConnection();
			} catch (SQLException e) {
				x--;
				logger.error(e.getMessage());
			}
		}
		return null;
	}

	public void dispose() {
		try {
			this.pool.close();
		} catch (SQLException e) {
			logger.error(e.getMessage());
		}
	}
}

<bean id="PrimaryGenerater" class="com.wesley.framework.dao.PrimaryGenerater"
		factory-method="newInstance">
		<constructor-arg index="0" ref="dataSource" />
		<constructor-arg index="1" >
			<map>
				<entry key="bsno">
					<value>select 'SP-' as prefix,'yyyyMMdd' as dataString,'000000' as
						startNumber union select null as prefix,null as dataString,null as
						startNumber from business
					</value>
				</entry>
			</map>
		</constructor-arg>
	</bean>
7
1
分享到:
评论

相关推荐

    JAVA生成订单号(日期+流水号)

    ### JAVA生成订单号(日期+流水号)的知识点解析 #### 一、概述 在现代电商及金融系统中,订单号作为唯一标识符扮演着极其重要的角色。它不仅需要具备唯一性,还要易于管理和追踪。本文将详细介绍一个通过Java语言...

    java代码自动生成器(根据数据库生成数据库操作代码)

    是一个以spring为核心的项目脚手架(或者称为胶水框架),框架将各个零散的框架(struts,strust2,springmvc,hibernate,ibatis,spring_jdbc,flex)搭建好,并内置一个代码生成器,辅助项目开发,可以生成java的hibernat ...

    精通Java EE项目案例-基于Eclipse Spring Struts Hibernate光盘源码(带数据库)

    Spring框架是Java EE开发的核心组件之一,它是一个全面的应用框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能。Spring还支持数据访问、Web应用、事务管理等多个方面,极大地简化了企业级应用的复杂性。在本案例...

    Java代码生成工具 绿色版_生成Struts2.1.8,Spring2.5,Hibernate3代码

    Java代码生成工具是一种高效开发辅助软件,主要用于自动化生成基于Java技术栈的Web应用程序代码,尤其针对Struts2.1.8、Spring2.5和Hibernate3这三个经典框架的集成应用。这样的工具能够显著提高开发效率,减少手动...

    数据库配置生成页面

    标签中的“配置生成页面”可能指的是自动生成数据库查询页面的能力。这可以通过解析数据库表结构,自动生成对应的表单字段和查询逻辑。Spring Data的动态查询功能可以帮助实现这一目标,例如,使用`@Query`注解编写...

    Java直接通过连接数据库生成对应的Resful格式的API

    2. ORM(Object-Relational Mapping)框架:如Hibernate或MyBatis,它们可以将数据库中的表映射为Java对象,简化了数据库操作。在这个场景下,ORM框架可能用于自动根据表结构生成Java实体类和DAO层代码。 3. JPA...

    java代码自动生成器 ,通过页面生成

    总结来说,这个Java代码自动生成器是一个强大的开发辅助工具,它可以帮助开发者快速生成基于页面的、涵盖多种关系映射的代码,同时支持所有关系型数据库和Spring Boot框架。这极大地提高了开发效率,降低了出错的...

    spring roo 生成数据库表

    在这个场景中,"spring roo 生成数据库表"指的是使用Spring Roo工具来自动化创建与数据库表对应的Java实体类和数据访问层。 首先,Spring Roo支持多种数据库,包括MySQL、Oracle、PostgreSQL等。在开始之前,你需要...

    一款封装java访问数据库的底层数据库操作的jar

    5. 结果集处理:提供方便的方法将数据库查询结果转换为Java对象,例如POJO(Plain Old Java Object)。 6. 异常处理:封装了数据库操作可能出现的异常,提供统一的错误处理机制。 7. 示例代码:可能包含一些示例代码...

    spring的setter注入实现mysql数据库的连接

    在Spring框架中,setter注入是一种常见的依赖注入方式,它允许我们通过setter方法来设置对象的属性,从而实现组件之间的解耦。本篇文章将详细讲解如何使用setter注入来实现与MySQL数据库的连接。 首先,我们需要...

    Spring-generator一键生成数据库文件

    Spring-generator 是基于 javafx8 开发的图形界面 Spring 代码生成器,使用 Apache FreeMarker 作为代码文件的模板,用户可以一键将数据库中的表生成为任意风格的 .java 代码文件(比如经典的三层模型)。 Spring-...

    Java spring boot链接mql数据库 JDBC

    本示例将详细介绍如何在Spring Boot项目中利用JDBC(Java Database Connectivity)连接MySQL数据库,展示一个简单的数据库操作DEMO,包括连接数据库、访问数据库中的"mrchen"数据库下的"student"表格。 首先,我们...

    Spring Cloud+mybatise + mysql 自动生成代码工具

    总的来说,"Spring Cloud+mybatise + mysql 自动化代码生成工具"是Java开发中的利器,尤其在大型项目中,通过自动化的方式生成基础代码,可以极大地减轻开发负担,让团队更专注于创新和业务功能的实现。

    java多个数据库实现数据同步

    本文将深入探讨如何使用Java来实现多个数据库之间的数据同步。 首先,我们需要理解数据同步的含义。数据同步是指在两个或多个数据库之间,当某个数据库中的数据发生改变时,这些变化能够被实时或者近实时地反映到...

    Java代码生成器-基于springboot-多种数据库-5.5.7z

    在"Java代码生成器-基于springboot-多种数据库-5.5.7z"这个压缩包中,我们可以推测这是一个针对SpringBoot框架,并且支持多种数据库的代码生成解决方案。版本号为5.5,这通常代表了软件的一个更新迭代,可能包含了新...

    SpringBoot基于MYSQL动态生成数据库

    本文将深入探讨如何利用Spring Boot来实现基于MySQL的动态数据库生成。 首先,我们需要理解Spring Boot的核心特性。Spring Boot通过“约定优于配置”的原则,为开发者提供了快速构建应用的框架。它内置了Tomcat...

    java代码生成器(mysql版)

    6. **配置文件**:如果代码生成器支持Spring Boot,还会生成应用配置文件(如application.yml或application.properties),配置数据库连接信息等。 7. **模板引擎**:为了生成上述各种类型的类,代码生成器通常会...

    java Spring Boot 1.5.22 JPA数据库 JDK1.6

    5. **查询方法**:在Repository接口中定义查询方法,Spring Data JPA会根据方法名自动生成对应的SQL查询。 6. **事务管理**:Spring Boot中的`@Transactional`注解可用于标记需要在事务内执行的方法。 7. **JPA转换...

    学习Spring必学的Java基础知识(含数据库事务基础知识)

    学习Spring必学的Java基础知识(含数据库事务基础知识)

    Java操作数据库Spring(2)

    在Java开发中,Spring框架是极为重要的一环,它提供了许多功能来简化应用程序的构建,尤其是在操作数据库方面。本文将深入探讨如何使用Spring框架进行数据库操作,并基于给出的`pom.xml`文件中的依赖来解析相关知识...

Global site tag (gtag.js) - Google Analytics