`
收藏列表
标题 标签 来源
可恶意处理多级泛型和泛型数组。 泛型
以前用的获取泛型的一个方法,可恶意处理多级泛型和泛型数组。

/**
     * 取得范性信息
     *
     * @param cls
     * @param i
     * @return
     */
    private Class<?> getGenericClass(Class<?> cls, int i) {
        ParameterizedType parameterizedType = ((ParameterizedType) cls.getGenericInterfaces()[0]);
        Object genericClass = parameterizedType.getActualTypeArguments()[i];
        if (genericClass instanceof ParameterizedType) { // 处理多级泛型
            return (Class<?>) ((ParameterizedType) genericClass).getRawType();
        } else if (genericClass instanceof GenericArrayType) { // 处理数组泛型
            return (Class<?>) ((GenericArrayType) genericClass).getGenericComponentType();
        } else {
            return (Class<?>) genericClass;
        }
    } 
代码生成器
package org.myframework.codeutil;

import org.myframework.util.StringUtil;

public class Column {
	
	private String javaName;

	private String name;

	private String dataType ;
	
	private String unique;

	private String nullable ="false";

	private String length="10";

	private String precision="10";

	private String scale = "0";
	
	private String comments="";
	
	private String columnKey="";
	
	public String getComments() {
		return comments;
	}

	public void setComments(String comments) {
		this.comments = comments;
	}

	public String getColumnKey() {
		return columnKey;
	}

	public void setColumnKey(String columnKey) {
		this.columnKey = columnKey;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
		this.javaName = StringUtil.toBeanPatternStr(name);
	}

	public String getUnique() {
		return unique;
	}

	public void setUnique(String unique) {
		this.unique = unique;
	}

	public String getNullable() {
		return nullable;
	}

	public void setNullable(String nullable) {
		this.nullable = nullable;
	}

	public String getLength() {
		return length;
	}

	public void setLength(String length) {
		this.length = length;
	}

	public String getPrecision() {
		return precision;
	}

	public void setPrecision(String precision) {
		this.precision = precision;
	}

	public String getScale() {
		return scale;
	}

	public void setScale(String scale) {
		this.scale = scale;
	}

	public String getJavaName() {
		return javaName;
	}

	public void setJavaName(String javaName) {
		this.javaName = javaName;
	}

	public String getDataType() {
		return dataType;
	}

	public void setDataType(String dataType) {
		this.dataType = dataType;
	}

	@Override
	public String toString() {
		return "Column [javaName=" + javaName + ", name=" + name
				+ ", dataType=" + dataType + ", unique=" + unique
				+ ", nullable=" + nullable + ", length=" + length
				+ ", precision=" + precision + ", scale=" + scale
				+ ", comments=" + comments + ", columnKey=" + columnKey + "]";
	}

}


package org.myframework.codeutil;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.myframework.util.FileUtil;

public class CodeTool {
	private String tmplDir = "\\org\\myframework\\tmpl\\";
	private String encoding = "GBK";
	private String tmplFile;// ����
	private String absolutePath;// ����
	private Map context = new HashMap();
	boolean isDebug = false;

	public boolean getIsDebug() {
		return isDebug;
	}

	public void put(String key, Object value) {
		context.put(key, value);
	}

	public Object get(String key) {
		return context.get(key);
	}

	public void setIsDebug(boolean isDebug) {
		this.isDebug = isDebug;
	}

	public String getTmplFile() {
		return tmplFile;
	}

	public void setTmplFile(String tmplFile) {
		this.tmplFile = tmplFile;
	}

	public String getEncoding() {
		return encoding;
	}

	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}

	public String getAbsolutePath() {
		return absolutePath;
	}

	public void setAbsolutePath(String absolutePath) {
		this.absolutePath = absolutePath;
	}

	public Map getContext() {
		return context;
	}

	public void setContext(Map context) {
		this.context = context;
	}

	public void createFileByTmpl() throws Exception {
		Velocity.addProperty("file.resource.loader.path", getClassPath()
				+ tmplDir);
		Template template = Velocity.getTemplate(tmplFile, encoding);
		VelocityContext tmplContext = new VelocityContext(context);
		FileUtil.createFile(absolutePath);
		PrintWriter writer = new PrintWriter(
				new FileOutputStream(absolutePath), true);
		template.merge(tmplContext, writer);
		writer.flush();
		writer.close();
		if (isDebug) {
			debug();
		}
	}

	/**
	 * ȡ��Class·��
	 * 
	 * @return
	 */
	private String getClassPath() {
		URL url = this.getClass().getResource("/");
		File file = new File(url.getPath());
		return file.getAbsolutePath();
	}

	public void debug() throws Exception {
		Velocity.addProperty("file.resource.loader.path", getClassPath()
				+ tmplDir);
		Template template = Velocity.getTemplate(tmplFile, encoding);// ��ȡ�����ļ�
		VelocityContext tmplContext = new VelocityContext(context); // ��ȡ���̲���
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
				System.out));
		if (template != null)
			template.merge(tmplContext, writer); // ������ģ����ɵ��ļ�
		writer.flush();
		writer.close();
	}

	public CodeTool() {
		super();
	}

	public CodeTool(String tmplFile, String absolutePath) {
		super();
		this.tmplFile = tmplFile;
		this.absolutePath = absolutePath;
	}

	public static void main(String[] args) throws Exception {
//		CodeTool tool = new CodeTool();
//		tool.setTmplFile("tmpl/DAOImpl.tmpl");
//		tool.setAbsolutePath("D:/ABC/abc1.txt");
//		tool.createFileByTmpl();
		System.out.println("111");
	}
}

package org.myframework.codeutil;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.myframework.util.DateUtil;
import org.myframework.util.FileUtil;
import org.myframework.util.StringUtil;

public   class CodeGenerator {

	private final Log log = LogFactory.getLog(getClass());
	
	CodeTool tool = new CodeTool();

	private String pkgPrefix = "com.sunshine";

	private String module = "sys";

	private String subModule = "staff";

	private String tableName = "STAFF_INFO";

	private String codeDir="D://CODEGEN"; 

	private String classVar;

	private String className;

	private String keyVar;

	private String keyType;

	private String jspDir;
	
	private String packageName; 


	private void splitColumns( List<Column> lsColumns ) {
		List<Column> lsColumnTemp = new ArrayList(lsColumns.size());
		List<Column> pkColumns = new ArrayList<Column>(2);
		for (Column column : lsColumns) {
			if ("TRUE".equalsIgnoreCase(column.getColumnKey())) {
				pkColumns.add(column);
			}else{
				lsColumnTemp.add(column);
			}
		}
		tool.put("columnResult", lsColumnTemp);
		tool.put("pkResult", pkColumns);
	}

	public void initCodeTool(List<Column> lsColumns) throws Exception {
		classVar = StringUtil.toBeanPatternStr(tableName);
		className = StringUtil.firstCharUpperCase(classVar);
		pkgPrefix =pkgPrefix
		+ (StringUtil.isEmpty(module) ? "" : ("." + module))
		+ (StringUtil.isEmpty(subModule) ? "" : ("." + subModule));
		jspDir = (StringUtil.isEmpty(module) ? "" : ("/" + module))
				+ (StringUtil.isEmpty(subModule) ? "" : ("/" + subModule));
		tool.put("tableName", tableName);
		tool.put("className", className);
		tool.put("classVar", classVar);
		tool.put("packagePrefix", pkgPrefix);
		tool.put("packageName", packageName);
		tool.put("jspDir", jspDir);
		
		//把主键和非主键分别放入tool
		splitColumns(  lsColumns);
		
		org.apache.commons.lang.StringUtils  stringUtil = new  org.apache.commons.lang.StringUtils();
		tool.put("stringUtil",stringUtil );
		
		tool.put("needUpdate",true);
		tool.put("date", DateUtil.getCurrentDay());
		tool.put("author", System.getProperty("user.name"));
	}


	/**
	 *  模型层主键代码生成
	 * 
	 * @throws Exception
	 */
	private void createModelPkFile() throws Exception {
		List<Column> pkResult = (List<Column>) tool.get("pkResult");
		int pkCnt = pkResult.size();
		if (pkCnt > 1) {
			log.debug("创建复合主键类:");
			keyType = className + "PK";
			keyVar = classVar + "PK";
			tool.put("keyType", keyType);
			tool.put("keyVar", keyVar);
			
			String classNameWithPkg = pkgPrefix + ".model.base.Base" + keyType;
			String javaFile = codeDir + "/"
					+ FileUtil.getJavaFileName(classNameWithPkg);
			tool.setTmplFile("BaseModelPK.tmpl");
			tool.setAbsolutePath(javaFile);
			tool.createFileByTmpl();

			classNameWithPkg = pkgPrefix + ".model." + keyType;
			javaFile = codeDir + "/"
					+ FileUtil.getJavaFileName(classNameWithPkg);
			tool.setTmplFile("modelPK.tmpl");
			tool.setAbsolutePath(javaFile);
			tool.createFileByTmpl();
		} else if (pkCnt == 1) {
			Column column =   pkResult.get(0);
			keyType =column.getDataType();
			keyVar = column.getJavaName();
			tool.put("keyType", keyType);
			tool.put("keyVar", keyVar);
		} else {
			throw new Exception("该表无主键!!!!!!!!");
		}
		
		tool.put("idGetMethod", "get" + StringUtil.firstCharUpperCase(keyVar));
		
	}

	/**
	 * STEP 1 :模型层代码生成
	 * 
	 * @throws Exception
	 */
	public void createModelFile() throws Exception {

		createModelPkFile();

		// 生成文件信息
		String classNameWithPkg = pkgPrefix + ".model.base.Base" + className;
		String javaFile = codeDir + "/"
				+ FileUtil.getJavaFileName(classNameWithPkg);
		tool.setTmplFile("BaseModel.tmpl");
		tool.setAbsolutePath(javaFile);
		tool.createFileByTmpl();

		classNameWithPkg = pkgPrefix + ".model." + className;
		javaFile = codeDir + "/" + FileUtil.getJavaFileName(classNameWithPkg);
		tool.setTmplFile("model.tmpl");
		tool.setAbsolutePath(javaFile);
		tool.createFileByTmpl();
	}

	/**
	 * 2持久层代码生成
	 * 
	 * @throws Exception
	 */
	@Test
	public void createDAOFile() throws Exception {
		String classNameWithPkg = pkgPrefix + ".dao." + className + "DAO";
		String javaFile = codeDir + "/"
				+ FileUtil.getJavaFileName(classNameWithPkg);
		tool.setTmplFile("DaoInterface.tmpl");
		tool.setAbsolutePath(javaFile);
		tool.createFileByTmpl();

		classNameWithPkg = pkgPrefix + ".dao.hibernate." + className
				+ "DAOHibernate";
		javaFile = codeDir + "/" + FileUtil.getJavaFileName(classNameWithPkg);
		tool.setTmplFile("DaoImpl.tmpl");
		tool.setAbsolutePath(javaFile);
		tool.createFileByTmpl();
	}

	/**
	 * STEP 3 :业务逻辑层代码生成
	 * 
	 * @throws Exception
	 */
	public void createBusinessFile() throws Exception {

		String classNameWithPkg = pkgPrefix + ".service." + className
				+ "Manager";
		String javaFile = codeDir + "/"
				+ FileUtil.getJavaFileName(classNameWithPkg);
		tool.setTmplFile("ManagerInterface.tmpl");
		tool.setAbsolutePath(javaFile);
		tool.createFileByTmpl();

		classNameWithPkg = pkgPrefix + ".service.impl." + className
				+ "ManagerImpl";
		javaFile = codeDir + "/" + FileUtil.getJavaFileName(classNameWithPkg);
		tool.setTmplFile("ManagerImpl.tmpl");
		tool.setAbsolutePath(javaFile);
		tool.createFileByTmpl();

	}

	/**
	 * STEP 4 :控制层代码生成
	 * 
	 * @throws Exception
	 */
	public void createControlFile() throws Exception {
		// CREATE SPRING CONTROLLER
		String classNameWithPkg = pkgPrefix + ".web.action." + className
				+ "Controller";
		String javaFile = codeDir + "/"
				+ FileUtil.getJavaFileName(classNameWithPkg);
		tool.setTmplFile("controllerFile.tmpl");
		tool.setAbsolutePath(javaFile);
		tool.createFileByTmpl();

	}

	/**
	 * STEP 5 :视图层代码生成
	 * 
	 * @throws Exception
	 */
	public void createViewFile() throws Exception {
		// 视图层
		tool.setTmplFile("magJsp.tmpl");
		tool.setAbsolutePath(codeDir + jspDir + "/init" + className + "Mag.jsp");
		tool.createFileByTmpl();

		tool.setTmplFile("editJsp.tmpl");
		tool.setAbsolutePath(codeDir + jspDir + "/init" + className
				+ "Edit.jsp");
		tool.createFileByTmpl();

		tool.setTmplFile("qryListJsp.tmpl");
		tool.setAbsolutePath(codeDir + jspDir + "/qry" + className + "List.jsp");
		tool.createFileByTmpl();

	}

	/**
	 * STEP 7 :单元测试代码生成
	 * 
	 * @throws Exception
	 */
	public void createJunitFile() throws Exception {

		String classNameWithPkg = pkgPrefix + ".test." + className + "Test";
		String javaFile = codeDir + "/"
				+ FileUtil.getJavaFileName(classNameWithPkg);
		tool.setTmplFile("jUnitTest.tmpl");
		tool.setAbsolutePath(javaFile);
		tool.createFileByTmpl();

	}

	public String getPkgPrefix() {
		return pkgPrefix;
	}

	public void setPkgPrefix(String pkgPrefix) {
		this.pkgPrefix = pkgPrefix;
	}

	public String getModule() {
		return module;
	}

	public void setModule(String module) {
		this.module = module;
	}

	public String getSubModule() {
		return subModule;
	}

	public void setSubModule(String subModule) {
		this.subModule = subModule;
	}

	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

}



package org.myframework.codeutil;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.myframework.util.StringUtil;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class JDBCCodeGenerator {
	private final static Log log = LogFactory.getLog(JDBCCodeGenerator.class);

	public static List<Column> getLsColumns(String tableName) throws Exception {
		String[] springFiles = { "org/myframework/codeutil/context-codetool.xml" };
		ApplicationContext context = new ClassPathXmlApplicationContext(
				springFiles);

//		MyJdbcTemplate myJdbcTemplate = context.getBean("myJdbcTemplate",
//				MyJdbcTemplate.class);
//		Connection conn = myJdbcTemplate.getDataSource().getConnection();
		
		DataSource dataSource = context.getBean("dataSource", DataSource.class);
		Connection conn = dataSource.getConnection();
		
		List<Column> lsColumns = new ArrayList<Column>(10);
		
		PreparedStatement stmt = conn.prepareStatement("select *  from "+tableName+" where 1=0 ");
		ResultSet resultSet = stmt.executeQuery();
		ResultSetMetaData rsmd = resultSet.getMetaData();
		int n = rsmd.getColumnCount();
		for (int i = 1; i <= n; i++)
		{
			String colName = rsmd.getColumnName(i);
			String fieldName = StringUtil.toBeanPatternStr(colName);
			Column column = new Column();
			column.setName(colName) ;
			column.setJavaName(fieldName) ;
			column.setDataType(rsmd.getColumnClassName(i));
			column.setPrecision(String.valueOf(rsmd.getPrecision(i)));
			column.setScale( String.valueOf(rsmd.getScale(i)) );
			column.setLength( String.valueOf(rsmd.getColumnDisplaySize(i)));
			column.setNullable(String.valueOf("1".equals(rsmd.isNullable(i))));
			
			DatabaseMetaData dbmd = conn.getMetaData();
			ResultSet rs = dbmd.getColumns(null, null, tableName, null);
			while (rs.next()) {
				if (colName.equals(rs.getString("COLUMN_NAME")))
					column.setComments(rs.getString("REMARKS"));
			}
			
			ResultSet rs2 = dbmd.getPrimaryKeys(null, null, "DEMO");
			while (rs2.next()) {
				if (colName.equals(rs2.getString("COLUMN_NAME")))
					column.setColumnKey("TRUE");	
			}
			
			log.debug("------------------"+column+"---------------------" );
			lsColumns.add(column);
		}
		
		return lsColumns;
	}

	/**
	 * 代码生成工具调用
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		CodeGenerator code = new CodeGenerator();
		code.setPkgPrefix("com.sunshine");
		code.setTableName("DEMO");
		code.setModule("abc");
		code.setSubModule("sys");

		code.initCodeTool(getLsColumns("DEMO"));
		code.createModelFile();
		code.createDAOFile();
		code.createBusinessFile();
		code.createControlFile();
	}

}



package org.myframework.codeutil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.myframework.jdbc.MyJdbcTemplate;
import org.myframework.util.StringUtil;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MySqlCodeGenerator {
	private final static Log log = LogFactory.getLog(MySqlCodeGenerator.class);
	public static HashMap<String, String> columnType = new HashMap<String, String>(
			5);

	static {
		columnType.put("longtext", "String");
		columnType.put("varchar", "String");
		columnType.put("int", "Integer");
		columnType.put("bigint", "Long");
		columnType.put("smallint", "Integer");
		columnType.put("float", "Float");
		columnType.put("double", "Double");
		columnType.put("date", "java.sql.Date");
		columnType.put("datetime", "java.sql.Timestamp");
	}

	public static List<Column> getLsColumns(String tableName) {
		String[] springFiles = { "org/myframework/codeutil/context-codetool.xml" };
		ApplicationContext context = new ClassPathXmlApplicationContext(
				springFiles);

		MyJdbcTemplate myJdbcTemplate = context.getBean("myJdbcTemplate",
				MyJdbcTemplate.class);
		HashMap paramMap = new HashMap<String, Object>();
		paramMap.put("TABLE_NAME", tableName);
		StringBuffer sql = new StringBuffer(512);
		sql.append("SELECT TABLE_NAME, \n");
		sql.append("       COLUMN_NAME, \n");
		sql.append("       DATA_TYPE, \n");
		sql.append("       ORDINAL_POSITION, \n");
		sql.append("       COLUMN_DEFAULT, \n");
		sql.append("       CHARACTER_MAXIMUM_LENGTH, \n");
		sql.append("       CHARACTER_OCTET_LENGTH, \n");
		sql.append("       NUMERIC_PRECISION, \n");
		sql.append("       NUMERIC_SCALE, \n");
		sql.append("       IS_NULLABLE, \n");
		sql.append("       COLUMN_COMMENT, \n");
		sql.append("       COLUMN_KEY \n");
		sql.append("  FROM INFORMATION_SCHEMA.COLUMNS \n");
		sql.append(" WHERE TABLE_SCHEMA = 'TEST' \n");
		sql.append("   AND TABLE_NAME = 'DEMO' \n");
		List<Column> lsColumns = new ArrayList<Column>(10);
		List<Map<String, Object>> columns = myJdbcTemplate.queryForList(
				sql.toString(), paramMap);
		for (Map<String, Object> column1 : columns) {
			Column column2 = new Column();
			column2.setName(column1.get("COLUMN_NAME").toString());// 字段名
			column2.setComments(column1.get("COLUMN_COMMENT").toString()); // 注释
			column2.setColumnKey(String.valueOf("PRI".equalsIgnoreCase(column1
					.get("COLUMN_KEY").toString())));// 是否主键
			column2.setDataType(columnType.get(column1.get("DATA_TYPE")
					.toString()));// JAVA 对应数据类型
			column2.setNullable(String.valueOf("YES".equalsIgnoreCase(column1
					.get("IS_NULLABLE").toString())));
		
			if(!StringUtil.isEmpty(column1.get("NUMERIC_PRECISION"))){
				column2.setPrecision( column1.get("NUMERIC_PRECISION").toString() );
			}
			if(!StringUtil.isEmpty(column1.get("NUMERIC_SCALE"))){
				column2.setScale(  column1.get("NUMERIC_SCALE").toString() );// 
			}
			if(!StringUtil.isEmpty(column1.get("CHARACTER_MAXIMUM_LENGTH"))){
				column2.setLength(  column1.get("CHARACTER_MAXIMUM_LENGTH").toString() );// 
			} 
			 
			log.debug(column2);
			lsColumns.add(column2);
		}
		return lsColumns;
	}

	/**
	 * 代码生成工具调用
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		CodeGenerator code = new CodeGenerator();
		code.setPkgPrefix("com.sunshine");
		code.setTableName("DEMO");
		code.setModule("abc");
		code.setSubModule("sys");

		code.initCodeTool(getLsColumns("DEMO"));
		code.createModelFile();
		code.createDAOFile();
		code.createBusinessFile();
		code.createControlFile();
	}

}
DBUtils
package org.lyq.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
/**  
 * 经典的数据库访问接口  
 * @author 李永强  
 * @version 2.0  
 */ 
public class DBUtil {
	private static DBUtil dbUtil = null;   
    private List<Connection> idle = new ArrayList<Connection>(0);   
    private Map<Thread, Connection> busy = new HashMap<Thread, Connection>(0);   
    private Map<String, Connection> cache = new HashMap<String, Connection>(0);   
    private String dialect = "ORACLE";   
    private int maxsize = 3;   
  
    /**  
     * 私有构造不让直接创建一个DBUtil实例 读取配置文件加载数据库配置信息,创建一定数量的连接到连接池
     */  
    private DBUtil() {   
        InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("db_cfg.properties");   
        Properties prop = new Properties();   
        try {   
            prop.load(in);   
            String driver = (String) prop.get("db.driver");   
            String url = (String) prop.get("db.url");   
            String username = (String) prop.get("db.username");   
            String password = (String) prop.get("db.password");   
            if (prop.get("db.maxsize") != null) {   
                maxsize = Integer.parseInt(prop.get("db.maxsize").toString());   
            }   
            if (prop.get("db.dialect") != null) {   
                dialect = (String) prop.get("db.dialect");   
            }   
            Class.forName(driver);   
            for (int k = 0; k < maxsize; k++) {   
                Connection conn = DriverManager.getConnection(url, username, password);   
                idle.add(conn);   
            }   
        } catch (Exception e) {   
            e.printStackTrace();   
        } finally {   
            try {   
                in.close();   
            } catch (IOException e) {   
                e.printStackTrace();   
            }   
        }   
    }   
  
    /**  
     * 获得数据库访问接口  
     * @return 数据库访问接口DBUtil单例  
     */  
    public static DBUtil getInstance() {   
        if (null == dbUtil) {   
            dbUtil = new DBUtil();   
        }   
        return dbUtil;   
    }   
  
    /**  
     * 获得数据库连接  
     * @return 数据库连接  
     */  
    private synchronized Connection getConn() {   
        Connection conn = null;   
        try {   
            if (idle.size() == 0) {   
                wait();   
            }   
            conn = idle.get(0);   
            busy.put(Thread.currentThread(), conn);   
            idle.remove(0);   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
        return conn;   
    }   
  
    /**  
     * 关闭所有对对象,归还链接到连接池  
     * @param rs  数据集对象  
     * @param ps 命令对象  
     */  
    private synchronized void closeAll(ResultSet rs, PreparedStatement ps) {   
        if (null != rs) {   
            try {   
                rs.close();   
            } catch (SQLException e) {   
                e.printStackTrace();   
            }   
        }   
        if (null != ps) {   
            try {   
                ps.close();   
            } catch (SQLException e) {   
                e.printStackTrace();   
            }   
        }   
        Connection conn = busy.get(Thread.currentThread());   
        if (null != conn) {   
            idle.add(conn);   
            busy.remove(Thread.currentThread());   
            notify();   
        }   
    }   
  
    /**  
     * 无事务更新(不带参数)  
     * @param sql  SQL语句 :"update table set price=200.00"  
     * @return 受影响行数  
     * @throws SQLException  
     */  
    public int update(String sql) throws SQLException {   
        int result = 0;   
        Connection conn = null;   
        PreparedStatement ps = null;   
        try {   
            conn = getConn();   
            ps = conn.prepareStatement(sql);   
            result = ps.executeUpdate();   
        } catch (SQLException e) {   
            throw e;   
        } finally {   
            closeAll(null, ps);   
        }   
        return result;   
    }   
  
    /**  
     * 无事务更新(带参数)  
     * @param sql SQL语句 :"delete from table where id=?"  
     * @param params  参数对象数组 :new Object[]{参数1,参数2,...}  
     * @return 受影响行数  
     * @throws SQLException  
     */  
    public int update(String sql, Object[] params) throws SQLException {   
        int result = 0;   
        Connection conn = null;   
        PreparedStatement ps = null;   
        try {   
            conn = getConn();   
            ps = conn.prepareStatement(sql);   
            for (int i = 0; i < params.length; i++) {   
                ps.setObject(i + 1, params[i]);   
            }   
            result = ps.executeUpdate();   
        } catch (SQLException e) {   
            throw e;   
        } finally {   
            closeAll(null, ps);   
        }   
        return result;   
    }   
  
    /**  
     * 在事务下更新(不带参数)  
     * @param transId  事务ID  
     * @param sql  SQL语句 :"update table set price=200.00"  
     * @return 受影响行数  
     * @throws SQLException  
     */  
    public int update(String transId, String sql) throws SQLException {   
        int result = 0;   
        Connection conn = cache.get(transId);   
        try {   
            PreparedStatement ps = conn.prepareStatement(sql);   
            result = ps.executeUpdate();   
        } catch (SQLException e) {   
            throw e;   
        }   
        return result;   
    }   
  
    /**  
     * 在事务下更新(带参数)  
     * @param transId 事务ID  
     * @param sql SQL语句 :"delete from table where id=?"  
     * @param params 参数对象数组 :new Object[]{参数1,参数2,...}  
     * @return 受影响行数  
     * @throws SQLException  
     */  
    public int update(String transId, String sql, Object[] params)   
            throws SQLException {   
        int result = 0;   
        Connection conn = cache.get(transId);   
        try {   
            PreparedStatement ps = conn.prepareStatement(sql);   
            for (int i = 0; i < params.length; i++) {   
                ps.setObject(i + 1, params[i]);   
            }   
            result = ps.executeUpdate();   
        } catch (SQLException e) {   
            throw e;   
        }   
        return result;   
    }   
  
    /**  
     * 非事务下批量更新  
     * @param sql  SQL语句 :"insert into table(p1,p2,p3) values(?,?,?)"  
     * @param params 参数集合List<Object[]> 其中new Object[]{参数1,参数2,...}  
     * @return 受影响行数  
     * @throws SQLException  
     */  
    public int[] batchUpdate(String sql, List<Object[]> params)   
            throws SQLException {   
        int[] result = new int[params.size()];   
        Connection conn = null;   
        PreparedStatement ps = null;   
        try {   
            conn = getConn();   
            conn.setAutoCommit(false);   
            ps = conn.prepareStatement(sql);   
            for (Object[] objects : params) {   
                for (int i = 0; i < objects.length; i++) {   
                    ps.setObject(i + 1, objects[i]);   
                }   
                ps.addBatch();   
            }   
            result = ps.executeBatch();   
            conn.commit();   
        } catch (SQLException e) {   
            throw e;   
        } finally {   
            closeAll(null, ps);   
        }   
        return result;   
    }   
  
    /**  
     * 在事务下批量更新  
     * @param transId 事务ID  
     * @param sql SQL语句 :"insert into table(p1,p2,p3) values(?,?,?)"  
     * @param params 参数集合List<Object[]> 其中new Object[]{参数1,参数2,...}  
     * @return 受影响行数  
     * @throws SQLException  
     */  
    public int[] batchUpdate(String transId, String sql, List<Object[]> params) throws SQLException {   
        int[] result = new int[params.size()];   
  
        Connection conn = cache.get(transId);   
        PreparedStatement ps = conn.prepareStatement(sql);   
        for (Object[] objects : params) {   
            for (int i = 0; i < objects.length; i++) {   
                ps.setObject(i + 1, objects[i]);   
            }   
            ps.addBatch();   
        }   
        result = ps.executeBatch();   
        return result;   
    }   
  
    /**  
     * 查询(不带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值  
     * @param sql SQL语句 :"select * from table"  
     * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值  
     * @throws SQLException  
     */  
    public List<Map<String, Object>> query(String sql) throws SQLException {   
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();   
        Connection conn = null;   
        PreparedStatement ps = null;   
        ResultSet rs = null;   
        try {   
            conn = getConn();   
            ps = conn.prepareStatement(sql);   
            rs = ps.executeQuery();   
            ResultSetMetaData rsmd = rs.getMetaData();   
            int colCount = rsmd.getColumnCount();   
            while (rs.next()) {   
                Map<String, Object> map = new HashMap<String, Object>();   
                for (int i = 0; i < colCount; i++) {   
                    String key = rsmd.getColumnLabel(i + 1).toLowerCase();   
                    Object val = rs.getObject(i + 1) != null ? rs   
                            .getObject(i + 1) : "";   
                    map.put(key, val);   
                }   
                list.add(map);   
            }   
        } catch (SQLException e) {   
            throw e;   
        } finally {   
            closeAll(rs, ps);   
        }   
        return list;   
    }   
  
    /**  
     * 分页查询(不带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值  
     * @param sql SQL语句 :"select * from table"  
     * @param currPage 第几页  
     * @param pageSize 每页记录数  
     * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值  
     * @throws SQLException  
     */  
    public List<Map<String, Object>> queryPager(String sql, int currPage,   
            int pageSize) throws SQLException {   
        String pageSql = getPageSql(sql, currPage, pageSize);   
        return query(pageSql);   
    }   
  
    /**  
     * 查询(带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值  
     * @param sql SQL语句 :"select * from table where id = ?"  
     * @param params 参数对象数组 :new Object[]{参数1,参数2,...}  
     * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值  
     * @throws SQLException  
     */  
    public List<Map<String, Object>> query(String sql, Object[] params) throws SQLException {   
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();   
        Connection conn = null;   
        PreparedStatement ps = null;   
        ResultSet rs = null;   
        try {   
            conn = getConn();   
            ps = conn.prepareStatement(sql);   
            for (int i = 0; i < params.length; i++) {   
                ps.setObject(i + 1, params[i]);   
            }   
            rs = ps.executeQuery();   
            ResultSetMetaData rsmd = rs.getMetaData();   
            int colCount = rsmd.getColumnCount();   
            while (rs.next()) {   
                Map<String, Object> map = new HashMap<String, Object>();   
                for (int i = 0; i < colCount; i++) {   
                    String key = rsmd.getColumnLabel(i + 1).toLowerCase();   
                    Object val = rs.getObject(i + 1) != null ? rs   
                            .getObject(i + 1) : "";   
                    map.put(key, val);   
                }   
                list.add(map);   
            }   
        } catch (SQLException e) {   
            throw e;   
        } finally {   
            closeAll(rs, ps);   
        }   
        return list;   
    }   
  
    /**  
     * 分页查询(带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值  
     * @param sql SQL语句 :"select * from table where id = ?"  
     * @param params 参数对象数组 :new Object[]{参数1,参数2,...}  
     * @param currPage 第几页  
     * @param pageSize 每页记录数  
     * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值  
     * @throws SQLException  
     */  
    public List<Map<String, Object>> queryPager(String sql, Object[] params,   
            int currPage, int pageSize) throws SQLException {   
        String pageSql = getPageSql(sql, currPage, pageSize);   
        return query(pageSql);   
    }   
  
    /**  
     * 单值查询(不带参数)  
     * @param sql SQL语句 :"select name from table"  
     * @return 单值  
     * @throws SQLException  
     */  
    public String scalar(String sql) throws SQLException {   
        String res = null;   
        Connection conn = null;   
        PreparedStatement ps = null;   
        ResultSet rs = null;   
        try {   
            conn = getConn();   
            ps = conn.prepareStatement(sql);   
            rs = ps.executeQuery();   
            if (rs.next()) {   
                res = String.valueOf(rs.getObject(1));   
            }   
        } catch (SQLException e) {   
            throw e;   
        } finally {   
            closeAll(rs, ps);   
        }   
        return res;   
    }   
  
    /**  
     * 单值查询(带参)  
     * @param sql SQL语句 :"select name from table where id=?"  
     * @param params 参数对象数组 :new Object[]{参数1,参数2,...}  
     * @return 单值  
     * @throws SQLException  
     */  
    public String scalar(String sql, Object[] params) throws SQLException {   
        String res = null;   
        Connection conn = null;   
        PreparedStatement ps = null;   
        ResultSet rs = null;   
        try {   
            conn = getConn();   
            ps = conn.prepareStatement(sql);   
            for (int i = 0; i < params.length; i++) {   
                ps.setObject(i + 1, params[i]);   
            }   
            rs = ps.executeQuery();   
            if (rs.next()) {   
                res = String.valueOf(rs.getObject(1));   
            }   
        } catch (SQLException e) {   
            throw e;   
        } finally {   
            closeAll(rs, ps);   
        }   
        return res;   
    }   
  
    /**  
     * 执行存储过程  
     * @param procName 存储过程  
     * @param params 存储过程参数对象数组 :new Object[]{参数1,参数2,...}  
     * @param outParamNum 输出参数个数  
     * @return 输出参数  
     * @throws SQLException  
     */  
    public String[] execProc(String procName, Object[] params, int outParamNum)   
            throws SQLException {   
        String[] ret = new String[outParamNum];   
        Connection conn = null;   
        CallableStatement cs = null;   
        int inParamNum = (null != params) ? params.length : 0;   
        String procSql = getProcSql(procName, inParamNum, outParamNum);   
        try {   
            conn = getConn();   
            cs = conn.prepareCall(procSql);   
            for (int i = 0; i < inParamNum; i++) {   
                cs.setObject(i + 1, params[i]);   
            }   
            for (int k = 1; k <= outParamNum; k++) {   
                cs.registerOutParameter(inParamNum + k, Types.VARCHAR);   
            }   
            cs.executeQuery();   
            for (int k = 1; k <= outParamNum; k++) {   
                ret[k - 1] = cs.getString(inParamNum + k);   
            }   
        } catch (SQLException e) {   
            throw e;   
        } finally {   
            closeAll(null, cs);   
        }   
        return ret;   
    }   
  
    /**  
     * 开始事务  
     * @return 事务ID  
     */  
    public String beginTrans() {   
        String transId = null;   
        try {   
            Connection conn = getConn();   
            conn.setAutoCommit(false);   
            transId = UUID.randomUUID().toString();   
            cache.put(transId, conn);   
        } catch (SQLException e) {   
            e.printStackTrace();   
        }   
        return transId;   
    }   
  
    /**  
     * 事务提交  
     * @param transId  事务ID  
     */  
    public void commitTrans(String transId) {   
        Connection conn = null;   
        try {   
            conn = cache.get(transId);   
            conn.commit();   
            conn.setAutoCommit(true);   
        } catch (SQLException e) {   
            e.printStackTrace();   
        } finally {   
            closeAll(null, null);   
            cache.remove(conn);   
        }   
    }   
  
    /**  
     * 事务回滚  
     * @param transId 事务ID  
     */  
    public void rollbackTrans(String transId) {   
        Connection conn = null;   
        try {   
            conn = cache.get(transId);   
            conn.rollback();   
            conn.setAutoCommit(true);   
        } catch (SQLException e) {   
            e.printStackTrace();   
        } finally {   
            closeAll(null, null);   
            cache.remove(conn);   
        }   
    }   
  
    /**  
     * 得到分页SQL语句  
     * @param sql 基本SQL语句  
     * @param currPage 当前页  
     * @param pageSize 每页记录数  
     * @return 分页SQL语句  
     */  
    private String getPageSql(String sql, int currPage, int pageSize) {   
        StringBuffer pageSql = new StringBuffer(0);   
        if ("oracle".equalsIgnoreCase(dialect)) {   
            pageSql.append("SELECT * FROM(SELECT FA.*, ROWNUM RN FROM (");   
            pageSql.append(sql).append(") FA WHERE ROWNUM <= ");   
            pageSql.append(currPage * pageSize).append(")WHERE RN >= ").append(   
                    (currPage - 1) * pageSize + 1);   
        }   
        if ("mysql".equalsIgnoreCase(dialect)) {   
            pageSql.append(sql).append(" limit ").append(   
                    (currPage - 1) * pageSize).append(",").append(pageSize);   
        }   
        return pageSql.toString();   
    }   
  
    /**  
     * 得到存储过程语句  
     * @param procName 存储过程  
     * @param inParamNum 输入参数个数  
     * @param outParamNum 输出参数个数  
     * @return  
     * @throws SQLException  
     */  
    private String getProcSql(String procName, int inParamNum, int outParamNum) throws SQLException {   
        StringBuffer sb = new StringBuffer();   
        sb.append("{call ").append(procName);   
        int paramCount = inParamNum + outParamNum;   
        if (paramCount > 0) {   
            sb.append("(");   
            for (int i = 0; i < paramCount; i++) {   
                sb.append("?");   
                if (i != paramCount - 1) {   
                    sb.append(",");   
                }   
            }   
            sb.append(")");   
        }   
        sb.append("}");   
        return sb.toString();   
    }   
       
    /**  
     * 测试DBUtil  
     * @param args  
     */  
    public static void main(String[] args) {   
        try {   
            DBUtil dao = DBUtil.getInstance();   
            String sql0 = "select addd from operate";   
            String sql = "select * from rolepower rp where rolecode = (select ur.rolecode from user u left join userrole ur on u.code = ur.usercode where u.code = 0001)";   
            List<Map<String, Object>> list = dao.query(sql);   
            sql = "select * from operate";   
            String count = dao.scalar(sql0);   
            // list = dao.queryPager(sql, 1, 10);   
            System.out.println(count);   
            System.out.println(list.size());   
            // System.out.println(list.get(0).get("name"));   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   

}
TreeSet 找出Top N 看网友的一道腾讯面试题有感
package model.test;

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;

//10000+个数字钟找出top100 
public class Top {
	Set<Integer> top;
	int topNumber;

	public Top(int topNumber,Set<Integer> inputValues) {
		this.topNumber = topNumber;
		this.top = new TreeSet<Integer>(new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return o1 - o2;
			}
		});
		for(int input:inputValues){
			this.add(input);
		}
	}
	
	public Integer[] getTop(){
		return this.top.toArray(new Integer[] {});
	}

	private void add(int value) {
		if (this.topNumber == this.top.size() && value > (Integer) this.top.toArray()[0]) {
			this.top.remove(this.top.toArray()[0]);
		}
		if (this.top.size() < this.topNumber) {
			this.top.add(new Integer(value));
		}
	}
	
	public static void main(String[] args) {
		//准备测试数据
		Set<Integer> input=new HashSet<Integer>();
		for(int i=0;i<50000;i++){
			input.add(new Integer(new Random().nextInt(Integer.MAX_VALUE)));
		}
		//输出结果
		System.out.println(Arrays.toString(new Top(1000, input).getTop()));
	}
}
upload,file J2EE上传文件至服务器
package com.syc.servlet;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;

public class FileUploadServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1315419529138965268L;

	public FileUploadServlet() {
		super();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("gbk");
		RequestContext requestContext = new ServletRequestContext(request);

		if (FileUpload.isMultipartContent(requestContext)) {

			DiskFileItemFactory factory = new DiskFileItemFactory();
			factory.setRepository(new File("e:/Log/"));
			ServletFileUpload upload = new ServletFileUpload(factory);
			// upload.setHeaderEncoding("gbk");
			upload.setSizeMax(2000000);
			List items = new ArrayList();
			try {
				items = upload.parseRequest(request);
			} catch (FileUploadException e1) {
				System.out.println("文件上传发生错误" + e1.getMessage());
			}

			Iterator it = items.iterator();
			while (it.hasNext()) {
				FileItem fileItem = (FileItem) it.next();
				if (fileItem.isFormField()) {
					System.out.println(fileItem.getFieldName()
							+ " "
							+ fileItem.getName()
							+ " "
							+ new String(fileItem.getString().getBytes(
									"iso8859-1"), "gbk"));
				} else {
					System.out.println(fileItem.getFieldName() + " "
							+ fileItem.getName() + " " + fileItem.isInMemory()
							+ " " + fileItem.getContentType() + " "
							+ fileItem.getSize());

					if (fileItem.getName() != null && fileItem.getSize() != 0) {
						File fullFile = new File(fileItem.getName());
						File newFile = new File("e:/Log/" + fullFile.getName());
						try {
							fileItem.write(newFile);
						} catch (Exception e) {
							e.printStackTrace();
						}
					} else {
						System.out.println("文件没有选择 或 文件内容为空");
					}
				}

			}
		}
	}

}
log4j日志自动发送Gtalk log4j, gtalk
package cn.sccl;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ThrowableInformation;

public class GtalkAppender extends AppenderSkeleton {

	/**
	 * server
	 */
	private String server = "http://botalk.imincloud.com";

	/**
	 * api key
	 */
	private String apikey="0ccb1fdd5aa8431a82efa02d831c9198";

	/**
	 * recive user
	 */
	private String to;

	/**
	 * message title
	 */
	private String title = "Log4j Notify";

	/**
	 * The last send message time. use it to control send frz
	 */
	private long lastSendTime = 0;

	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	private ExecutorService threadPool;

	public GtalkAppender() {
		threadPool = Executors.newSingleThreadExecutor();
	}

	protected void append(LoggingEvent event) {
		long now = System.currentTimeMillis();
		if ((now - lastSendTime) > 1000) {//igron some message
			String content = sdf.format(new Date()) + " " + event.getLevel()
					+ " [" + event.getLoggerName() + "]\n"
					+ event.getRenderedMessage() + "\n";

			if (event.getThrowableInformation() != null) {
				ThrowableInformation ti = event.getThrowableInformation();
				String[] throwableStrRep = ti.getThrowableStrRep();
				if (throwableStrRep != null) {
					int k = throwableStrRep.length;
					if (k > 3) {
						k = 3;
					}
					for (int i = 0; i < k; i++) {
						content += throwableStrRep[i] + "\n";
					}
				}
			}
			final String message = content;
			threadPool.submit(new Runnable() {
				public void run() {
					sendMessage(message);

				}
			});
		}
	}
	/**
	 * 调用gtalk发送信息
	 * @param content
	 */
	private void sendMessage(String content) {
		if (content.length() > 400) {
			content = content.substring(0, 400);
		}
		try {
			content = URLEncoder.encode(title + "\n" + content, "utf-8");

			String urlAddress = server + "/api/pushMsg?key=" + apikey + "&to="
					+ to + "&msg=" + content;

			String r = httpGet(urlAddress);
			if (r != null) {
				r = r.trim();
			}

			if ("403:FAILE".equals(r)) {
				System.err.println(to + " need add robot log4j@imincloud.com");
			}

			lastSendTime = System.currentTimeMillis();

		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private int getIntValue(String string) {
		return Integer.parseInt(getValue(string));
	}

	private String getValue(String string) {
		int i = string.indexOf("=");
		if (i > 0) {
			return string.substring(i + 1, string.length()).trim();
		} else {
			return null;
		}
	}

	public String httpGet(String urlAddress) throws IOException {
		URL url = new URL(urlAddress);

		InputStream in = null;
		StringBuilder sb = new StringBuilder();
		try {
			URLConnection c = url.openConnection();
			in = c.getInputStream();

			BufferedReader br = new BufferedReader(new InputStreamReader(in));
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line).append("\n");
			}
		} finally {
			try {
				if (in != null)
					in.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return sb.toString();
	}

	public void close() {
		this.closed = true;
		threadPool.shutdown();
	}

	public boolean requiresLayout() {
		return false;
	}

	// ///////////////// getter and setter ////////////////////

	public String getTo() {
		return to;
	}

	public void setTo(String mids) {
		this.to = mids;
	}

	public String getServer() {
		return server;
	}

	public void setServer(String server) {
		this.server = server;
	}

	public String getApikey() {
		return apikey;
	}

	public void setApikey(String apikey) {
		this.apikey = apikey;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

}
Global site tag (gtag.js) - Google Analytics