dbutils簡單封裝
阿新 • • 發佈:2019-01-03
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;
}
}