---
# System prepended metadata

title: 在java中執行sql指令(JAVA連接MYSQL)
tags: [Java Web-知識點未完善, Java -網頁功能實現]

---

# 在java中執行sql指令(JAVA連接MYSQL)
###### tags: `Java -網頁功能實現` `Java Web-知識點未完善`

SQL(結構化查詢語言)，是用於儲存資料的資料庫，同時也能查詢裡頭存放的資料，如果我們想在JAVA中引用，甚至篩選出SQL中的資料，就必須參考以下步驟

### 步驟一：先確立與資料庫的連接
為了確定是與哪個資料庫連接，才能取出需要的資料，我們需要取得資料庫的相關資料，因此先創立一個抽像類別來建立與資料庫的連接

(本次欲連接的資料庫資訊，連接至fruitdb)
![](https://i.imgur.com/2QgUOEl.png)

```java=
    //載入 MySQL 的 Driver，又分成"com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver，這裡以後者來示範"
    public final String DRIVER = "com.mysql.cj.jdbc.Driver" ;
    //確立資料庫的連接位置，先鎖定localhost(端口號)，再確定資料庫名稱(fruitdb)，後面先照著複製就好，記得加上時區(serverTimezone)
    public final String URL = "jdbc:mysql://localhost:3306/fruitdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
    //用戶名與密碼，視作我們從java登入MYSQL中
    public final String USER = "root";
    public final String PWD = "123456" ;
```

### 步驟二：在需要使用資料庫的函式中確立連接

首先分別建立Connection、PreparedStatement、ResultSet類別的物件，作為函式與資料庫連接時的核對

```java=
 protected Connection conn ;
 protected PreparedStatement psmt ;
 protected ResultSet rs ;
```
(此段過程複雜，先做個紀錄，日後補充)
```java=
    protected Connection getConn(){
        try {
            //1.加载驱动
            Class.forName(DRIVER);
            //2.通过驱动管理器获取连接对象
            return DriverManager.getConnection(URL, USER, PWD);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return null ;
    }
```


```java=
    protected int executeUpdate(String sql , Object... params){
        boolean insertFlag = false ;
        insertFlag = sql.trim().toUpperCase().startsWith("INSERT");
        try {
            conn = getConn();
            if(insertFlag){
                psmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            }else {
                psmt = conn.prepareStatement(sql);
            }
            setParams(psmt,params);
            int count = psmt.executeUpdate() ;

            if(insertFlag){
                rs = psmt.getGeneratedKeys();
                if(rs.next()){
                    return ((Long)rs.getLong(1)).intValue();
                }
            }

            return count ;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(rs,psmt,conn);
        }
        return 0;
    }
```
### 步驟三：讓想使用這個資料庫的人繼承該抽象類別

此類別繼承連接MySQL的抽象類別，因此可以使用該資料庫的資料
```java=
public class FruitDAOImpl extends BaseDAO<Fruit> implements FruitDAO
```

### 步驟四：直接super引用父類中的已經連接資料的函式

```java=
 @Override
    public List<Fruit> getFruitList(String keyword , Integer pageNo) {
        //引用BaseDAO中的executeQuery函式
        //因為該函式已經連接成功數據庫，因此可以直接使用MySQL的語法
        return super.executeQuery("select * from t_fruit where fname like ? or remark like ? limit ? , 5" ,"%"+keyword+"%","%"+keyword+"%", (pageNo-1)*5);
    }
```

