1. 程式人生 > >JDBC入門教程(三) PreparedStatement的使用

JDBC入門教程(三) PreparedStatement的使用

前兩章我們寫了一個 DBTools 工具類,可以進行簡單的資料庫操作,但是有很大的侷限性,今天就來改善一下這個類,學習一個新的物件 PreparedStatement
  1. 為什麼要使用PreparedStatement
    前面我們建立了一個store資料庫,並且建立了一個user資料表,表裡包含欄位 id ,account ,password ,role。而且還向裡面加入了一條資料 sql 語句是這樣寫的
INSERT INTO store.user (account,password,role) VALUES ('admin','123',1)

我直接把欄位的值直接寫在了sql語句裡,不過通常情況下,(‘admin’,’123’,1) 這裡面都是一些變數,為了方便,我們會建立一個實體類,來對應相應的資料庫表,現在新建一個 user 實體類

package com.jiaoshou.domain;

public class User {

    //使用者的ID
    private int id;
    //使用者名稱
    private String account;
    //密碼
    private String password;
    //使用者角色
    private int role;

    //無參構造
    public User() {
        super();
    }

    //有參構造
    public User(int id, String account, String password, int
role) { super(); this.id = id; this.account = account; this.password = password; this.role = role; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAccount() { return
account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getRole() { return role; } public void setRole(int role) { this.role = role; } }

假設現在又一個 user 實體,裡面封裝了我們需要的資料,我們要把這個 user 插入資料庫中,sql 語句就變成了

"INSERT INTO store.user (account,password,role) VALUES ("
                + user.getAccount() + ",'" 
                + user.getPassword() + "',"
                + user.getRole() + ")";

由於我們要在 sql 語句中加入變數,所以我們不得不拼接字串,這種方式麻煩,效率低,容易出錯,安全性不高,PreparedStatement 物件就可以解決以上的問題。

2. 如何使用 PreparedStatement

使用 PreparedStatement 物件操作資料庫可以分為一下幾步

  1. 獲取資料庫連線

  2. 寫sql語句,設定佔位符,用 ?代替變數

  3. 建立PreparedStatement物件

  4. 為佔位符進行賦值

  5. 執行操作

  6. 釋放資源

下面我們就把上面提到的那個 user 使用PreparedStatement物件插入資料庫

@Test
    public void insertUsers() throws SQLException {
        User user = new User(2,"master","123",2);
        //獲取資料庫連線
        Connection conn = DBTools.getConnection();
        //寫sql語句,設定佔位符,用 ?代替變數
        String sql = "INSERT INTO store.user (account,password,role) VALUES (?,?,?)";
        //建立 PreparedStatement 物件
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        //為佔位符進行賦值
        preparedStatement.setString(1,user.getAccount());//第一個引數是第幾個佔位符,第二個引數是為這個佔位符進行賦值
        preparedStatement.setString(2,user.getPassword());
        preparedStatement.setInt(3,user.getRole());
        //執行操作
        preparedStatement.executeUpdate();
        //釋放資源
        DBTools.release(null, null, conn);
    }

測試一下這個類。其他的delete update 方法也一樣

我們先前寫了一個通用的更新方法 update(String sql),很明顯我們不能只把這裡帶有佔位符的 sql 語句傳過去,還需要佔位符對應的值,所以要對前面的那個方法進行改進。這樣的話 update 方法就需要兩個形式引數,一個是帶有佔位符的 sql 語句,另一個是佔位符 對應的值。不過不同的 sql 語句佔位符的個數也是不同的,所以我們要用到可變引數 Object...args

方法改進如下:

//通用的更新方法
    public static void update(String sql,Object...args){
        Connection conn = null;
        PreparedStatement preparedStatement = null;
        try {
            //獲取資料庫連線
            conn = DBTools.getConnection();
            //建立PreparedStatement物件
            preparedStatement = conn.prepareStatement(sql);
            //通過迴圈來給sql的佔位符賦值
            for(int i=0;i<=args.length-1;i++){
                preparedStatement.setObject(i+1, args[i]);
            }
            //執行更新操作
            preparedStatement.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            release(null,null,conn);
        }
    }

測試一下這個通用方法,改一下 使用者名稱為 master 的密碼

@Test
    public void updatePasswd() {
        User user = new User();
        user.setAccount("master");
        user.setPassword("jiaoshou");
        user.setRole(1);
        String sql = "UPDATE store.user SET password=?, role=? WHERE account=?";
        DBTools.update(sql, user.getPassword(),user.getRole(),user.getAccount());
    }

測試一下,OK!!

下一章我們會對我們的查詢方法進行升級

相關推薦

JDBC入門教程() PreparedStatement的使用

前兩章我們寫了一個 DBTools 工具類,可以進行簡單的資料庫操作,但是有很大的侷限性,今天就來改善一下這個類,學習一個新的物件 PreparedStatement 為什麼要使用PreparedStatement 前面我們建立了一個store資料庫,並

Spring Cloud 入門教程(): 配置自動刷新

入門 stc pro 解決方案 con log clas ring color 之前講的配置管理, 只有在應用啟動時會讀取到GIT的內容, 之後只要應用不重啟,GIT中文件的修改,應用無法感知, 即使重啟Config Server也不行。 比如上一單元(Spring Clo

超簡單的SpringClound入門教程(.服務的消費者Feign)

上一篇,講了SpringClound中的消費者採用織帶+休息來實現,這回我們用元件Feign來實現服務的消費者,Fegin中也是預設集成了Ribbon的;和Eureka結合也能實現負載均衡; 概括來說,Fegin的區別就是基於註解來實現,具備可插拔的特性; 一,專案準備 這回我們要用的專案工程

scrapy入門教程()scrapy相關元件

前面兩步的準備工作完成之後,我們先不要著急開始工作,畢竟作為一個框架,還是很複雜的;貿然上手 開整,很容易陷入懵逼狀態啊!一團漿糊,理不清思路,後面的事情做起來很很麻煩啦! 我們來看看下面這張圖: (1)引擎(Engine) 引擎負責控制資料流在系統所有元件

無廢話SharePoint入門教程[建立網站集和網站]

一、前言     前兩篇文章講解了什麼是SharePoint,並且介紹了在SharePoint中一些常用的概念。但概念終究是概念,我們還是要腳踏實地的去動手實踐。下面的文章對於瞭解SharePoint的人來說過於簡單,但由於本系列是入門教程,所以從最簡單的入手並一步一步深入

Scala基礎入門教程()

Tuples(元組): 在Python中的元組是不受限制的,在Scala中元組最多支援22項 因為在Scala中實際上是定義了22個類,分別是Tuple1,Tuple2,Tuple3一直到22個, 例子: object Demo1 extends App{

無廢話MVC入門教程[路由設定及檢視入門]

MVC入門系列教程-視訊版本,已入駐51CTO學院,文字+視訊學效果更好哦。視訊連結地址如下: 點我檢視視訊。另外,針對該系列教程博主提供有償技術支援,群號:226090960,群內會針對該教程的問題進行及時解答,公用性問題統一講解。學習.NET MVC 只看在《無廢話系列》足夠了,《無廢話系列》簡單、快速、

無廢話WCF入門教程[WCF的宿主]

1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <system.serviceModel> 4 <services> 5 <service

Activiti入門教程(詳解流程引擎配置)

     在先前的部落格中提到了有關ProcessEngineConfiguration建立,但並沒有詳細的解釋,主要建立的幾個方法,那麼這篇部落格就來談一談有關ProcessEngineConfig

Android入門教程之使用Eclipse+ADT+SDK開發安卓APP

前言: 1.這裡我們有兩條路可以選,直接使用封裝好的用於開發Android的ADT Bundle,或者自己進行配置 因為谷歌已經放棄了ADT的更新,官網上也取消的下載連結,這裡提供谷歌放棄更新前最新版本的 ADT Bundle供大家下載! 2.直接使用

Spring Boot入門教程(十一): 自定義Starter

在springboot中,使用的最多的就是starter。starter可以理解為一個可拔插式的外掛,例如,你想使用jdbc外掛,那麼可以使用spring-boot-starter-jdbc;如果想使用mongodb,可以使用spring-boot-starte

MVC5 + EF6 完整入門教程

期待已久的EF終於來了。 學完本篇文章,你將會掌握基於EF資料模型的完整開發流程。 本次將會完成EF資料模型的搭建和使用。 基於這個模型,將之前的示例新增資料庫查詢驗證功能。 文章提綱 概述 & 要點 詳細步驟 總結 概述 & 要點 下面是本文要點,正文部分會有

SpringCloud入門教程()配置管理

配置管理根據字面上理解,就是一些管理專案中使用到的一些配置檔案。以前開發單臺伺服器的時候,我們通過一個配置檔案就可以將平常用到的一些配置記錄下來,但是如果是搭建多臺叢集伺服器部署,當然也可以使用多個配置檔案,但是維護和同步就會比較麻煩。所以配置服務一般分兩種情況: 1.多臺

Rxjava2入門教程:Operators操作符

Operators操作符 操作符(Operators):其實質是函數語言程式設計中的高階函式,是對響應式程式設計的各個過程拆分封裝後的產物。以便於我們操作資料流。 按照其作用具體可分為以下幾類: 建立:建立一個可觀察物件Observable併發射資料 過濾:從Observable發射

struts2入門教程(上傳與下載)

package action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.struts2.ServletActionContext; im

Android入門教程十之SeekBar(拖動條)

本節我們繼續來學習Android的基本UI控制元件中的拖動條——SeekBar,相信大家對他並不陌生,最常見的 地方就是音樂播放器或者視訊播放器了,音量控制或者播放進度控制,都用到了這個SeekBar,我們 先來看看SeekBar的類結構,來到官方文件:Seek

Java入門教程(流程控制)

概述 程式有 3 種結構:順序結構、選擇結構和迴圈結構。分別為:if elseswitch case,while與do while,for, foreach,return,break ,continue if else if 選擇結構是根據條件判斷之後再做處理的一種語法結構。預設情況下,if 語句控制著下方緊

Spring Cloud 入門教程(): 服務消費者(Feign)(Greenwich.RELEASE)

一、準備工作 同上節 二、新建maven 工程 service-feign (服務消費者 ) 1、修改pom.xm

CodeArt入門教程

pan center account 根據 領域對象 保存 顏色 單一職責原則 用例 5.領域模型設計   下面我們創建賬戶子系統(AccountSubsystem),賬戶子系統雖然被門戶服務使用,但是子系統本身是獨立於任何服務存在的。所以我們為賬戶子系統創建獨立的項目解決

Dapper入門教程)——Dapper Query查詢

int32 method ppi ransac try spa can () raw 介紹 查詢方法(Query)是IDbConnection的擴展方法,它可以用來執行查詢(select)並映射結果到C#實體(Model、Entity)類 查詢結果可以映射成如下類型: A