Java之PreparedStatement的使用詳解
PreparedStatement介紹
- 可以通過調(diào)用 Connection 對(duì)象的 prepareStatement(String sql) 方法獲取 PreparedStatement 對(duì)象
- PreparedStatement 接口是 Statement 的子接口,它表示一條預(yù)編譯過的 SQL 語句
- PreparedStatement 對(duì)象所代表的 SQL 語句中的參數(shù)用問號(hào)(?)來表示(?在SQL中表示占位符),調(diào)用 PreparedStatement 對(duì)象的 setXxx() 方法來設(shè)置這些參數(shù). setXxx() 方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是要設(shè)置的 SQL 語句中的參數(shù)的索引(從 1 開始),第二個(gè)是設(shè)置的 SQL 語句中的參數(shù)的值

PreparedStatement vs Statement
- 代碼的可讀性和可維護(hù)性。
- PreparedStatement 能最大可能提高性能:
- DBServer會(huì)對(duì)預(yù)編譯語句提供性能優(yōu)化。因?yàn)轭A(yù)編譯語句有可能被重復(fù)調(diào)用,所以語句在被DBServer的編譯器編譯后的執(zhí)行代碼被緩存下來,那么下次調(diào)用時(shí)只要是相同的預(yù)編譯語句就不需要編譯,只要將參數(shù)直接傳入編譯過的語句執(zhí)行代碼中就會(huì)得到執(zhí)行。
- 在statement語句中,即使是相同操作但因?yàn)閿?shù)據(jù)內(nèi)容不一樣,所以整個(gè)語句本身不能匹配,沒有緩存語句的意義.事實(shí)是沒有數(shù)據(jù)庫(kù)會(huì)對(duì)普通語句編譯后的執(zhí)行代碼緩存。這樣每執(zhí)行一次都要對(duì)傳入的語句編譯一次。
- (語法檢查,語義檢查,翻譯成二進(jìn)制命令,緩存)
- PreparedStatement 可以防止 SQL 注入
插入案例
PreparedStatement常用的方法:
void setObject(int parameterIndex, Object x, int targetSqlType)

parameterIndex the first parameter is 1, the second is 2, …占位符參數(shù)索引是從1開始的
其余也是如此:
void setInt(int parameterIndex, int x)
void setLong(int parameterIndex, long x)
void setString(int parameterIndex, String x)
void setBlob (int parameterIndex, Blob x)
void setDate(int parameterIndex, java.sql.Date x, Calendar cal)

執(zhí)行操作:

package com.atmf;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import org.junit.Test;
public class SumUP {
@Test
public void getConnection() {
Connection con = null;
PreparedStatement ps = null;
try {
//1,加載配置文件
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pr = new Properties();
pr.load(is);
//2,讀取配置信息
String user = pr.getProperty("user");
String password = pr.getProperty("password");
String url = pr.getProperty("url");
String driverClass = pr.getProperty("driverClass");
//3.加載驅(qū)動(dòng)
Class.forName(driverClass);
//4,獲取連接
con = DriverManager.getConnection(url, user,password);
String sql = "insert into customers(name,birth) value(?,?)";
//預(yù)編譯sql語句,得到PreparedStatement對(duì)象
ps = con.prepareStatement(sql);
//5,填充占位符
ps.setString(1, "三明治");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("2020-11-02");
ps.setDate(2, new java.sql.Date(date.getTime()));
//6,執(zhí)行操作
ps.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//7,關(guān)閉資源
try {
if(ps != null)
ps.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(con != null)
con.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
配置信息:jdbc.properties文件
user=root
password=123456
url=jdbc:mysql://localhost:3306/students
driverClass=com.mysql.jdbc.Driver
執(zhí)行結(jié)果:

到此這篇關(guān)于Java之PreparedStatement的使用詳解的文章就介紹到這了,更多相關(guān)Java之PreparedStatement內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
netflix.discovery.shared.transport.TransportException:Cannot
這篇文章主要介紹了netflix.discovery.shared.transport.TransportException:Cannot execute request on any known server報(bào)錯(cuò)問題及解決方法,感興趣的朋友一起看看吧2023-09-09
Spring MVC如何設(shè)置請(qǐng)求頭和響應(yīng)頭的Header
這篇文章主要介紹了Spring MVC如何設(shè)置請(qǐng)求頭和響應(yīng)頭的Header問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
Java HelloWorld原理分析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
我們初學(xué)java的第一個(gè)程序是"hello world"。下面通過實(shí)例代碼給大家講解Java HelloWorld原理分析,感興趣的朋友一起學(xué)習(xí)吧2017-05-05
Java對(duì)象深復(fù)制與淺復(fù)制實(shí)例詳解
這篇文章主要介紹了 Java對(duì)象深復(fù)制與淺復(fù)制實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05

