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>
分享到:
相关推荐
### JAVA生成订单号(日期+流水号)的知识点解析 #### 一、概述 在现代电商及金融系统中,订单号作为唯一标识符扮演着极其重要的角色。它不仅需要具备唯一性,还要易于管理和追踪。本文将详细介绍一个通过Java语言...
是一个以spring为核心的项目脚手架(或者称为胶水框架),框架将各个零散的框架(struts,strust2,springmvc,hibernate,ibatis,spring_jdbc,flex)搭建好,并内置一个代码生成器,辅助项目开发,可以生成java的hibernat ...
Spring框架是Java EE开发的核心组件之一,它是一个全面的应用框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能。Spring还支持数据访问、Web应用、事务管理等多个方面,极大地简化了企业级应用的复杂性。在本案例...
Java代码生成工具是一种高效开发辅助软件,主要用于自动化生成基于Java技术栈的Web应用程序代码,尤其针对Struts2.1.8、Spring2.5和Hibernate3这三个经典框架的集成应用。这样的工具能够显著提高开发效率,减少手动...
标签中的“配置生成页面”可能指的是自动生成数据库查询页面的能力。这可以通过解析数据库表结构,自动生成对应的表单字段和查询逻辑。Spring Data的动态查询功能可以帮助实现这一目标,例如,使用`@Query`注解编写...
数据库课程设计 平行志愿录取系统(后端代码,广东工业大学数据库大作业) 基于java、spring、MySQL数据库、vue.js的课程设计.zip 数据库课程设计 平行志愿录取系统(后端代码,广东工业大学数据库大作业) 基于java...
2. ORM(Object-Relational Mapping)框架:如Hibernate或MyBatis,它们可以将数据库中的表映射为Java对象,简化了数据库操作。在这个场景下,ORM框架可能用于自动根据表结构生成Java实体类和DAO层代码。 3. JPA...
在这个场景中,"spring roo 生成数据库表"指的是使用Spring Roo工具来自动化创建与数据库表对应的Java实体类和数据访问层。 首先,Spring Roo支持多种数据库,包括MySQL、Oracle、PostgreSQL等。在开始之前,你需要...
总结来说,这个Java代码自动生成器是一个强大的开发辅助工具,它可以帮助开发者快速生成基于页面的、涵盖多种关系映射的代码,同时支持所有关系型数据库和Spring Boot框架。这极大地提高了开发效率,降低了出错的...
5. 结果集处理:提供方便的方法将数据库查询结果转换为Java对象,例如POJO(Plain Old Java Object)。 6. 异常处理:封装了数据库操作可能出现的异常,提供统一的错误处理机制。 7. 示例代码:可能包含一些示例代码...
在Spring框架中,setter注入是一种常见的依赖注入方式,它允许我们通过setter方法来设置对象的属性,从而实现组件之间的解耦。本篇文章将详细讲解如何使用setter注入来实现与MySQL数据库的连接。 首先,我们需要...
Spring-generator 是基于 javafx8 开发的图形界面 Spring 代码生成器,使用 Apache FreeMarker 作为代码文件的模板,用户可以一键将数据库中的表生成为任意风格的 .java 代码文件(比如经典的三层模型)。 Spring-...
本示例将详细介绍如何在Spring Boot项目中利用JDBC(Java Database Connectivity)连接MySQL数据库,展示一个简单的数据库操作DEMO,包括连接数据库、访问数据库中的"mrchen"数据库下的"student"表格。 首先,我们...
SpringBoot整合actable,根据实体自动反向生成数据库表,方法简洁明了,省去手动创建数据库表的麻烦。 运行环境 jdk8+mysql5.7+IntelliJ IDEA+maven 项目技术(必填) spring boot+mybatis 数据库文件(可选) ...
Spring框架是Java开发中广泛使用的轻量级框架,它提供了丰富的功能,包括依赖注入、面向切面编程以及全面的企业服务支持。在这个"spring连接数据库实例"中,我们将深入探讨Spring如何帮助开发者便捷地管理和操作...
本文将深入探讨如何使用Java来实现多个数据库之间的数据同步。 首先,我们需要理解数据同步的含义。数据同步是指在两个或多个数据库之间,当某个数据库中的数据发生改变时,这些变化能够被实时或者近实时地反映到...
在"Java代码生成器-基于springboot-多种数据库-5.5.7z"这个压缩包中,我们可以推测这是一个针对SpringBoot框架,并且支持多种数据库的代码生成解决方案。版本号为5.5,这通常代表了软件的一个更新迭代,可能包含了新...
# 基于Java和Spring的MySQL数据库门户系统 ## 项目简介 本项目是一个基于Java和Spring框架的MySQL数据库门户系统,旨在提供一个信息化程度高的数据库管理平台。项目作为北京大学信息管理系《面向对象程序设计JAVA...
本文将深入探讨如何利用Spring Boot来实现基于MySQL的动态数据库生成。 首先,我们需要理解Spring Boot的核心特性。Spring Boot通过“约定优于配置”的原则,为开发者提供了快速构建应用的框架。它内置了Tomcat...
6. **配置文件**:如果代码生成器支持Spring Boot,还会生成应用配置文件(如application.yml或application.properties),配置数据库连接信息等。 7. **模板引擎**:为了生成上述各种类型的类,代码生成器通常会...