1. 程式人生 > >JAVA技術分享:jdbc淺析

JAVA技術分享:jdbc淺析

source drive except lose t對象 ted dbi 連接 row

# jdbc淺析

# 一、jdbc概念

所謂的jdbc,實際是來自於 java database conectivity的縮寫,顧名思義是用於實現在java程序中連接數據庫,以至於可以對數據庫進行操作。實際上,jdbc是java程序與數據庫進行通信的一種規範。這種規範(接口)定義在java.sql包下。其四大核心對象:

- DriverManager: 用於加載數據庫驅動
- Connection:用於連接數據庫的
- Statement: 用於執行sql語句的
- ResultSet:用於封裝從數據庫返回的結果集的

# 二、jdbc初體驗

```java
//1.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
//2.獲得一個連接對象
String url= "jdbc:mysql:///db_day07?user=root&password=123";
Connection connection = DriverManager.getConnection(url);
//3.獲得執行sql語句的statement對象
Statement stmt = connection.createStatement();
//4.執行sql語句
String sql = "select * from user";
//5.獲得結果集對象ResultSet,其中封裝著來自於數據庫的所有數據
ResultSet rs = stmt.executeQuery(sql);
//6.解析結果集
while(rs.next()){
System.out.println(rs.getInt(1)+";"+rs.getString(2)+";"+rs.getInt(3)+";"+rs.getString(4));
}
//7.釋放資源
rs.close();
stmt.close();
connection.close();
```

## 數據庫驅動的作用:

數據庫驅動是已經實現了jdbc規範的一個類集。其中封裝了實現了jdbc規範的所有的類。

對於mysql的驅動來說,獲得的Connection對象,該對象就能連接mysql數據庫,同理,oracle驅動獲得的連接對象,就能連接oracle數據庫。

# 三、四大核心對象的詳解

## 1.DriverManager:加載驅動

註冊驅動的方式有兩種:

1)DriverManager.registerDriver(new com.mysql.jdbc.Driver());

這種方式不合適,因為驅動會隨著com.mysql.jdbc.Driver類的加載而被註冊,此時相當於註冊了兩次

2)Class.forName("com.mysql.jdbc.Driver"); 這種方式直接加載com.mysql.jdbc.Driver類,加載類時Driver類的靜態代碼塊就會註冊驅動。因此,註冊驅動就用這種方式

## 2.Connection:連接數據庫的

什麽樣的數據庫的驅動,獲得的連接對象就是連接什麽樣的數據庫,比如mysql數據庫的驅動,獲得的連接對象就是用於連接mysql數據庫的。

獲得Connection對象的方式:

- 方式一:

```java
String url = "jdbc:mysql://localhost:3306/db_day07";
String user = "root";
String password = "123";
Connection conn = DriverManager.getConnection(url, user, password);
```

- 方式二:將用戶名和密碼存入到Properties屬性集對象(map)中

```java
Properties pro = new Properties();
pro.setProperty("user", "root");
pro.setProperty("password", "123");
Connection conn = DriverManager.getConnection(url, pro);
```

- 方式三:將用戶名和密碼作為url的參數

```java
String url= "jdbc:mysql:///db_day07?user=root&password=123";
Connection conn = DriverManager.getConnection(url);
```

## 3.Statement對象:用於執行sql語句的對象

獲得的方式:

Connection對象的createStatement();

執行sql語句的方法:

- 方法一: executeQuery(String sql): 返回值是一個ResultSet對象,該對象中封裝著查詢的結果。

對於查詢的sql語句來說,使用此方法。因為查詢的sql(select)會產生結果集。

- 方法二:executeUpdate(String sql): 返回值是一個int ,表示受影響的行數。

對於,不會產生結果的sql語句(insert、update、delete),使用這個方法,該方法的返回值是受影響的行數。

## 4.ResultSet對象:用於封裝結果集的

如果statement對象執行executeQuery方法產生了結果,那麽該結果集就被封裝進ResultSet對象中。

需要掌握的幾個方法:

- next():第一次調用之前,光標指向第一行之前,第一次調用,指在第一行,第二次調用指在第二行。next方法的返回值,如果該行有數據,則返回true,否則返回false.
- getInt(int columnindex):通過列的索引找到該列的數據,註意,索引從1開始
- getInt(String columnname):通過列的名字找到該列的數據。
- getString()、getObject()...

# 四、完善JDBC代碼

## 封裝JDBCUtil工具類,通過工具類來獲得Connection對象

```java
private static String driver = null;
private static String url = null;
private static String user = null;
private static String password = null;
static{
//靜態代碼塊是隨著類的加載而被加載,且只加載一次。
Properties p = new Properties();
try {
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("dbinfo.properties"));
driver = p.getProperty("driver");
url = p.getProperty("url");
user = p.getProperty("user");
password = p.getProperty("password");
Class.forName(driver);

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static Connection getConnection() throws SQLException, ClassNotFoundException{
return DriverManager.getConnection(url,user,password);
}
```

# 五、案例:完成登錄驗證

登錄驗證的實現

```java
public User findUser(String username, String password) {
User user = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//從工具類中獲得一個Connection對象
conn = JDBCUtil.getConnection();
stmt = conn.createStatement();
//select * from user where username=‘zhangsan‘ and password=‘123456‘
String sql = "select * from user where username=‘"+username
+"‘ and password=‘"+password+"‘";
rs = stmt.executeQuery(sql);

if(rs.next()){
//如果用戶名和密碼正確,那麽就能獲得一條記錄,於是解析該記錄並封裝進User對象中
user = new User();
user.setUid(rs.getString(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
}
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//釋放資源
JDBCUtil.releaseResource(conn, stmt, rs);
}
return user;
}

```

JAVA技術分享:jdbc淺析