Java學習之資料庫連接配接池
0x00 前言
前面用到的jdbc,在每次連接配接資料庫的時候都需要去重建立立對象。我們在這裡會用到建立一個連接配接池,每次使用完後歸還給連接配接池。
0x01 連接配接池概述
連接配接池其實就是一個容器(集合),存放資料庫連接配接的容器。
當系統初始化好後,容器被建立,容器中會申請一些連接配接對象,當使用者來通路資料庫時,從容器中擷取連接配接對象,使用者通路完之後,會将連接配接對象歸還給容器。
使用連接配接池能節約資源使使用者通路高效。
0x02 連接配接池實作
C3P0建立線程池
添加jar檔案到libs目錄下,所需檔案:
c3p0-0.9.5.2.jar c3p0包 mchange-commons-java-0.2.12.jar//c3p0 依賴包
mysql-connector //資料庫連接配接驅動包
将c3p0-config.xml放到src目錄下,并進行配置。
建立連接配接池代碼:
public class test1 {
public static void main(String[] args) throws SQLException {
DataSource dataSource = new ComboPooledDataSource();
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
Druid 資料庫連接配接池
導入jar包
druid-1.0.9.jar
導入druid.properties檔案
代碼:
public class test2 {
public static void main(String[] args) throws Exception {
Properties pro = new Properties(); //建立properties對象
InputStream is = test2.class.getClassLoader().getResourceAsStream("druid.properties"); //擷取配置檔案資源
pro.load(is); //加載配置檔案
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro); //建立連接配接池對象,并傳入配置檔案資訊
Connection connection = dataSource.getConnection(); //擷取連接配接對象
System.out.println(connection);
}
}
使用完這些方式後可以發現,連接配接資料庫也比較友善了,都是一些封裝好的代碼。
我們在這裡可以再定義一個工具類,把連接配接的東西都封裝在工具類裡面,簡化我們的代碼。
工具類:
public class JDBCutiss {
private static DataSource ds;
static {
Properties pro = new Properties();
InputStream rs = JDBCutiss.class.getClassLoader().getResourceAsStream("druid.properties");
try {
pro.load(rs);
try {
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//傳回連接配接對象
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void close(Statement stmt,Connection conn){
if (stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//該方法傳回定義好的DataSource對象
public static DataSource getDataSource(){
return ds;
}
}
main方法:
public class test2 {
public static void main(String[] args) throws Exception {
Connection connection = JDBCutiss.getConnection();//擷取連接配接對象
String sql = "select * from users where id =?"; //設定sql語句
PreparedStatement preparedStatement = connection.prepareStatement(sql);//傳入sql語句并建立預編譯執行對象
preparedStatement.setString(1,"1"); //sql語句設定值
// System.out.println(sql);
ResultSet resultSet = preparedStatement.executeQuery(); //執行sql語句
while (resultSet.next()){
System.out.println(resultSet.getString("id")); //擷取id
System.out.println(resultSet.getString("username"));//擷取使用者賬戶
System.out.println(resultSet.getString("password"));//擷取密碼
}
JDBCutiss.close(preparedStatement,connection);
}
}
Spring JDBC
Spring架構對JDBC的簡單封裝。提供了一個JDBCTemplate對象簡化JDBC的開發。
建立對象:
JdbcTemplate template = new JdbcTemplate(ds);
常用方法:
* update():執行DML語句。增、删、改語句
* queryForMap():查詢結果将結果集封裝為map集合,将列名作為key,将值作為value 将這條記錄封裝為一個map集合
* 注意:這個方法查詢的結果集長度隻能是1
* queryForList():查詢結果将結果集封裝為list集合
* 注意:将每一條記錄封裝為一個Map集合,再将Map集合裝載到List集合中
* query():查詢結果,将結果封裝為JavaBean對象
* query的參數:RowMapper
* 一般我們使用BeanPropertyRowMapper實作類。可以完成資料到JavaBean的自動封裝
* new BeanPropertyRowMapper(類型.class)
* queryForObject:查詢結果,将結果封裝為對象
* 一般用于聚合函數的查詢
Template連接配接代碼:
public class test3 {
public static void main(String[] args) {
JdbcTemplate template = new JdbcTemplate(JDBCutiss.getDataSource());//從工具類擷取對象傳入
String sql = "update users set password =? where id =?";
int admin = template.update(sql,"500",2); //參數sql語句需要的參數,再進行執行sql語句
System.out.println(admin);
}
}
總體來說也就3行代碼就實作了這麼一個操作資料庫的,比前面幾個方法都簡單很多,其他的所需功能都在工具類裡面封裝好了,可以直接進行調用。
0x03 結尾
在使用了spring Jdbc後發現代碼比前面幾個都輕松很多,定義的工具類開發程式的時候可以直接複制來使用,或者做一點稍微的改進再進行使用。總體來說spring還是很友善。