1.數據庫鏈接池 css
package org.dave.common.database;java
import java.sql.Connection;css3
import java.sql.SQLException;sql
import java.util.ResourceBundle;數據庫
import org.slf4j.Logger;css3動畫
import org.slf4j.LoggerFactory;ide
import com.jolbox.bonecp.BoneCP;工具
import com.jolbox.bonecp.BoneCPConfig;動畫
* 數據庫鏈接池ui
* @author David Day
public final class DatabaseConnectionPool {
private static final Logger LOG = LoggerFactory.getLogger(DatabaseConnectionPool.class);
private static final ResourceBundle BUNDLE = ResourceBundle.getBundle("connection");
private static final String DRIVER = "driver";
private static final String URL = "url";
private static final String USERNAME = "username";
private static final String PASSWORD = "password";
private static final String MAX_CONNECTION = "max_connection";
private static BoneCP pool;
* 開啓鏈接池
public static void startup() {
try {
Class.forName(BUNDLE.getString(DRIVER));
BoneCPConfig config = new BoneCPConfig();
config.setJdbcUrl(BUNDLE.getString(URL));
config.setUsername(BUNDLE.getString(USERNAME));
config.setPassword(BUNDLE.getString(PASSWORD));
config.setMaxConnectionsPerPartition(Integer.parseInt(BUNDLE.getString(MAX_CONNECTION)));
pool = new BoneCP(config);
} catch (Exception e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DatabaseException(e);
* 關閉鏈接池
public static void shutdown() {
pool.shutdown();
* @return 數據庫鏈接
public static Connection getConnection() {
try {
return pool.getConnection();
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DatabaseException(e);
2.數據庫異常
package org.dave.common.database;
* 數據庫異常
* @author David Day
@SuppressWarnings("serial")
public class DatabaseException extends RuntimeException {
public DatabaseException(Throwable cause) {
super(cause);
3.事務控制
package org.dave.common.database;
import java.sql.Connection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
* 數據庫事務
* @author David Day
public class DatabaseTransaction {
* 日誌工具
*/
private static final Logger LOG = LoggerFactory.getLogger(DatabaseTransaction.class);
* 數據庫鏈接
private Connection conn;
* 實例化一個默認鏈接的事務
public DatabaseTransaction() {
this(DatabaseConnectionPool.getConnection());
* 實例化一個默認鏈接的事務
* @param isOpenTrans 是否打開事務
*/
public DatabaseTransaction(boolean isOpenTrans) throws DatabaseException {
this(DatabaseConnectionPool.getConnection(), isOpenTrans);
* 實例化一個默認鏈接的事務
* @param conn 數據庫鏈接
*/
public DatabaseTransaction(Connection conn) {
this.conn = conn;
* 實例化一個默認鏈接的事務
* @param conn 數據庫鏈接
* @param isOpenTrans 是否打開事務
*/
public DatabaseTransaction(Connection conn, boolean isOpenTrans) throws DatabaseException {
this.conn = conn;
setAutoCommit(!isOpenTrans);
* @return 數據庫鏈接
*/
public Connection getConnection() {
return conn;
* 設置是否自動提交
* @param autoCommit 自動提交
* @throws DatabaseException
*/
private void setAutoCommit(boolean autoCommit) throws DatabaseException {
try {
conn.setAutoCommit(autoCommit);
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DatabaseException(e);
* 開始事務
* @throws DatabaseException
*/
public void begin() throws DatabaseException {
setAutoCommit(false);
* @return 是否打開事務
* @throws DatabaseException
*/
public boolean isBegin() throws DatabaseException {
try {
return !conn.getAutoCommit();
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DatabaseException(e);
/**
* 提交
* @throws DatabaseException
*/
public void commit() throws DatabaseException {
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DatabaseException(e);
* 回滾
* @throws DatabaseException
*/
public void rollback() throws DatabaseException {
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DatabaseException(e)
* 關閉鏈接
* @throws DatabaseException
*/
public void close() throws DatabaseException {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DatabaseException(e);
* @return 鏈接是否關閉
* @throws DatabaseException
*/http://www.huiyi8.com/css3/css3動畫
public boolean isClose() throws DatabaseException {
try {
return conn.isClosed();
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DatabaseException(e);
4.通用數據模型
package org.dave.common.database;
import java.io.Serializable;
@SuppressWarnings("serial")
public abstract class DataModel implements Serializable { }
5.結果轉換器
package org.dave.common.database.convert;
import java.sql.ResultSet;
import java.sql.SQLException;
* 結果映射器
* @author David Day
public interface ResultConverter<T> {
* 映射
* @param rs 結果集
* @return 映射結果
* @throws SQLException
*/
public T convert(ResultSet rs) throws SQLException ;
6.通用dao
package org.dave.common.database.access;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.dave.common.database.convert.ResultConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
* 數據存取類
* @author David Day
*/
public abstract class DataAccess {
* 日誌工具
*/
private static final Logger LOG = LoggerFactory.getLogger(DataAccess.class);
* 數據庫鏈接
private Connection conn;
* @param conn 數據庫鏈接
protected DataAccess(Connection conn) {
this.conn = conn;
* 插入數據
* @param sql
* @param generatedKeysConverter 主鍵映射
* @param params
* @return 主鍵
* @throws DataAccessException
*/
protected <T> T insert(String sql, ResultConverter<T> generatedKeysConverter, Object... params) throws DataAccessException {
try {
PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
setParameters(pstmt, params);
executeUpdate(pstmt);
ResultSet rs = pstmt.getGeneratedKeys();
nextResult(rs);
return convertResult(rs, generatedKeysConverter);
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DataAccessException(e);
* 更新數據
* @param sql
* @param params
* @return 影響行數
* @throws DataAccessException
*/
protected int update(String sql, Object... params) throws DataAccessException {
return executeUpdate(getPreparedStatement(sql, params));
* 查詢單個結果
* @param <T>
* @param sql
* @param converter
* @param params
* @return
protected <T> T queryForObject(String sql, ResultConverter<T> converter, Object... params) {
ResultSet rs = executeQuery(sql, params);
if (nextResult(rs)) {
return convertResult(rs, converter);
} else {
return null;
* 查詢結果列表
* @param <T>
* @param sql
* @param converter
* @param params
* @return
protected <T> List<T> queryForList(String sql, ResultConverter<T> converter, Object... params) {
ResultSet rs = executeQuery(sql, params);
List<T> list = new ArrayList<T>();
while (nextResult(rs)) {
list.add(convertResult(rs, converter));
return list;
* @param sql SQL語句
* @return 預編譯聲明
private PreparedStatement getPreparedStatement(String sql, Object... params) throws DataAccessException {
PreparedStatement pstmt = getPreparedStatement(sql);
setParameters(pstmt, params);
return pstmt;
* @param sql SQL語句
* @return 預編譯聲明
*/
private PreparedStatement getPreparedStatement(String sql) throws DataAccessException {
try {
return conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DataAccessException(e);
* 爲預編譯聲明傳入參數
* @param pstmt 預編譯聲明
* @param params 參數
* @throws DataAccessException
private void setParameters(PreparedStatement pstmt, Object... params) throws DataAccessException {
try {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DataAccessException(e);
* 執行更新操做
* @param pstmt
* @return 影響行數
* @throws DataAccessException
private int executeUpdate(PreparedStatement pstmt) throws DataAccessException {
try {
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DataAccessException(e);
* 執行查詢操做
* @param pstmt 預編譯聲明
* @return 結果集
* @throws DataAccessException
private ResultSet executeQuery(PreparedStatement pstmt) throws DataAccessException {
try {
return pstmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DataAccessException(e);
* 執行查詢操做
* @param sql SQL語句
* @param params 參數
* @return 結果集
* @throws DataAccessException
private ResultSet executeQuery(String sql, Object... params) throws DataAccessException {
return executeQuery(getPreparedStatement(sql, params));
* 移動到下一行記錄
* @param rs 結果集
* @return 是否有下一行記錄
* @throws DataAccessException
*/
private boolean nextResult(ResultSet rs) throws DataAccessException {
try {
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DataAccessException(e);
* 映射
* @param rs 結果集
* @return 映射結果
* @throws DataAccessException
*/
private <T> T convertResult(ResultSet rs, ResultConverter<T> converter) throws DataAccessException {
try {
return converter.convert(rs);
} catch (SQLException e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
throw new DataAccessException(e);
7.數據庫存取異常
package org.dave.common.database.access;
* 數據庫存取異常
* @author David Day
@SuppressWarnings("serial")
public class DataAccessException extends RuntimeException {
public DataAccessException(Throwable cause) {
super(cause);