1. 程式人生 > 其它 >Java開發技術之淺談Statement的不足

Java開發技術之淺談Statement的不足

1、PreparedStatement概述

可以通過呼叫 Connection 物件的 preparedStatement(String sql) 方法獲取 PreparedStatement 物件

PreparedStatement 介面是 Statement 的子介面,它表示一條預編譯過的 SQL 語句

  • PreparedStatement 物件所代表的 SQL 語句中的引數用問號(?)來表示,呼叫 PreparedStatement 物件的 setXxx() 方法來設定這些引數. setXxx() 方法有兩個引數,第一個引數是要設定的 SQL 語句中的引數的索引(從 1 開始),第二個是設定的 SQL 語句中的引數的值
  • ResultSet executeQuery()執行查詢,並返回該查詢生成的 ResultSet 物件。
  • int executeUpdate():執行更新,包括增、刪、該

2、Statement的不足

(1)SQL拼接

(2)SQL注入

SQL 注入是利用某些系統沒有對使用者輸入的資料進行充分的檢查,而在使用者輸入資料中注入非法的 SQL 語句段或命令,從而利用系統的 SQL 引擎完成惡意行為的做法。對於 Java 而言,要防範 SQL 注入,只要用 PreparedStatement 取代 Statement 就可以了。

(3)處理Blob型別的資料

BLOB (binary large object),二進位制大物件,BLOB常常是資料庫中用來儲存二進位制檔案的欄位型別。

插入BLOB型別的資料必須使用PreparedStatement,因為BLOB型別的資料無法使用字串拼接寫的。

MySQL的四種BLOB型別(除了在儲存的最大資訊量上不同外,他們是等同的)

實際使用中根據需要存入的資料大小定義不同的BLOB型別。
需要注意的是:如果儲存的檔案過大,資料庫的效能會下降。

CREATE TABLE `user` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`username` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,

`head_picture` mediumblob

,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

package com.jdbc;

import java.io.FileInputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.util.Properties;

public class TestBlob {

public static void main(String[] args) throws Exception{

//載入jdbc.properties資源配置檔案

Properties pro = new Properties();

pro.load(ClassLoader.getSystemResourceAsStream(“jdbc.properties”));

//1、載入與註冊驅動

Class.forName(pro.getProperty(“driver”));

//2、獲取資料庫連線

Connection conn = DriverManager.getConnection(pro.getProperty(“url”), pro);

//3、訪問資料庫

//(1)準備帶引數(?)的SQL

//PreparedStatement 介面是 Statement 的子介面,它表示一條預編譯過的 SQL 語句

//PreparedStatement 物件所代表的 SQL 語句中的引數用問號(?)來表示

String sql =”insert into user(username,head_picture) value(?,?)”;

//(2)通過呼叫 Connection 物件的 preparedStatement(String sql) 方法獲取 PreparedStatement 物件

PreparedStatement pst = conn.prepareStatement(sql);

//(3)呼叫 PreparedStatement 物件的 setXxx(int parameterIndex,XX value) 方法來設定這些引數

pst.setString(1, “lily”);

pst.setBlob(2, new FileInputStream(“head/girl.jpg”));

//(4)呼叫PreparedStatement的executeUpdate()執行SQL語句進行插入

//注意此處不能在傳sql,否則?就白設定了

int len = pst.executeUpdate();

//(5)處理結果

if (len > 0) {

System.out.println(“新增成功”);

} else {

System.out.println(“新增失敗”);

}

//4、釋放資源

pst.close();

conn.close();

}

}

想了解更多java培訓開發技術知識,請關注我,有更多精彩內容呈現!

文章轉載連結:http://www.atguigu.com/jsfx/13017.html