dbutils简单封装

java 专栏收录该内容
5 篇文章 0 订阅

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;
    }
}
  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值