數據庫連接池
數據庫連接池用c3p0-0.9.1.2.jar包,通過配置文件的方式來維護數據庫連接信息。在類路徑下新建c3p0-config.xml文件,內容如下:
root
123456789
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/shiro?characterEncoding=utf-8
5
5
5
20
20
5
JdbcUtils類
該類主要用來加載c3p0數據源屬性,獲取connection及釋放connection。
public class JdbcUtils {
private static DataSource dataSource = null;
static {
//加載c3p0數據源
dataSource = new ComboPooledDataSource("shiro");
}
/**
* 返回、connection
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* 根據sql 語句名獲取具體的sql語句命令
*/
public static String getSql(String name) {
Map sqls = null;
try {
sqls = QueryLoader.instance().load("/sql.properties");
return sqls.get(name);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 釋放連接資源
*/
public static
void realseDb(Connection connection) {if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void relase(ResultSet reslutSet,Statement satement) {
if (reslutSet != null) {
try {
reslutSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (satement != null) {
try {
satement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC Dao 接口
Dao 定義 Dao 的基本操作, 由 BaseDao 提供實現。
/**
* Dao 接口, 定義 Dao 的基本操作, 由 BaseDao 提供實現.
*/
public interface DAO {
/**
* 執行 INSERT 操作, 返回插入後的記錄的 ID
*/
int insert(String sql, Object... args);
/**
* 執行 UPDATE 操作, 包括 INSERT(但沒有返回值), UPDATE, DELETE
*/
boolean update(String sql, Object... args);
/**
* 執行單條記錄的查詢操作, 返回與記錄對應的類的一個對象
*/
T query(String sql, Object... args);
/**
* 執行多條記錄的查詢操作, 返回與記錄對應的類的一個 List
*/
List queryForList(String sql, Object... args);
/**
* 執行一個屬性或值的查詢操作, 例如查詢某一條記錄的一個字段, 或查詢某個統計信息, 返回要查詢的值
*/
E getForValue(String sql, Object... args);
/**
* 執行批量更新操作
*/
void batch(String sql, Object[]... args);
}
BaseDao泛型類
BaseDao 實現DAO 的方法。
/**
* 定義BaseDao泛型類
* 實際操作類型
*/
public class BaseDAO implements DAO {
private QueryRunner queryRunner = new QueryRunner();
private Class type;
public BaseDAO() {
type = ReflectionUtils.getSuperGenericType(getClass());
}
/**
* 返回一個具體的值
*/
public E getForValue(String sql, Object... args) {
Connection connection = null;
try {
connection = JdbcUtils.getConnection();
return (E) queryRunner.query(connection, sql, new ScalarHandler<>(), args);
} catch (SQLException e) {
e.printStackTrace();
}
finally {
JdbcUtils.realseDb(connection);
}
return null;
}
/**
* 返回多個對象
*/
public List queryForList(String sql, Object... args) {
Connection connection = null;
try {
connection = JdbcUtils.getConnection();
return queryRunner.query(connection, sql, new BeanListHandler<>(type), args);
} catch (SQLException e) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
return null;
}
/**
* 返回一個對象
*/
public T query(String sql, Object... args) {
Connection connection = null;
try {
connection = JdbcUtils.getConnection();
return queryRunner.query(connection, sql, new BeanHandler<>(type), args);
} catch (SQLException e) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
return null;
}
/**
* 增、刪、改
* @param sql
* @param args
*/
public boolean update(String sql, Object... args) {
Connection connection = null;
boolean flag = false ;
try {
connection = JdbcUtils.getConnection();
queryRunner.update(connection, sql, args);
flag = true;
} catch (SQLException e) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
return flag;
}
/**
* 根據插入的記錄獲取相應的主鍵值
* @param sql
* @param args
*/
@Override
public int insert(String sql, Object... args) {
int id = 0;
Connection connection = null;
java.sql.PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
if (args != null) {
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
}
preparedStatement.executeUpdate();
resultSet = preparedStatement.getGeneratedKeys();
if (resultSet.next()) {
id = resultSet.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.relase(resultSet, preparedStatement);
}
return id;
}
/**
* 批量處理
* @param sql
* @param args
*/
@Override
public void batch(String sql, Object[]... args) {
Connection connection = null;
try {
connection = JdbcUtils.getConnection();
queryRunner.batch(connection, sql, args);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
具體業務DAO實現
根據不同的業務來定義需要的接口,例如維護用戶信息(CRUD)的UserDao。
在數據持久層定義UserDao的實現類UserDaoImpl去繼承BaseDao泛型類實現具體的UserDao。
在邏輯業務層去實例化UserDaoImpl,再調用相應的方法完成數據的CRUD。