1. 程式人生 > >dbutils簡單封裝

dbutils簡單封裝

dbutils是一個為簡化JDBC操作的小類庫。

pom.xml配置

    <dependency>
        <groupId>commons-dbutils</groupId>
        <artifactId>commons-dbutils</artifactId>
        <version>1.6</version>
    </dependency>

BaseDAO:

public class BaseDAO<T> {
    protected
final Class<T> entityClass; @SuppressWarnings("unchecked") public BaseDAO() { super(); this.entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; } /** * 查詢單條記錄<br> * 獲取結果集第一行資料,並放入map集合返回<br> * * @param
sql * @param params * @return * @throws SQLException */
public Map<String, Object> findOneMap(String sql, Object[] params) throws SQLException { QueryRunner qr = new QueryRunner(); return qr.query(JdbcUtils.getConnection(), sql, new MapHandler(), params); } /** * 查詢單條記錄<br> * 用於獲取結果集第一行資料,並將其封裝到javabean物件返回 <br> * 資料庫欄位名採用的下劃線間隔 對應的bean採用的是駝峰命名 所以要用GenerousBeanProcessor來處理對映關係 * * @param
sql * @param params * @return * @throws SQLException */
public T findOneBean(String sql, Object[] params) throws SQLException { QueryRunner qr = new QueryRunner(); RowProcessor processor = new BasicRowProcessor(new GenerousBeanProcessor()); return qr.query(JdbcUtils.getConnection(), sql, new BeanHandler<T>(entityClass, processor), params); } /** * 查詢結果集<br> * 將結果集中每一行資料都封裝到map裡面,然後放入list返回。 * * @param sql * @param params * @return * @throws SQLException */ public List<Map<String, Object>> findAllMap(String sql, Object[] params) throws SQLException { QueryRunner qr = new QueryRunner(); return qr.query(JdbcUtils.getConnection(), sql, new MapListHandler(), params); } /** * 查詢結果集-預設返回當前類的泛型<br> * 將結果集中每一行都封裝成javabean並存入list返回。 * * @param sql * @param params * @return * @throws SQLException */ public List<T> findAllBean(String sql, Object[] params) throws SQLException { QueryRunner qr = new QueryRunner(); RowProcessor processor = new BasicRowProcessor(new GenerousBeanProcessor()); return qr.query(JdbcUtils.getConnection(), sql, new BeanListHandler<T>(entityClass, processor), params); } /** * 查詢結果集-自定義泛型<br> * 將結果集中每一行都封裝成javabean並存入list返回。 * * @param sql * @param params * @return * @throws SQLException */ public List findAllBean(String sql, Object[] params, Class clazz) throws SQLException { QueryRunner qr = new QueryRunner(); RowProcessor processor = new BasicRowProcessor(new GenerousBeanProcessor()); return qr.query(JdbcUtils.getConnection(), sql, new BeanListHandler(clazz, processor), params); } /** * 返回指定列資料<br> * colName 如果為空則預設返回第一列資料 * * @param sql * @param params * @param colName * @return * @throws SQLException */ public Object findOneCol(String sql, Object[] params, String colName) throws SQLException { QueryRunner qr = new QueryRunner(); if (colName == null || colName.trim().length() == 0) return qr.query(JdbcUtils.getConnection(), sql, new ScalarHandler<Object>(), params); else return qr.query(JdbcUtils.getConnection(), sql, new ScalarHandler<Object>(colName), params); } /** * 插入一條記錄,返回影響行數 * * @param sql * @param params * @throws SQLException */ public int insert1(String sql, Object[] params) throws SQLException { QueryRunner qr = new QueryRunner(); return qr.update(JdbcUtils.getConnection(), sql, params); } /** * 插入一條記錄,並以map資料格式返回新增的記錄。 * * @param sql * @param params * @return * @throws SQLException */ public Map<String, Object> insert2(String sql, Object[] params) throws SQLException { QueryRunner qr = new QueryRunner(); return qr.insert(JdbcUtils.getConnection(), sql, new MapHandler(), params); } /** * 插入一條記錄,並以javabean格式返回新增記錄 * * @param sql * @param params * @return * @throws SQLException */ public T insert3(String sql, Object[] params) throws SQLException { QueryRunner qr = new QueryRunner(); RowProcessor processor = new BasicRowProcessor(new GenerousBeanProcessor()); return qr.insert(JdbcUtils.getConnection(), sql, new BeanHandler<T>(entityClass, processor), params); } /** * 插入一條記錄,並以javabean格式返回新增記錄-自定義泛型 * * @param sql * @param params * @return * @throws SQLException */ public Object insert4(String sql, Object[] params, Class clazz) throws SQLException { QueryRunner qr = new QueryRunner(); RowProcessor processor = new BasicRowProcessor(new GenerousBeanProcessor()); return qr.insert(JdbcUtils.getConnection(), sql, new BeanHandler(clazz, processor), params); } /** * 批量插入 * * @param sql * @param params * @throws SQLException */ public void insertBatch(String sql, Object[][] params) throws SQLException { QueryRunner qr = new QueryRunner(); qr.batch(JdbcUtils.getConnection(), sql, params); } /** * 更新 * * @param sql * @param params * @return 影響記錄數 * @throws SQLException */ public int update(String sql, Object[] params) throws SQLException { QueryRunner qr = new QueryRunner(); return qr.update(JdbcUtils.getConnection(), sql, params); } /** * 批量更新 * * @param sql * @param params * @return 已修改記錄數集合 * @throws SQLException */ public int[] updateBatch(String sql, Object[][] params) throws SQLException { QueryRunner qr = new QueryRunner(); return qr.batch(JdbcUtils.getConnection(), sql, params); } /** * 刪除 * * @param sql * @param params * @return 影響記錄數 * @throws SQLException */ public int delete(String sql, Object[] params) throws SQLException { return this.update(sql, params); } /** * 批量刪除 * * @param sql * @param params * @return 已刪除記錄數集合 * @throws SQLException */ public int[] deleteBatch(String sql, Object[][] params) throws SQLException { return this.updateBatch(sql, params); } }

BaseDAO中使用的兩個工具類
SpringBeanUtils:

public class SpringBeanUtils implements BeanFactoryAware {

    private static BeanFactory beanFactory;

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        SpringBeanUtils.beanFactory = beanFactory;
    }

    public static Object getBean(String beanName) {
        return beanFactory.getBean(beanName);
    }

    public static Object getBean(Class clazz) {
        WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
        return wac.getBean(clazz);
    }
}

JdbcUtils:

/**
 * 資料庫的常用操作,資料庫連線直接繫結到當前執行緒。
 * <p>
 * 1、獲取資料庫連線 {@link #getConnection()}
 * <p>
 * 2、開啟事務 {@link #startTransaction()}
 * <p>
 * 3、回滾事務 {@link #rollback()}
 * <p>
 * 4、提交事務 {@link #commit()}
 * <p>
 * 5、關閉資料庫連線 {@link #close()}
 * 
 *
 */
public class JdbcUtils {

    private static DruidDataSource ds = null;
    private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();

    /**
     * 獲取資料來源
     */
    static {
        ds = (DruidDataSource) SpringBeanUtils.getBean(DruidDataSource.class);
    }

    /**
     * 從資料來源中獲取資料庫連線
     * 
     * @return Connection
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        Connection conn = threadLocal.get();
        if (conn == null) {
            conn = getDataSource().getConnection();
            threadLocal.set(conn);
        }
        return conn;
    }

    /**
     * 開啟事務
     *
     */
    public static void startTransaction() {
        try {
            Connection conn = threadLocal.get();
            if (conn == null) {
                conn = getConnection();
                // 把 conn繫結到當前執行緒上
                threadLocal.set(conn);
            }
            // 開啟事務
            conn.setAutoCommit(false);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 回滾事務
     *
     */
    public static void rollback() {
        try {
            // 從當前執行緒中獲取Connection
            Connection conn = threadLocal.get();
            if (conn != null) {
                // 回滾事務
                conn.rollback();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 提交事務
     *
     */
    public static void commit() {
        try {
            // 從當前執行緒中獲取Connection
            Connection conn = threadLocal.get();
            if (conn != null) {
                // 提交事務
                conn.commit();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 關閉資料庫連線(注意,這裡只是把連線還給資料庫連線池)
     *
     */
    public static void close() {
        try {
            // 從當前執行緒中獲取Connection
            Connection conn = threadLocal.get();
            if (conn != null) {
                conn.close();
                // 解除當前執行緒上繫結conn
                threadLocal.remove();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 獲取資料來源
     */
    public static DataSource getDataSource() {
        // 從資料來源中獲取資料庫連線
        return ds;
    }
}