JDBC數據庫通用DAO

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);

相關文章
相關標籤/搜索