當前位置:首頁 » 編程軟體 » 什麼是java預編譯sql

什麼是java預編譯sql

發布時間: 2023-12-22 16:43:34

A. 在java中如何實現預編譯

/*
* ProCompile.java *預處理要編譯的文件,刪除多餘的空白,注釋,換行,回車等
* Created on 2007年9月18日, 下午8:58 */ package javacompile; import java.io.*;
import java.util.regex.*;
import javax.swing.JOptionPane; /** * @com.junjian.sun public class PerCompile { File f = null;
String fileString = null;
Pattern p = null;
Matcher m = null;
String regex; //正則表達式 //初始化p
public PerCompile() {
regex ="(//.+)" + //(//.+) 對應單行注釋
//"|(/\\*(.+\\n)+\\*/)"+ // 想對應多行注釋... "|(\\r\\n)" + "|(\\n)"+//(\\r\\n)|(\\n)對應換行
"|(\\B\\s+)" ; // 空白符
String ss;
f = new File(new JOptionPane()
.showInputDialog("請輸入文件所在路徑~"));
try {
BufferedReader bf = new BufferedReader(new FileReader(f));
ss = bf.readLine()+"\n";
fileString = ss; //如果沒有這兩句,ss的開頭會有「null」
while((ss = bf.readLine())!= null){
fileString += ss+"\n"; bf.close();
} catch (IOException ex) {
ex.printStackTrace(); p = Pattern.compile(regex);
m = p.matcher(fileString); //執行替換所有多餘空行,空白符,注釋
void Dels(){
System.out.println("before: "+fileString);
if(m.find()) System.out.println("find!!");
System.out.println(m.replaceAll("")); } }

-

B. 預編譯sql語句就sql綁定變數嗎

1. 認識綁定變數:

綁定變數是為了減少解析的,比如你有個語句這樣
select aaa,bbb from ccc where ddd=eee;
如果經常通過改變eee這個謂詞賦值來查詢,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每條語句都要被資料庫解析一次,這樣比較浪費資源,如果把eee換成「:1」這樣的綁定變數形式,無論ddd後面是什麼值,都不需要重復解析

Java實現綁定變數的方法:
[java] view plain
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();

假設要將id從1到10000的員工的工資都更新為150.00元,不使用綁定變數,則:
[java] view plain
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");
....
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000");
使用綁定變數,則:
[java] view plain
PreparedStatement pstmt;
for (id = 1; id < 10000; id )
{
if (null == pstmt)
pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 150.00);
pstmt.setInt(2, id);
pstmt.executeQuery();
}
二者區別在於,不用綁定變數,則相當於反復解析、執行了1w個sql語句。使用綁定變數,解析sql語句只用了一次,之後的9999次復用第一次生成的執行計劃。顯然,後者效率會更高一些。
2. 什麼時候不應該/不必要使用綁定變數
a. 如果你用數據倉庫,一條大查詢一跑幾個小時,根本沒必要做綁定變數,因為解析的消耗微乎其微。
b. 變數對優化器產生執行計劃有很重要的影響的時候:綁定變數被使用時,查詢優化器會忽略其具體值,因此其預估的准確性遠不如使用字面量值真實,尤其是在表存在數據傾斜(表上的數據非均勻分布)的列上會提供錯誤的執行計劃。從而使得非高效的執行計劃被使用。

3. 綁定變數在OceanBase中的實現

前OceanBase中實現了綁定變數,目的主要是為了編程方便,而不是為了降低生成執行計劃的代價。為什麼呢?因為OceanBase中目前使用的是一
種」靜態執行計劃「,無論什麼Query,執行流程都一樣。OB在前端代理ObConnector中實現綁定變數,將用戶傳入的變數進行
to_string()操作,替代SQL語句中相應的部分,形成一個完整的SQL。然後這個SQL傳遞給MS,MS按照標准流程來解析和執行。相信不遠的
將來,OB將會實現真正意義上的綁定變數,讓用戶享受到綁定變數帶來的好處。

C. java中preparedstatement為什麼可以防止sql注入

不知道樓主用沒有用過
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
把其中passwd換成 [' or '1' = '1] 這樣就可以完成sql注入
更有可能對你的資料庫表drop操作

如果使用preparedstatement的話就可以直接使用預編譯,PreparedStatement不允許在插入時改變查詢的邏輯結構.
舉例
statement
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
passwd就可以換成 『 or '1'='1
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);

preparedstatement
select * from tab_name where name=? and passwd=? ;
PreparedStatement pst = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, passwd);
ResultSet rs = pstmt.executeQuery();

D. pstmt = conn.prepareStatement(sql);是什麼意思

pstmt = conn.prepareStatement(sql)是執行SQL語句的一個介面。但是執行前會對SQL語句進行預編譯的操作,然後就開始執行SQL語句,並把結果賦值給pstmt。conn的意思是一個資料庫連接。

PreparedStatement是Statement的子介面,表示預編譯的 SQL 語句的對象,SQL 語句被預編譯並存儲在PreparedStatement對象中。然後可以使用此對象多次高效地執行該語句。如果有參數的話還需要添加輸入的參數。

(4)什麼是java預編譯sql擴展閱讀:

資料庫建立連接的五大步驟:

1、載入(注冊)資料庫

裝載驅動程序只需要非常簡單的一行代碼。例如,你想要使用 JDBC-ODBC 橋驅動程序,可以用下列代碼裝載它:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")。

你的驅動程序文檔將告訴你應該使用的類名。例如, 如果類名是 jdbc.DriverXYZ ,你將用代碼以下的代碼裝載驅動程序:Class.forName("jdbc.DriverXYZ")。

你不需要創建一個驅動程序類的實例並且用 DriverManager 登記它,因為調用 Class.forName 將自動將載入驅動程序類。載入 Driver 類後,它們即可用來與資料庫建立連接。

2 、建立鏈接

第二步就是用適當的驅動程序類與 DBMS 建立一個連接。下列代碼是一般的做法:

Connection con = DriverManager.getConnection(url,"myLogin","myPassword")

3 、執行SQL語句

我們使用 executeUpdate 方法是因為在 createTableCoffees 中的 SQL 語句是 DDL (數據定義語言)語句。創建表,改變表,刪除表都是 DDL 語句的例子,要用 executeUpdate 方法來執行。

4、 處理結果集

5 、關閉資料庫

參考資料來源:網路-Java資料庫連接

E. 在java.sql包含哪些介面

(1) Statement —— SQL語句執行介面
Statement介面代表了一個資料庫的狀態,在向資料庫發送相應的SQL語句時,都需要創建Statement介面或者PreparedStatement介面。在具體應用中,Statement主要用於操作不帶參數(可以直接運行)的SQL語句,比如刪除語句、添加或更新。

(2) PreparedStatement —— SQL語句預編譯介面
PreparedStatement也執行相應的SQL語句。它繼承於Statement介面,除了具備Statement所有功能,還可以對SQL語句進行預處理。
主要方法:
① ResultSet executeQuery() throws SQLException
在此 PreparedStatement 對象中執行 SQL 查詢,並返回該查詢生成的 ResultSet 對象。從不返回 null;如果發生資料庫訪問錯誤或者 SQL 語句沒有返回ResultSet 對象則拋出SQLException異常。

② int executeUpdate() throws SQLException
在此 PreparedStatement 對象中執行 SQL 語句,該語句必須是一個 SQL INSERT、UPDATE 或 DELETE 語句;或者是一個什麼都不返回的 SQL 語句,比如 DDL 語句。
返回值int表示影響的記錄條數,一條都沒有則返回0;

③ boolean execute()throws SQLException
在此 PreparedStatement 對象中執行 SQL 語句,該語句可以是任何種類的 SQL 語句。
有結果集則返回true, 沒有結果集則返回false;
④各種set方法
將指定位置的參數設置為指定的類型。比如ps.setString(3, 「tarena」);

(3) ResultSet —— 結果集操作介面
ResultSet介面是查詢結果集介面,它對返回的結果集進行處理。ResultSet是程序員進行JDBC操作的必需介面。

(4) ResultSetMetaData —— 元數據操作介面
ResultSetMetaData是對元數據進行操作的介面,可以實現很多高級功能。Hibernate運行資料庫的操作,大部分都是通過此介面。可以認為,此介面是SQL查詢語言的一種反射機制。ResultSetMetaData介面可以通過數組的形式,遍歷資料庫的各個欄位的屬性,對於我們開發者來說,此機制的意義重大。

JDBC通過元數據(MetaData)來獲得具體的表的相關信息,例如,可以查詢資料庫中有哪些表,表有哪些欄位,以及欄位的屬性等。MetaData中通過一系列getXXX將這些信息返回給我們。
資料庫元數據 Database MetaData 使用connection.getMetaData()獲得
MetaData包括: 包含了關於資料庫整體元數據信息。
結果集元數據 Result Set MetaData 使用resultSet.getMetaData()獲得
比較重要的是獲得表的列名、列數等信息。
元數據對象:ResultSetMetaData meta = rs.getMetaData();
 欄位個數:meta.getColomnCount();
 欄位名字:meta.getColumnName();
 欄位JDBC類型:meta.getColumnType();
 欄位資料庫類型:meta.getColumnTypeName();

F. Java預編譯SQL in怎麼賦值

sqlin使用方法:
1.in後條件不多,可以考慮主表建索引,或用unionall代替
2.in和exists的區別:如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in,反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是性能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關系了,另外IN時不對NULL進行處理。
3.如果in後接幾百幾千或幾萬的條件,可把in里的條件錄入臨時表,給臨時表加索引,用表連接代替。

熱點內容
為什麼安卓手機不能裝鴻蒙應用 發布:2024-11-17 06:37:11 瀏覽:603
圖的鄰接表存儲 發布:2024-11-17 06:35:43 瀏覽:610
密碼去等於多少 發布:2024-11-17 06:30:08 瀏覽:979
行李箱忘記密碼用什麼開箱比較快 發布:2024-11-17 06:26:59 瀏覽:830
編程第一天 發布:2024-11-17 06:22:28 瀏覽:597
安卓媒體存儲器 發布:2024-11-17 06:22:26 瀏覽:13
怎麼做windows伺服器集群 發布:2024-11-17 06:19:59 瀏覽:694
php的ide 發布:2024-11-17 06:19:56 瀏覽:397
如何啟用安卓鍵盤 發布:2024-11-17 06:19:14 瀏覽:514
電腦電池怎麼配置 發布:2024-11-17 06:17:47 瀏覽:10