1. 程式人生 > >Spring 學習其三:數據庫編程

Spring 學習其三:數據庫編程

最大連接數 學習 mysq 簡單 持久 employee 建立 auto ets

一、直接利用 JDBC 進行數據庫編程

雖然有 Spring 和 MyBatis 等數據持久化的利器在手,但還是有必要去了解下傳統的 JDBC 開發方式。無論哪種框架,其本質都是在傳統的 JDBC 方式上進行了封裝。

package JdbcTest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcTest {

    
public static void main(String[] args) { EmployeeModel employee = null; Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://192.168.52.129:3306/employees?serverTimezone=UTC", "root", "Root123#"); ps
=con.prepareStatement("select emp_no,first_name,last_name from employees where emp_no = ?"); ps.setInt(1, 10001); rs = ps.executeQuery(); while(rs.next()) { employee = new EmployeeModel(); employee.setEmpNo(rs.getInt(1)); employee.setFirstName(rs.getString(
2)); employee.setLastName(rs.getString(3)); } } catch (ClassNotFoundException e) { System.out.println("class not found"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if(!(rs == null) && !rs.isClosed()) { rs.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if(!(ps == null) && ps.isClosed()) { ps.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if(con !=null && !con.isClosed()) { con.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(employee); } }

這段代碼的惱人的地方在於數據庫資源的使用和銷毀,這些代碼被大串的 try-catch 語句包裹。Spring 則為我們進行了一次包裝,將這些煩人的 try-catch 語句交給 Spring 去處理。

二、為 Spring 創建第三方數據庫連接池

Spring 本身也有自己的數據類,但是過於簡單,在絕大多數的項目中,我們都希望能夠用數據連接池的方式去管理連接。常用的第三方連接池是 DBCP2。

在配置 DBCP2 之前,現在 properties 文件裏存好數據庫連接所需的信息:

database.driver = com.mysql.cj.jdbc.Driver
database.url = jdbc:mysql://192.168.52.129:3306/employees?serverTimezone=UTC
database.username = root
database.password = Root123#
database.maxtotal = 255
database.maxidle = 3
database.maxwaitmillis = 10000

maxtoal 值最大連接數,maxidle 為最大等待連接數量(超出這個數量的連接資源會被釋放),maxwaitmillis 為最大等待毫秒數

然後再 spring-cfg.xml 裏引入該 peoperties 文件並且建立一個連接池對象:

<bean id = "dataSource" class = "org.apache.commons.dbcp2.BasicDataSource">
      <property name = "driverClassName" value = "${database.driver}"/>
      <property name="url" value="${database.url}"/>
      <property name="username" value="${database.username}"/>
      <property name="password" value="${database.password}"/>
      <property name="maxTotal" value="${database.maxtotal}"/>
      <property name="maxIdle" value="${database.maxidle}"/>
      <property name="maxWaitMillis" value="${database.maxwaitmillis}"/>
    </bean>

而包裝傳統 jdbc 的 Spring 的類為 JdbcTemple ,我們也配置下:

<bean id="jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">
      <property name = "dataSource" ref = "dataSource"/>
    </bean>

然後使用 JdbcTemplate 來完成上面的獲取 employee 信息的功能:

Spring 學習其三:數據庫編程