Java訪問數據庫之JDBC實現方式

數據庫連接池

數據庫連接池用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。

Java訪問數據庫之JDBC實現方式

在數據持久層定義UserDao的實現類UserDaoImpl去繼承BaseDao泛型類實現具體的UserDao。

Java訪問數據庫之JDBC實現方式

在邏輯業務層去實例化UserDaoImpl,再調用相應的方法完成數據的CRUD。

Java訪問數據庫之JDBC實現方式


分享到:


相關文章: