`

commons-dbutils Helper

 
阅读更多
封装下dbutils, 使用这个help去操作数据库会非常的方便,下面还提供了例子.

package com.kneel.core.help;

import java.io.IOException;

/**
 * just wrap DbUtils QueryRunner, provider simple functions to use.
 * 
 * give chance to add action and do operator
 * 
 * query: resolve all query problem. insert: get secuqnce to insert update:
 * execute update with params. delete: execute delete with params batch: batch
 * update and delete with params.
 * 
 * NOTE: batch operator, please cause of batchSize, this will be set how many
 * counts we commit, and do next batch.
 * 
 * NOTE: below have expand of Connection PARAMS, if call please add.
 * 
 * NOTE: if query large Datas, please set FecthSize, this will be improve
 * performance.
 * 
 * we often use Bean to setter/getter, with columnToPropertyOverrides,we use
 * this to process column name not same as property. or we can do below SELECT
 * event_id id, event_date date,title from events. this will be re-name column
 * lable name.(care of key of Database)
 * 
 * queryBean: query one row to Bean queryBeanList: query multiple rows to
 * List<Bean> queryBeanMap: query multiple rows to Map<String,Bean>
 * 
 * Query List application
 * 
 * queryColumn: query one column value queryColumnSqlKey: query one column value
 * with sql key queryMap: query one row to Map<String,Object> queryKeyMap: query
 * multiple rows to Map<Object,Map<String,Object>> queryListMap: query multiple
 * rows to List<Map<String,Object>> queryArray: query one row to Object[]
 * queryArrayList: query multiple rows to List<Object[]>
 * 
 * 
 * 
 * Example one: easy to queryBean.
 * 
 * String sql = "SELECT * FROM EVENTS WHERE EVENT_ID = ?"; Object[] params = new
 * Object[] { 130L }; Event event = helper.queryBean(sql, Event.class, params);
 * //Event event = helper.queryBean(sql, Event.class,130L);
 * 
 * Example two: Column not match property
 * 
 * Map<String, String> columnToPropertyOverrides = new HashMap<String,String>();
 * columnToPropertyOverrides.put("EVENT_ID", "id");
 * columnToPropertyOverrides.put("EVENT_DATE", "date"); String sql =
 * "SELECT * FROM EVENTS WHERE EVENT_ID = ?"; Object[] params = new Object[] {
 * 130L }; Event event = helper.queryBean(sql,
 * Event.class,columnToPropertyOverrides, params);
 * 
 * Example three: easy to insert
 * 
 * String sql = "INSERT into events(event_id,event_date,title) VALUES(?,?,?)";
 * Object[] params = new Object[] { event.getDate(),event.getTitle() }; Long id
 * = helper.insert(sql, "events_sequnce", params);
 * 
 * Example four: easy to query one column String sql =
 * "SELECT count(*) eventCount  FROM events"; Object count =
 * helper.queryColumn(sql, "eventCount");
 * 
 * Example five: easy to get one column multiple rows List<ID>
 * 
 * String sql = "SELECT event_id  FROM events"; List<Object> count =
 * helper.queryColumnList(sql, "event_id");
 * 
 * Example six: easy to do it in batch
 * 
 * String sql =
 * "UPDATE events SET event_date = ?, title = ? WHERE event_id = ?"; Object[][]
 * params = new Object[events.size()][]; for(int i=0 i< events.size();i++){
 * Event event = events.get(i); params[i] = new Object[] {
 * event.getDate(),event.getTitle(),event.getId()}; } int[] effectrows =
 * helper.batch(sql, params);
 * 
 * Example seven: easy to do insert batch, return all ids.
 * 
 * String sql = "INSERT into events(event_id,event_date,title) VALUES(?,?,?)";
 * Object[][] params = new Object[events.size()][]; for(int i=0 i<
 * events.size();i++){ Event event = events.get(i); params[i] = new Object[] {
 * event.getDate(),event.getTitle()}; } Long[] ids =
 * helper.insertBatch(sql,"events_sequnce" ,params);
 * 
 * @author e557400
 * 
 */
public class DatabaseHelper {

	private static final Log log = LogFactory.getLog(DatabaseHelper.class);
	private static final String DEFAULT_DS_KEY = "DEFAULT";
 
	private DataSource dataSource = null;
	private static Map<String,DataSource> cachds = new ConcurrentHashMap<String,DataSource>(); 
	private QueryRunner queryRunner = null;
	private Map<String, String> sqlKeys = new HashMap<String, String>();

	public DatabaseHelper() {
		this(null, null);
	}

	public DatabaseHelper(String path) {
		this(null, path);
	}

	public DatabaseHelper(DataSource dataSource) {
		this(dataSource, null);
	}

	public DatabaseHelper(DataSource dataSource, String path) {
		this(dataSource,path,0);
	}
	
	public DatabaseHelper(DataSource dataSource, String path, final int fecthSize) { 
		if (dataSource == null) {
			dataSource = initDataSource();
		} 
		String dskey = dataSource.toString()+fecthSize; 
		DataSource ds = cachds.get(dskey);
		if(ds == null){
			this.dataSource = dataSource;
			queryRunner = new QueryRunner(dataSource){
				protected PreparedStatement prepareStatement(Connection conn, String sql)
			            throws SQLException {
					PreparedStatement stmt = conn.prepareStatement(sql);
					if(fecthSize>0){
						stmt.setFetchSize(fecthSize);
					}
			        return stmt;
			    }
			};
			cachds.put(dskey, dataSource);
		} 
		
		if (path != null) {
			sqlKeys = loadQueries(path);
		}
	}

	/**
	 * Executes the given SELECT SQL without any replacement parameters. The
	 * <code>Connection</code> is retrieved from the <code>DataSource</code> set
	 * in the constructor.
	 * 
	 * @param <T>
	 *            The type of object that the handler returns
	 * @param sql
	 *            The SQL statement to execute.
	 * @param rsh
	 *            The handler used to create the result object from the
	 *            <code>ResultSet</code>.
	 * 
	 * @return An object generated by the handler.
	 * @throws SQLException
	 *             if a database access error occurs
	 */
	public <T> T query(String sql, ResultSetHandler<T> rsh) throws SQLException {
		return queryRunner.query(sql, rsh);
	}

	/**
	 * Executes the given SELECT SQL query and returns a result object. The
	 * <code>Connection</code> is retrieved from the <code>DataSource</code> set
	 * in the constructor.
	 * 
	 * @param <T>
	 *            The type of object that the handler returns
	 * @param sql
	 *            The SQL statement to execute.
	 * @param rsh
	 *            The handler used to create the result object from the
	 *            <code>ResultSet</code>.
	 * @param params
	 *            Initialize the PreparedStatement's IN parameters with this
	 *            array.
	 * @return An object generated by the handler.
	 * @throws SQLException
	 *             if a database access error occurs
	 */
	public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
			throws SQLException {
		return queryRunner.query(sql, rsh, params);
	}

	/**
	 * Execute an SQL SELECT query without any replacement parameters. The
	 * caller is responsible for closing the connection.
	 * 
	 * @param <T>
	 *            The type of object that the handler returns
	 * @param conn
	 *            The connection to execute the query in.
	 * @param sql
	 *            The query to execute.
	 * @param rsh
	 *            The handler that converts the results into an object.
	 * @return The object returned by the handler.
	 * @throws SQLException
	 *             if a database access error occurs
	 */
	public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh)
			throws SQLException {
		return queryRunner.query(conn, sql, rsh);
	}

	/**
	 * Execute an SQL SELECT query with replacement parameters. The caller is
	 * responsible for closing the connection.
	 * 
	 * @param <T>
	 *            The type of object that the handler returns
	 * @param conn
	 *            The connection to execute the query in.
	 * @param sql
	 *            The query to execute.
	 * @param rsh
	 *            The handler that converts the results into an object.
	 * @param params
	 *            The replacement parameters.
	 * @return The object returned by the handler.
	 * @throws SQLException
	 *             if a database access error occurs
	 */
	public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh,
			Object... params) throws SQLException {
		return queryRunner.query(conn, sql, rsh, params);
	}

	/**
	 * Executes the given INSERT, UPDATE, or DELETE SQL statement without any
	 * replacement parameters. The <code>Connection</code> is retrieved from the
	 * <code>DataSource</code> set in the constructor. This
	 * <code>Connection</code> must be in auto-commit mode or the update will
	 * not be saved.
	 * 
	 * @param sql
	 *            The SQL statement to execute.
	 * @throws SQLException
	 *             if a database access error occurs
	 * @return The number of rows updated.
	 */
	public int update(String sql) throws SQLException {
		return queryRunner.update(sql);
	}

	/**
	 * Executes the given INSERT, UPDATE, or DELETE SQL statement. The
	 * <code>Connection</code> is retrieved from the <code>DataSource</code> set
	 * in the constructor. This <code>Connection</code> must be in auto-commit
	 * mode or the update will not be saved.
	 * 
	 * @param sql
	 *            The SQL statement to execute.
	 * @param params
	 *            Initializes the PreparedStatement's IN (i.e. '?') parameters.
	 * @throws SQLException
	 *             if a database access error occurs
	 * @return The number of rows updated.
	 */
	public int update(String sql, Object... params) throws SQLException {
		return queryRunner.update(sql, params);
	}

	/**
	 * Execute an SQL INSERT, UPDATE, or DELETE query without replacement
	 * parameters.
	 * 
	 * @param conn
	 *            The connection to use to run the query.
	 * @param sql
	 *            The SQL to execute.
	 * @return The number of rows updated.
	 * @throws SQLException
	 *             if a database access error occurs
	 */
	public int update(Connection conn, String sql) throws SQLException {
		return queryRunner.update(conn, sql);
	}

	/**
	 * Execute an SQL INSERT, UPDATE, or DELETE query.
	 * 
	 * @param conn
	 *            The connection to use to run the query.
	 * @param sql
	 *            The SQL to execute.
	 * @param params
	 *            The query replacement parameters.
	 * @return The number of rows updated.
	 * @throws SQLException
	 *             if a database access error occurs
	 */
	public int update(Connection conn, String sql, Object... params)
			throws SQLException {
		return queryRunner.update(conn, sql, params);
	}

	/**
	 * Execute a batch of SQL INSERT, UPDATE, or DELETE queries. The
	 * <code>Connection</code> is retrieved from the <code>DataSource</code> set
	 * in the constructor. This <code>Connection</code> must be in auto-commit
	 * mode or the update will not be saved.
	 * 
	 * @param sql
	 *            The SQL to execute.
	 * @param params
	 *            An array of query replacement parameters. Each row in this
	 *            array is one set of batch replacement values.
	 * @return The number of rows updated per statement.
	 * @throws SQLException
	 *             if a database access error occurs
	 * @since DbUtils 1.1
	 */
	public int[] batch(String sql, Object[][] params) throws SQLException {
		return queryRunner.batch(sql, params);
	}

	/**
	 * Execute a batch of SQL INSERT, UPDATE, or DELETE queries.
	 * 
	 * @param conn
	 *            The Connection to use to run the query. The caller is
	 *            responsible for closing this Connection.
	 * @param sql
	 *            The SQL to execute.
	 * @param params
	 *            An array of query replacement parameters. Each row in this
	 *            array is one set of batch replacement values.
	 * @return The number of rows updated per statement.
	 * @throws SQLException
	 *             if a database access error occurs
	 * @since DbUtils 1.1
	 */
	public int[] batch(Connection conn, String sql, Object[][] params)
			throws SQLException {
		return queryRunner.batch(conn, sql, params);
	}

	/**
	 * Execute a batch of SQL INSERT, UPDATE, or DELETE queries, use batchSize to execute.
	 * 
	 * @param sql
	 *            The SQL to execute.
	 * @param params
	 *            An array of query replacement parameters. Each row in this
	 *            array is one set of batch replacement values.
	 * @param batchSize
	 *            how many rows we should execute once
	 * @return The number of rows updated per statement.
	 * @throws SQLException
	 *             if a database access error occurs
	 */
	public int[] batch(String sql, Object[][] params, int batchSize)
			throws SQLException {
		Connection conn = dataSource.getConnection();
		int[] effects = new int[params.length];
		if (supportsBatchUpdates(conn)) {
			int n = 0;
			int batchIndex = 0;
			Object[][] batch = new Object[batchSize][];
			for (Object[] paramsc : params) {
				batch[n++ % batchSize] = paramsc;
				if (n % batchSize == 0 || n == params.length) {
					int batchIdx = (n % batchSize == 0) ? n / batchSize
							: (n / batchSize) + 1;
					int items = n
							- ((n % batchSize == 0) ? n / batchSize - 1
									: (n / batchSize)) * batchSize;
					log.debug("Sending SQL batch update #" + batchIdx
							+ " with " + items + " items");
					if (n % batchSize != 0) {// batch is less then batchSize.
						batch = Arrays.copyOf(batch, n % batchSize);
					}
					int[] effectbatchs = batch(conn, sql, batch);
					for (int effectbatch : effectbatchs) {
						effects[batchIndex++] = effectbatch;
					}
					// after process, clear
					batch = new Object[batchSize][];
				}

			}
		} else {
			int index = 0;
			for (Object[] paramsc : params) {
				effects[index++] = update(conn, sql, paramsc);
			}
		}
		conn.close();
		return effects;
	}

	/**
	 * Execute a batch of SQL INSERT, UPDATE, or DELETE queries, use batchSize to execute.
	 * 
	 * @param conn
	 *            The Connection to use to run the query. The caller is
	 *            responsible for closing this Connection.
	 * @param sql
	 *            The SQL to execute.
	 * @param params
	 *            An array of query replacement parameters. Each row in this
	 *            array is one set of batch replacement values.
	 * @param batchSize
	 *            how many rows we should execute once
	 * @return The number of rows updated per statement.
	 * @throws SQLException
	 *             if a database access error occurs
	 */
	public int[] batch(Connection conn, String sql, Object[][] params,
			int batchSize) throws SQLException {
		if (supportsBatchUpdates(conn)) {
			int n = 0;
			Object[][] batch = new Object[batchSize][];
			int[] effects = new int[params.length];
			for (Object[] paramsc : params) {
				batch[n++ % batchSize] = paramsc;
				if (n % batchSize == 0 || n == params.length) {
					int batchIdx = (n % batchSize == 0) ? n / batchSize
							: (n / batchSize) + 1;
					int items = n
							- ((n % batchSize == 0) ? n / batchSize - 1
									: (n / batchSize)) * batchSize;
					log.debug("Sending SQL batch update #" + batchIdx
							+ " with " + items + " items");
					int[] effectbatchs = batch(conn, sql, batch);
					for (int effectbatch : effectbatchs) {
						effects[batchIdx * batchSize + n] = effectbatch;
					}
				}
			}
			return effects;
		} else {
			int[] effects = new int[params.length];
			int index = 0;
			for (Object[] paramsc : params) {
				effects[index++] = update(conn, sql, paramsc);
			}
			return effects;
		}
	}

	/**
	 * Oracle insert, give sequnceName to insert.
	 *    1.  to get next SequnceId, then we all use it as Long.
	 *    2.  add this sequnceId to params[0], add all others to index++.
	 *    3.  Execute an SQL INSERT, and return effect row.
	 *    4.  if effect row is not 0, then success, or exception.
	 *  
	 * @param sql
	 * @param sequnceName
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public Long insert(String sql, String sequnceName, Object... params)
			throws SQLException {
		Connection conn = dataSource.getConnection();
		Long id = insert(conn, sql, sequnceName, params);
		conn.close();
		return id;
	}
	
	/**
	 * Oracle insert, give sequnceName to insert.
	 *    1.  to get next SequnceId, then we all use it as Long.
	 *    2.  add this sequnceId to params[0], add all others to index++.
	 *    3.  Execute an SQL INSERT, and return effect row.
	 *    4.  if effect row is not 0, then success, or exception.
	 * 
	 * @param conn
	 * @param sql
	 * @param sequnceName
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public Long insert(Connection conn, String sql, String sequnceName,
			Object... params) throws SQLException {
		// get sequnce id
		Long sequnceId = null;
		String sequnceSql = getSequnceSql(sequnceName);
		ScalarHandler<Object> rsh = new ScalarHandler<Object>();
		Object keyId = query(conn, sequnceSql, rsh);
		if (Number.class.isAssignableFrom(keyId.getClass())) {
			sequnceId = Long.valueOf(((Number) keyId).longValue());
		}

		// add params to first of the params
		Object[] paramsCopy = new Object[params.length + 1];
		paramsCopy[0] = sequnceId;
		int index = 1;
		for (Object param : params) {
			paramsCopy[index++] = param;
		}

		int effect = update(conn, sql, paramsCopy);
		if (effect != 0) {// insert success
			return sequnceId;
		} else {
			throw new SQLException("Insert fail, please check params[" + sql
					+ "," + sequnceName + "," + params + "]");
		}
	}

	/**
	 * Oracle insert Batch, give sequnceName to insert.(Batch)
	 *    1.  to get next SequnceId, then we all use it as Long.
	 *    2.  add this sequnceId to params[0], add all others to index++.
	 *    3.  Execute an SQL INSERT, and return effect row.
	 *    4.  if effect row is not 0, then success, or exception.
	 * 
	 * @param conn
	 * @param sql
	 * @param sequnceName
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public Long[] insertBatch(String sql, String sequnceName, Object params[][])
			throws SQLException {
		Connection conn = dataSource.getConnection();
		Long[] id = insertBatch(conn, sql, sequnceName, params);
		conn.close();
		return id;
	}
	
	

	/**
	 * Oracle insert Batch, give sequnceName to insert.(Batch)
	 * 
	 * @param conn
	 * @param sql
	 * @param sequnceName
	 * @param paramAlls
	 * @return
	 * @throws SQLException
	 */
	public Long[] insertBatch(Connection conn, String sql, String sequnceName,
			Object[][] paramAlls) throws SQLException {
		Object[][] parambatchs = new Object[paramAlls.length][];
		Long[] ids = new Long[paramAlls.length];
		for (int i = 0; i < paramAlls.length; i++) {
			Object[] paramAll = paramAlls[i];
			// get sequnce id
			Long id = null;
			String sequnceSql = getSequnceSql(sequnceName);
			ScalarHandler<Object> rsh = new ScalarHandler<Object>();
			Object keyId = query(conn, sequnceSql, rsh);
			if (Number.class.isAssignableFrom(keyId.getClass())) {
				id = Long.valueOf(((Number) keyId).longValue());
				ids[i] = id;
			}

			// add params to first of the params
			Object[] paramsCopy = new Object[paramAll.length + 1];
			paramsCopy[0] = id;
			int index = 1;
			for (Object param : paramAll) {
				paramsCopy[index++] = param;
			}
			parambatchs[i] = paramsCopy;
		}

		batch(conn, sql, parambatchs);

		return ids;
	}
	

	/**
	 * Oracle insert Batch, give sequnceName to insert.(Batch)
	 *    1.  to get next SequnceId, then we all use it as Long.
	 *    2.  add this sequnceId to params[0], add all others to index++.
	 *    3.  Execute an SQL INSERT, and return effect row.
	 *    4.  if effect row is not 0, then success, or exception.
	 * 
	 * @param conn
	 * @param sql
	 * @param sequnceName
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public Long[] insertBatch(String sql, String sequnceName, Object params[][],int batchSize) throws SQLException {
		Connection conn = dataSource.getConnection();
		Long[] id = insertBatch(conn, sql, sequnceName, params,batchSize);
		conn.close();
		return id;
	}
	
	/**
	 * Oracle insert Batch, give sequnceName to insert.(Batch)
	 * 
	 * @param conn
	 * @param sql
	 * @param sequnceName
	 * @param paramAlls
	 * @return
	 * @throws SQLException
	 */
	public Long[] insertBatch(Connection conn, String sql, String sequnceName,
			Object[][] paramAlls,int batchSize) throws SQLException {
		
		if (supportsBatchUpdates(conn)) {
			int n = 0;
			Object[][] batch = new Object[batchSize][];
			Long[] ids = new Long[paramAlls.length];
			int batchIndex = 0;
			for (Object[] paramsc : paramAlls) {
				batch[n++ % batchSize] = paramsc;
				if (n % batchSize == 0 || n == paramAlls.length) {
					int batchIdx = (n % batchSize == 0) ? n / batchSize
							: (n / batchSize) + 1;
					int items = n
							- ((n % batchSize == 0) ? n / batchSize - 1
									: (n / batchSize)) * batchSize;
					log.debug("Sending SQL batch insert #" + batchIdx
							+ " with " + items + " items");
					if (n % batchSize != 0) {// batch is less then batchSize.
						batch = Arrays.copyOf(batch, n % batchSize);
					}
					Long[] idsubs = insertBatch(conn, sql,sequnceName, batch);
					for (Long idsub : idsubs) {
						ids[batchIndex++] = idsub;
					}
					// after process, clear
					batch = new Object[batchSize][];
				}
			}
			return ids;
		} else {
			Long[] ids = new Long[paramAlls.length];
			int index = 0;
			for (Object[] paramsc : paramAlls) {
				ids[index++] = insert(conn, sql,sequnceName, paramsc);
			}
			return ids;
		}  
	}
 

	/**
	 * execute SQL, transform ResultSet to Class<T>[Bean]
	 * 
	 * @param sql
	 *            query SQL
	 * @param clazz
	 *            target Class
	 * @return
	 * @throws SQLException
	 */
	public <T> T queryBean(String sql, final Class<T> clazz)
			throws SQLException {
		return queryBean(sql, clazz, new HashMap<String, String>());
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[Bean]
	 * 
	 * @param columnToPropertyOverrides
	 *            column to property overrides
	 * @return
	 * @throws SQLException
	 */
	public <T> T queryBean(String sql, final Class<T> clazz, Object... params)
			throws SQLException {
		return queryBean(sql, clazz, new HashMap<String, String>(), params);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[Bean]
	 * 
	 * @param params
	 *            SQL PARAMS
	 * @param columnToPropertyOverrides
	 *            column to property overrides
	 * @return
	 * @throws SQLException
	 */
	public <T> T queryBean(String sql, final Class<T> clazz,
			final Map<String, String> columnToPropertyOverrides,
			Object... params) throws SQLException {
		ResultSetHandler<T> rsh = new ResultSetHandler<T>() {
			@Override
			public T handle(ResultSet rs) throws SQLException {
				BeanProcessor bp = new BeanProcessor(columnToPropertyOverrides);
				if (rs.next()) {
					return bp.toBean(rs, clazz);
				}
				return null;
			}
		};
		return query(sql, rsh, params);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[List<Bean>]
	 * 
	 * @param sql
	 *            query SQL
	 * @param clazz
	 *            target class
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> queryBeanList(String sql, final Class<T> clazz)
			throws SQLException {
		return queryBeanList(sql, clazz, new HashMap<String, String>(),
				(Object[]) null);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[List<Bean>]
	 * 
	 * @param params
	 *            SQL PARAMS
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> queryBeanList(String sql, final Class<T> clazz,
			Object... params) throws SQLException {
		return queryBeanList(sql, clazz, new HashMap<String, String>(), params);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[List<Bean>]
	 * 
	 * @param columnToPropertyOverrides
	 *            column to property overrides
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> queryBeanList(String sql, final Class<T> clazz,
			final Map<String, String> columnToPropertyOverrides,
			Object... params) throws SQLException {
		ResultSetHandler<List<T>> rsh = new ResultSetHandler<List<T>>() {
			@Override
			public List<T> handle(ResultSet rs) throws SQLException {
				BeanProcessor bp = new BeanProcessor(columnToPropertyOverrides);
				return bp.toBeanList(rs, clazz);
			}

		};
		return query(sql, rsh, params);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[Map<String,<Bean>>]
	 * 
	 * @param sql
	 * @param clazz
	 * @param columnName
	 * @return
	 * @throws SQLException
	 */
	public <T> Map<String, T> queryBeanMap(String sql, final Class<T> clazz,
			String columnName) throws SQLException {
		return queryBeanMap(sql, clazz, columnName,
				new HashMap<String, String>(), (Object[]) null);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[Map<String,<Bean>>]
	 * 
	 * @param sql
	 * @param clazz
	 * @param columnName
	 * @return
	 * @throws SQLException
	 */
	public <T> Map<String, T> queryBeanMap(String sql, final Class<T> clazz,
			String columnName, Object... params) throws SQLException {
		return queryBeanMap(sql, clazz, columnName,
				new HashMap<String, String>(), params);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[Map<String,<Bean>>]
	 * 
	 * @param sql
	 * @param clazz
	 * @param columnName
	 * @return
	 * @throws SQLException
	 */
	public <T> Map<String, T> queryBeanMap(String sql, final Class<T> clazz,
			final String columnName,
			final Map<String, String> columnToPropertyOverrides,
			Object... params) throws SQLException {
		ResultSetHandler<Map<String, T>> rsh = new ResultSetHandler<Map<String, T>>() {
			BeanProcessor bp = new BeanProcessor(columnToPropertyOverrides);

			@Override
			public Map<String, T> handle(ResultSet rs) throws SQLException {
				Map<String, T> result = new HashMap<String, T>();
				while (rs.next()) {
					result.put(createKey(rs), createRow(rs));
				}
				return result;
			}

			private String createKey(ResultSet rs) throws SQLException {
				return rs.getString(columnName);
			}

			private T createRow(ResultSet rs) throws SQLException {
				return bp.toBean(rs, clazz);
			}
		};
		return query(sql, rsh, params);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[Map<String,<Object>>]
	 * 
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public <T> Map<String, Object> queryMap(String sql) throws SQLException {
		MapHandler kh = new MapHandler();
		return query(sql, kh);
	}

	/**
	 * execute SQL, transform ResultSet to
	 * Class<T>[Map<Object,Map<String,<Object>>>]
	 * 
	 * @param sql
	 * @param column
	 * @return
	 * @throws SQLException
	 */
	public <T> Map<Object, Map<String, Object>> queryKeyMap(String sql,
			String column) throws SQLException {
		KeyedHandler<Object> kh = new KeyedHandler<Object>(column);
		return query(sql, kh);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[List<Map<String,Object>>]
	 * 
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public <T> List<Map<String, Object>> queryListMap(String sql)
			throws SQLException {
		MapListHandler kh = new MapListHandler();
		return query(sql, kh);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[Object[]]
	 * 
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public <T> Object[] queryArray(String sql) throws SQLException {
		ArrayHandler kh = new ArrayHandler();
		return query(sql, kh);
	}

	/**
	 * execute SQL, transform ResultSet to Class<T>[List<Object[]>]
	 * 
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public <T> List<Object[]> queryArrayList(String sql) throws SQLException {
		ArrayListHandler kh = new ArrayListHandler();
		return query(sql, kh);
	}

	/**
	 * query column name, return column values
	 * 
	 * @param sql
	 *            query SQL
	 * @param columnName
	 *            column name
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> queryColumnList(String sql, String columnName)
			throws SQLException {
		return queryColumnList(sql, columnName, (Object[]) null);
	}

	/**
	 * query column name, return column values
	 * 
	 * @param params
	 *            SQL PARAMS
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> queryColumnList(String sql, String columnName,
			Object... params) throws SQLException {
		ColumnListHandler<T> clh = new ColumnListHandler<T>(columnName);
		return query(sql, clh, params);
	}

	/**
	 * query object, (T)rs.getObject(1), return column value
	 * 
	 * 
	 * @param sql
	 * @param clazz
	 * @return
	 * @throws SQLException
	 */
	public <T> T queryForObject(String sql, Class<T> clazz) throws SQLException {
		return queryForObject(sql, clazz, (Object[]) null);
	}

	/**
	 * query object, (T)rs.getObject(1), return column value
	 * 
	 * 
	 * @param sql
	 * @param clazz
	 * @return
	 * @throws SQLException
	 */
	public <T> T queryForObject(String sql, final Class<T> clazz,
			Object... params) throws SQLException {
		ScalarHandler<T> kh = new ScalarHandler<T>() {
			@SuppressWarnings("unchecked")
			public T handle(ResultSet rs) throws SQLException {
				T target = null;
				Object resultObject = null;
				if (rs.next()) {
					resultObject = rs.getObject(1);
				}
				if (resultObject != null
						&& Number.class.isAssignableFrom(resultObject
								.getClass())) {
					if (BigDecimal.class.isInstance(resultObject)) {
						BigDecimal bd = (BigDecimal) resultObject;
						if (Integer.class.isAssignableFrom(clazz)) {
							target = (T) Integer.valueOf(bd.intValue());
						} else if (Long.class.isAssignableFrom(clazz)) {
							target = (T) Long.valueOf(bd.longValue());
						} else if (Float.class.isAssignableFrom(clazz)) {
							target = (T) Float.valueOf(bd.floatValue());
						} else if (Double.class.isAssignableFrom(clazz)) {
							target = (T) Double.valueOf(bd.doubleValue());
						}
					}
				} else {
					target = (T) resultObject;
				}
				return target;
			}
		};
		return query(sql, kh, params);
	}

	/**
	 * query column name, return column value
	 * 
	 * @param sql
	 *            query SQL
	 * @param columnName
	 *            column name
	 * @return column value
	 * @throws SQLException
	 */
	public <T> T queryColumn(String sql, String columnName) throws SQLException {
		return queryColumn(sql, columnName, (Object[]) null);
	}

	/**
	 * query column name, return column value
	 * 
	 * @param sql
	 *            query SQL
	 * @param columnName
	 *            column name
	 * @return column value
	 * @throws SQLException
	 */
	public <T> T queryColumn(String sql, String columnName, Object... params)
			throws SQLException {
		ScalarHandler<T> kh = new ScalarHandler<T>(columnName);
		return query(sql, kh, params);
	}

	/**
	 * Return whether the given JDBC driver supports JDBC 2.0 batch updates.
	 * <p>
	 * Typically invoked right before execution of a given set of statements: to
	 * decide whether the set of SQL statements should be executed through the
	 * JDBC 2.0 batch mechanism or simply in a traditional one-by-one fashion.
	 * <p>
	 * Logs a warning if the "supportsBatchUpdates" methods throws an exception
	 * and simply returns {@code false} in that case.
	 * 
	 * @param con
	 *            the Connection to check
	 * @return whether JDBC 2.0 batch updates are supported
	 * @see java.sql.DatabaseMetaData#supportsBatchUpdates()
	 */
	private static boolean supportsBatchUpdates(Connection con) {
		try {
			DatabaseMetaData dbmd = con.getMetaData();
			if (dbmd != null) {
				if (dbmd.supportsBatchUpdates()) {
					log.debug("JDBC driver supports batch updates");
					return true;
				} else {
					log.debug("JDBC driver does not support batch updates");
				}
			}
		} catch (SQLException ex) {
			log.debug(
					"JDBC driver 'supportsBatchUpdates' method threw exception",
					ex);
		} catch (AbstractMethodError err) {
			log.debug(
					"JDBC driver does not support JDBC 2.0 'supportsBatchUpdates' method",
					err);
		}
		return false;
	}

	/**
	 * get SQL with sqlKey
	 * 
	 * NOTE: you must be give path in construct
	 * 
	 * @param sqlkey
	 * @return
	 * @throws SQLException
	 */
	public String getSql(String sqlkey) throws SQLException {
		String sql = sqlKeys.get(sqlkey);
		return sql;
	}
	
	/**
	 * via sequnceName to generator SQL
	 * 
	 * @param sequnceName
	 * @return
	 */
	private String getSequnceSql(String sequnceName){
		String sequnceSql = "select " + sequnceName
				+ ".nextval  from dual";
		return sequnceSql;
	}

	/**
	 * load queries from path
	 * 
	 * @param path
	 * @return
	 */
	public Map<String, String> loadQueries(String path) {
		QueryLoader ql = QueryLoader.instance();
		Map<String, String> queries = new HashMap<String, String>();
		try {
			queries = ql.load(path);
		} catch (IOException e) {
			throw new RuntimeException("Load Queries  fail, [" + path + "]");
		}
		return queries;
	}
} 



package com.kneel.core.help;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import junit.framework.TestCase;

import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class DatabaseHelperTest extends TestCase{
	private static final Log log = LogFactory.getLog(DatabaseHelperTest.class);
	 
	 public void testSinglton(){ 
		 Thread t1 =  new Thread(new Runnable(){ 
			@Override
			public void run() { 
				DatabaseHelper helper1 = new DatabaseHelper();
			}
			  
		  }); 
		 
		 Thread t2 =  new Thread(new Runnable(){ 
			@Override
			public void run() { 
				DatabaseHelper	helper2 = new DatabaseHelper();
			}
				  
		});
		 t1.start();t2.start();
		 System.out.println("a");
	 }
	 
	 public void testQuerySqlRsh(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEventById");
			 Event event = helper.query(sql, new ResultSetHandler<Event>(){ 
				 public Event handle(ResultSet rs) throws SQLException{
					 if(rs.next()){
						 Event event = new Event();
						 event.setId(rs.getLong(1));
						 event.setDate(rs.getDate(2));
						 event.setTitle(rs.getString(3));
						 return event;
					 }
					 return null;
				 }
			 },Long.valueOf(140));
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testUpdateSql(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("updateEvent");
			 Object[] params = new Object[]{new java.sql.Date(new Date().getTime()),"updateEvent Title",Long.valueOf(140)};
			 int effect = helper.update(sql,params);
			 System.out.println(effect);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testBatch(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("updateEvent");
			 Object[][] params = new Object[][]{
					 new Object[]{new java.sql.Date(new Date().getTime()),"updateEvent Title",Long.valueOf(140)},
					 new Object[]{new java.sql.Date(new Date().getTime()),"updateEvent Title",Long.valueOf(165)}		 
			 };
			 int effect[] = helper.batch(sql,params);
			 System.out.println(Arrays.toString(effect));
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testBatchInBatchSize(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("updateEvent");
			 Object[][] params = new Object[][]{
					 new Object[]{new java.sql.Date(new Date().getTime()),"updateEvent Title",Long.valueOf(140)},
					 new Object[]{new java.sql.Date(new Date().getTime()),"updateEvent Title",Long.valueOf(165)},
					 new Object[]{new java.sql.Date(new Date().getTime()),"updateEvent Title",Long.valueOf(162)},
					 new Object[]{new java.sql.Date(new Date().getTime()),"updateEvent Title",Long.valueOf(163)},
					 new Object[]{new java.sql.Date(new Date().getTime()),"updateEvent Title",Long.valueOf(164)}
			 };
			 int effect[] = helper.batch(sql,params,2);
			 System.out.println(Arrays.toString(effect));
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testInsert(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("insertEvent");
			 String sequnceName = helper.getSql("eventsSequnce");
			 Object[] params = new Object[]{new java.sql.Date(new Date().getTime()),"insertEvent Title"};
			 Long id = helper.insert(sql,sequnceName,params);
			 System.out.println(id);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
 
	 public void testInsertBatch(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("insertEvent");
			 String sequnceName = helper.getSql("eventsSequnce");
			 Object[][] params = new Object[][]{
					 new Object[]{new java.sql.Date(new Date().getTime()),"insertEvent Title"},
					 new Object[]{new java.sql.Date(new Date().getTime()),"insertEvent Title"}		 
			 };
			 Long effect[] = helper.insertBatch(sql,sequnceName,params);
			 System.out.println(Arrays.toString(effect));
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testInsertInBatchSize(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("insertEvent");
			 String sequnceName = helper.getSql("eventsSequnce");
			 Object[][] params = new Object[][]{
					 new Object[]{new java.sql.Date(new Date().getTime()),"insertEvent Title"},
					 new Object[]{new java.sql.Date(new Date().getTime()),"insertEvent Title"},
					 new Object[]{new java.sql.Date(new Date().getTime()),"insertEvent Title"},
					 new Object[]{new java.sql.Date(new Date().getTime()),"insertEvent Title"},
					 new Object[]{new java.sql.Date(new Date().getTime()),"insertEvent Title"}
			 };
			 Long effect[] = helper.insertBatch(sql,sequnceName,params,2);
			 System.out.println(Arrays.toString(effect));
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testQueryBean(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEventById");
			 Event event = helper.queryBean(sql, Event.class,Long.valueOf(140)); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testQueryBeanByRenameLable(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEventById");
			 sql = "SELECT event_id id,event_date,title FROM events WHERE event_id = ?";
			 Event event = helper.queryBean(sql, Event.class,Long.valueOf(140)); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testQueryBeanByRenameMapping(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEventById");
			 Map<String,String> ctp = new HashMap<String,String>();
			 ctp.put("EVENT_ID", "id");
			 ctp.put("EVENT_DATE", "date");
			 Event event = helper.queryBean(sql, Event.class,ctp,Long.valueOf(140)); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testQueryBeanList(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEvents");
			 Map<String,String> ctp = new HashMap<String,String>();
			 ctp.put("EVENT_ID", "id");
			 ctp.put("EVENT_DATE", "date");
			 List<Event> event = helper.queryBeanList(sql, Event.class,ctp); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testBeanMap(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEvents");
			 Map<String,String> ctp = new HashMap<String,String>();
			 ctp.put("EVENT_ID", "id");
			 ctp.put("EVENT_DATE", "date");
			 Map<String,Event> event = helper.queryBeanMap(sql, Event.class,"EVENT_ID",ctp); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testQueryMap(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEvents"); 
			 Map<String,Object> event = helper.queryMap(sql); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testQueryKeyMap(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEvents"); 
			Map<Object,Map<String,Object>> event = helper.queryKeyMap(sql, "EVENT_ID"); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void testQueryListMap(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEvents"); 
			 List<Map<String,Object>> event = helper.queryListMap(sql); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void queryArray(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEvents"); 
			 Object[] event = helper.queryArray(sql); 
			 System.out.println(Arrays.toString(event));
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void queryArrayList(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEvents"); 
			 List<Object[]> event = helper.queryArrayList(sql); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void queryColumnList(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEvents"); 
			 List<Object> event = helper.queryColumnList(sql, "EVENT_ID"); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void queryForObject(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryCounts"); 
			 Long event = helper.queryForObject(sql,Long.class); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
	 
	 public void queryColumn(){
		 DatabaseHelper helper = new DatabaseHelper("/sql/Event.xml");
		 try {
			 String sql = helper.getSql("queryEvents"); 
			 Object event = helper.queryColumn(sql, "EVENT_ID"); 
			 System.out.println(event);
		} catch (SQLException e) {
			log.error("sql error", e);
		}
	 }
}

分享到:
评论

相关推荐

    apache-commons源码及jar文件

    DbUtils 是一个 JDBC helper 类库,完成数据库任务的简单的资源清除代码. Digester Commons-Digester 是一个 XML-Java对象的映射工具,用于解析 XML配置文件. Discovery Commons-Discovery 提供工具来定位资源 ...

    dbutils工具类

    在实际项目中,通常会结合Apache Commons DBCP或C3P0等连接池使用`dbutils`,以提高数据库连接的复用率,减少数据库资源的消耗。配置连接池后,`dbutils`可以从连接池获取连接,执行完操作后归还。 6. **文件`0000...

    FPGA电机控制方案解析:基于Verilog与Nios2的软硬协同设计

    内容概要:本文详细介绍了基于FPGA的电机控制系统设计方案,重点探讨了Verilog和Nios2软核的协同工作。系统通过将底层驱动(如编码器处理、坐标变换、SVPWM生成等)交给Verilog实现,确保实时性和高效性;同时,复杂的算法(如Park变换、故障保护等)则由Nios2处理。文中展示了多个具体实现细节,如四倍频计数、定点数处理、查表法加速、软硬件交互协议等。此外,还讨论了性能优化方法,如过调制处理、五段式PWM波形生成以及故障保护机制。 适合人群:具备一定FPGA和嵌入式系统基础知识的研发人员,尤其是从事电机控制领域的工程师。 使用场景及目标:适用于希望深入了解FPGA在电机控制中的应用,掌握软硬件协同设计方法,提高系统实时性和效率的技术人员。目标是通过学习本方案,能够独立设计并实现高效的电机控制系统。 其他说明:本文不仅提供了详细的代码片段和技术细节,还分享了许多实践经验,如调试技巧、常见错误及其解决办法等。这对于实际工程项目非常有帮助。

    模拟太阳系、轨道进动、时间延迟、光线偏折、黑洞阴影、星团以及航天器轨迹 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    计算机数控(CNC)装置.pdf

    计算机数控(CNC)装置.pdf

    西门子PLC与TiA博途实现冷热水恒压供水系统的变频器控制及多参数调控

    内容概要:本文详细介绍了使用西门子PLC和TiA博途软件构建冷热水恒压供水系统的具体方法和技术要点。主要内容涵盖变频器控制、模拟量输入输出处理、温度控制、流量计算控制及配方控制等方面。文中不仅提供了具体的编程实例,如LAD和SCL语言的应用,还分享了许多实用的经验和技巧,例如模拟量处理中的滤波方法、PID控制的优化策略、流量计算的高精度算法等。此外,针对实际应用中的常见问题,如信号干扰和参数整定,作者也给出了有效的解决方案。 适合人群:从事自动化控制系统开发的技术人员,尤其是对西门子PLC和TiA博途有一定了解并希望深入掌握冷热水恒压供水系统设计的专业人士。 使用场景及目标:适用于工业环境中需要精确控制水压、温度和流量的冷热水供应系统的设计与维护。主要目标是帮助工程师理解和实施基于西门子PLC和TiA博途的冷热水恒压供水系统,提高系统的稳定性和效率。 其他说明:文中提到的实际案例和编程代码片段对于初学者来说非常有价值,能够加速学习进程并提升实际操作能力。同时,关于硬件配置的选择建议也为项目规划提供了指导。

    基于PLC的自动蜂窝煤生产线五传送带控制系统设计与实现

    内容概要:本文详细介绍了基于PLC(可编程逻辑控制器)的自动蜂窝煤生产线中五条传送带的控制系统设计。主要内容涵盖IO分配、梯形图程序编写、接线图原理图绘制以及组态画面的设计。通过合理的IO分配,确保各个输入输出点正确连接;利用梯形图程序实现传送带的启动、停止及联动控制;接线图确保电气连接的安全性和可靠性;组态画面提供人机交互界面,便于操作员远程监控和操作。此外,还分享了一些实际调试中的经验和教训,如传感器安装位置、硬件接线注意事项等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程和工业自动化感兴趣的读者。 使用场景及目标:适用于需要设计和实施自动化生产线的企业和个人。目标是提高生产线的自动化程度,减少人工干预,提升生产效率和产品质量。 其他说明:文中提到的具体实例和代码片段有助于读者更好地理解和掌握相关技术和方法。同时,强调了硬件和软件相结合的重要性,提供了实用的调试技巧和经验总结。

    自动驾驶仿真中OpenScenario XML语法与场景构建详解

    内容概要:本文详细介绍了OpenScenario场景仿真的结构及其应用,特别是通过具体的XML代码片段解释了各个参数的作用和配置方法。文中提到的思维导图帮助理解复杂的参数关系,如Storyboard、Act、ManeuverGroup等层级结构,以及它们之间的相互作用。同时,文章提供了多个实用案例,如跟车急刹再加速、变道场景等,展示了如何利用这些参数创建逼真的驾驶场景。此外,还特别强调了一些常见的错误和解决方法,如条件触发器的误用、坐标系转换等问题。 适用人群:从事自动驾驶仿真研究的技术人员,尤其是对OpenScenario标准有一定了解并希望深入掌握其应用场景的人。 使用场景及目标:适用于需要精确控制交通参与者行为的自动驾驶仿真项目,旨在提高开发者对OpenScenario的理解和运用能力,减少开发过程中常见错误的发生。 其他说明:文章不仅提供了理论指导,还包括大量实践经验分享,如调试技巧、参数优化等,有助于快速解决问题并提升工作效率。

    基于Maxwell仿真的30kW自启动永磁同步电机6极72槽设计方案及性能优化

    内容概要:本文详细介绍了30kW、1000rpm、线电压380V的自启动永磁同步电机的6极72槽设计方案及其性能优化过程。首先,通过RMxprt进行快速建模,设定基本参数如电机类型、额定功率、速度、电压、极数和槽数等。接着,深入探讨了定子冲片材料选择、转子结构设计、绕组配置以及磁密波形分析等方面的技术细节。文中特别强调了双层绕组设计、短距跨距选择、磁密波形优化、反电势波形验证等关键技术手段的应用。此外,还讨论了启动转矩、效率曲线、温升控制等方面的优化措施。最终,通过一系列仿真和实测数据分析,展示了该设计方案在提高效率、降低谐波失真、优化启动性能等方面的显著成果。 适合人群:从事电机设计、电磁仿真、电力电子领域的工程师和技术人员。 使用场景及目标:适用于希望深入了解永磁同步电机设计原理及优化方法的专业人士,旨在为类似项目的开发提供参考和借鉴。 其他说明:文章不仅提供了详细的参数设置和代码示例,还分享了许多实践经验,如材料选择、仿真技巧、故障排除等,有助于读者更好地理解和应用相关技术。

    基于S7-1200 PLC和WinCC的燃油锅炉控制系统设计与实现

    内容概要:本文详细介绍了如何使用S7-1200 PLC和WinCC搭建一个完整的燃油锅炉自动控制系统。首先明确了系统的IO分配,包括数字量输入输出和模拟量输入输出的具体连接方式。接着深入讲解了梯形图编程的关键逻辑,如鼓风机和燃油泵的联锁控制、温度PID调节等。对于接线部分,强调了强电弱电线缆分离以及使用屏蔽线的重要性。WinCC组态方面,则着重于创建直观的操作界面和有效的报警管理。此外,还分享了一些调试技巧和常见问题的解决方案。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和SCADA系统有一定了解的人群。 使用场景及目标:适用于需要构建高效稳定的燃油锅炉控制系统的工业环境,旨在提高系统的可靠性和安全性,降低故障率并提升工作效率。 其他说明:文中提供了丰富的实践经验,包括具体的硬件选型、详细的程序代码片段以及实用的故障排查方法,有助于读者快速掌握相关技能并在实际工作中应用。

    电力电子领域中逆变器输出纹波电流预测与变开关频率PWM控制的Simulink仿真

    内容概要:本文详细探讨了逆变器输出纹波电流的来源及其对系统稳定性的影响,并提出了一种基于变开关频率PWM控制策略的解决方案。文中首先分析了纹波电流产生的原因,包括开关元件的导通关断、电感电流的非理想特性和电源电压波动。接着介绍了变开关频率PWM控制的基本原理,通过实时调整开关频率来优化纹波电流和开关损耗之间的平衡。随后,利用傅里叶变换建立了纹波电流预测模型,并通过Simulink仿真模型进行了验证。仿真结果显示,变开关频率控制能够显著减小纹波电流的幅值,提高系统的稳定性和效率。此外,文章还提供了具体的MATLAB/Simulink建模步骤以及一些优化建议,如提高开关频率上限、采用低纹波PWM算法和增加电感电流反馈。 适合人群:从事电力电子系统设计和优化的研究人员和技术人员,尤其是关注逆变器性能提升的专业人士。 使用场景及目标:适用于需要优化逆变器输出质量、提高系统稳定性和效率的应用场合。目标是通过变开关频率PWM控制策略,解决传统固定开关频率控制中存在的纹波电流大、效率低等问题。 其他说明:文章不仅提供了理论分析,还包括详细的仿真建模指导和优化建议,有助于读者更好地理解和应用相关技术。同时,文中提到的一些实用技巧和注意事项对于实际工程应用具有重要参考价值。

    数据结构领域中平衡树的原理及其应用解析

    内容概要:本文详细介绍了平衡树的基本概念、发展历程、不同类型(如AVL树、红黑树、2-3树)的特点和操作原理。文中解释了平衡树如何通过自平衡机制克服普通二叉搜索树在极端情况下的性能瓶颈,确保高效的数据存储和检索。此外,还探讨了平衡树在数据库索引和搜索引擎等实际应用中的重要作用,并对其优缺点进行了全面分析。 适合人群:计算机科学专业学生、软件工程师、算法爱好者等对数据结构有兴趣的人群。 使用场景及目标:帮助读者理解平衡树的工作原理,掌握不同类型平衡树的特点和操作方法,提高在实际项目中选择和应用适当数据结构的能力。 其他说明:本文不仅涵盖了理论知识,还包括具体的应用案例和技术细节,旨在为读者提供全面的学习资料。

    计算机三级网络技术 机试100题和答案.pdf

    计算机三级网络技术 机试100题和答案.pdf

    LabVIEW与YOLOv5结合:基于ONNX Runtime的多模型并行推理DLL封装及工业应用

    内容概要:本文详细介绍了将YOLOv5模型集成到LabVIEW环境中进行目标检测的方法。作者通过C++封装了一个基于ONNX Runtime的DLL,实现了YOLOv5模型的高效推理,并支持多模型并行处理。文中涵盖了从模型初始化、视频流处理、内存管理和模型热替换等多个方面的具体实现细节和技术要点。此外,还提供了性能测试数据以及实际应用场景的经验分享。 适合人群:熟悉LabVIEW编程,有一定C++基础,从事工业自动化或计算机视觉相关领域的工程师和技术人员。 使用场景及目标:适用于需要在LabVIEW环境下进行高效目标检测的应用场景,如工业质检、安防监控等。主要目标是提高目标检测的速度和准确性,降低开发难度,提升系统的灵活性和扩展性。 其他说明:文中提到的技术方案已在实际项目中得到验证,能够稳定运行于7x24小时的工作环境。GitHub上有完整的开源代码可供参考。

    逻辑回归ex2-logistic-regression-ex2data1

    逻辑回归ex2-logistic-regression-ex2data1

    MATLAB仿真单相高功率因数整流器:单周期控制与优化实践

    内容概要:本文详细介绍了使用MATLAB/Simulink搭建单相高功率因数整流器仿真的全过程。作者通过单周期控制(OCC)方法,使电感电流平均值跟随电压波形,从而提高功率因数。文中涵盖了控制算法的设计、主电路参数的选择、波形采集与分析以及常见问题的解决方案。特别是在控制算法方面,通过动态调整占空比,确保系统的稳定性,并通过实验验证了THD低于5%,功率因数达到0.98以上的优异性能。 适合人群:电力电子工程师、科研人员、高校师生等对高功率因数整流器仿真感兴趣的读者。 使用场景及目标:适用于研究和开发高效电源转换设备的技术人员,旨在通过仿真手段优化整流器性能,降低谐波失真,提高功率因数。 其他说明:文章提供了详细的代码片段和调试经验,帮助读者更好地理解和应用单周期控制技术。同时提醒读者注意仿真与实际硬件之间的差异,强调理论计算与实际调试相结合的重要性。

    计算机设备采购合同.pdf

    计算机设备采购合同.pdf

    计算机三级网络技术考试资料大全.pdf

    计算机三级网络技术考试资料大全.pdf

    基于Simulink的燃料电池系统建模与先进控制策略研究

    内容概要:本文详细介绍了如何在Simulink中构建质子交换膜燃料电池(PEMFC)和固体氧化物燃料电池(SOFC)的仿真模型及其控制策略。主要内容涵盖各子系统的建模方法,如气体流道、温度、电压、膜水合度等模块的具体实现细节;探讨了几种先进的控制算法,包括模糊PID、自抗扰控制(ADRC)、RBF神经网络PID以及它们的应用场景和优势;并通过具体案例展示了不同控制器在处理复杂工况时的表现差异。此外,文中还分享了一些实用技巧,如避免模型参数调校中的常见错误、提高仿真的稳定性和准确性。 适合人群:从事燃料电池研究与开发的专业人士,尤其是具有一定Matlab/Simulink基础的研究人员和技术工程师。 使用场景及目标:帮助读者掌握燃料电池系统建模的基本流程和技术要点,理解各种控制算法的特点及其应用场景,从而能够独立完成相关项目的开发与优化工作。 其他说明:文章提供了大量MATLAB代码片段作为实例支持,便于读者理解和实践。同时强调了理论联系实际的重要性,在介绍每种技术时均结合具体的实验数据进行分析讨论。

Global site tag (gtag.js) - Google Analytics