JDBC,DriverManager,Connection,Statement,ResultSet,sql的注入和防止
1、JDBC的簡介
1.1 jdbc:Java DataBase Connectivity,java資料庫的連線 1.2 比如有一臺電腦,想在電腦上安裝顯示卡,需要顯示卡的驅動,由顯示卡生產廠商提供 1.3 要想使用java對資料庫進行操作,需要使用由資料庫提供的資料庫驅動 1.4 一個程式,使用java操作資料庫,掌握java程式碼,除了掌握java程式碼之外,需要掌握資料庫驅動的程式碼, 很多的資料庫,比如mysql、oracle,對於程式設計師來講,需要掌握每種資料庫的程式碼,對於程式設計師壓力很大 1.5 sun公司針對這種情況,開發出一套標準介面,各個資料庫只需要實現這個介面就可以了,程式設計師只需要掌握這套 介面就可以了,這套標準的介面就是jdbc 1.6 如果想要使用jdbc對資料庫進行操作,首先安裝資料庫的驅動,不同的資料庫提供驅動使用jar的形式提供的, 需要把jar包放到專案裡面,相當於安裝了資料庫的驅動。 1.7 匯入jar到專案中(使用到開發工具 myeclipse10.x版本) 首先建立一個資料夾 lib,把jar包複製到lib裡面,選中jar包右鍵點選build path -- add to build path, jar包前面的圖示變成了“奶瓶”圖示,表示匯入jar成功
2、JDBC的入門案例
2.1 使用jdbc對資料庫進行操作步驟是固定的 2.1.1 使用到類和介面 DriverManager Connection Statement ResultSet 2.2 jdbc的操作步驟 第一步,載入資料庫的驅動 DriverManager裡面registerDriver(Driver driver) 第二步,建立與資料庫的連線 DriverManager裡面getConnection(String url, String user, String password) 第三步,編寫sql語句 第四步,執行sql語句 Statement裡面executeQuery(String sql) 第五步,釋放資源(關閉連線) 2.3 使用jdbc實現查詢的操作 2.3.1 程式碼 public static void main(String[] args) throws Exception { //載入驅動 DriverManager.registerDriver(new Driver()); //建立連線 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb2", "root", "root"); //編寫sql String sql = "select * from user"; //執行sql //得到statement Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); //遍歷結果集得到每條記錄 while(rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); int chinese = rs.getInt("chinese"); int english = rs.getInt("english"); System.out.println(id+" ::"+username+" :: "+chinese+" :: "+english); } //釋放資源 rs.close(); stmt.close(); conn.close(); }
3、jdbc的DriverManager物件
3.1 在java.sql包裡面 3.2 載入資料庫的驅動 registerDriver(Driver driver) :引數是資料庫的驅動,這個驅動是由資料庫提供的 (1)這個方法在實際開發中,一般不使用,因為這個方法會載入驅動兩次 (2)一般在開發中使用反射的方式載入資料庫的驅動 Class.forName("com.mysql.jdbc.Driver"); 3.3 得到資料庫的連線 getConnection(String url, String user, String password),返回Connection (1)有三個引數 第一個引數:表示要連線的資料庫 寫法:jdbc:mysql://資料庫的ip:資料庫的埠號/連線的資料庫的名稱 jdbc:mysql://localhost:3306/testdb2 簡寫的方式:jdbc:mysql:///testdb2(使用範圍:連線的資料庫是本機,埠是3306) 第二個引數:表示連線資料庫的使用者名稱 第三個引數:表示連線資料庫使用者密碼
4、jdbc的Connection物件
4.1 代表資料庫的連線,是介面,在java.sql包裡面
4.2 建立statement物件
Statement createStatement()
4.3 建立預編譯物件 PreparedStatement
PreparedStatement prepareStatement(String sql)
5、jdbc的Statement物件
5.1 執行sql的物件,介面,在java.sql包裡面
5.2 執行查詢操作方法
ResultSet executeQuery(String sql) ,返回查詢的結果集
5.3 執行增加 修改 刪除的方法
int executeUpdate(String sql) ,返回成功的記錄數
5.4 執行sql語句的方法
boolean execute(String sql) ,返回是布林型別,如果執行的是查詢的操作返回true,否則返回的false
5.5 執行批處理的方法
addBatch(String sql):把多個sql語句放到批處理裡面
int[] executeBatch():執行批處理裡面的所有的sql
6、jdbc的ResultSet物件
6.1 代表查詢之後返回的結果,介面,在java.sql包裡面
類似於使用select語句查詢出來的表格
6.2 遍歷結果集
next()
6.3 得到資料的具體值
getXXX
(1)比如資料是string型別,使用getString("欄位的名稱")
比如資料是int型別,使用getInt("欄位的名稱")
比如不知道資料的型別,使用getObject("欄位的名稱")
6.4 結果集的遍歷方式
在最開始的時候在第一行之前,當執行了next方法之後,一行一行的向下進行遍歷
,在預設的情況下,只能向下,不能向上,在遍歷出來的結果也是不能修改的
7、jdbc的釋放資源
7.1 關閉的原則:誰最先開啟,誰最後關閉
7.2 關閉資源的規範的寫法
finally {
//釋放資源
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
8、使用jdbc進行crud操作
(1)實現對資料庫表記錄進行查詢的操作
* executeQuery(sql)
(2)實現對資料庫表記錄進行增加的操作
* executeUpdate(sql)
(3)實現對資料庫表記錄進行修改的操作
* executeUpdate(sql)
(4)實現對資料庫表記錄進行刪除的操作
* executeUpdate(sql)
9、jdbc工具類的封裝
9.1 當在很多的類裡面有相同的程式碼,可以把相同的程式碼提取到一個工具類裡面,
在類裡面直接呼叫工具類裡面的方法實現
9.2 在jdbc實現crud操作的程式碼裡面,首先得到資料庫連線,和釋放資源的程式碼是重複的,所以進行封裝
9.3 可以把資料庫的一些資訊,寫到配置檔案裡面,在工具類讀取配置檔案得到內容
一般使用properties格式檔案作為儲存資料庫資訊的檔案
有兩種方式讀取配置檔案
第一種,使用properties類
(1)程式碼
//建立properties物件
Properties p = new Properties();
//檔案的輸入流
InputStream in = new FileInputStream("src/db.properties");
//把檔案的輸入流放到物件裡面
p.load(in);
String drivername = p.getProperty("drivername");
String url = p.getProperty("url");
String username = p.getProperty("username");
String password = p.getProperty("password");
第二種,使用ResourceBundle類
* 使用範圍:首先讀取的檔案的格式需要時properties,檔案需要放到src下面
(1)程式碼
String drivername = ResourceBundle.getBundle("db").getString("drivername");
String url = ResourceBundle.getBundle("db").getString("url");
String username = ResourceBundle.getBundle("db").getString("username");
String password = ResourceBundle.getBundle("db").getString("password");
9.4 程式碼
public static String drivername;
public static String url;
public static String username;
public static String password;
//在類載入時候,執行讀取檔案的操作
static {
drivername = ResourceBundle.getBundle("db").getString("drivername");
url = ResourceBundle.getBundle("db").getString("url");
username = ResourceBundle.getBundle("db").getString("username");
password = ResourceBundle.getBundle("db").getString("password");
}
10、使用jdbc的工具類實現crud操作
11、sql的注入和防止
11.1 模擬登入的效果
(1)登入的實現的步驟
首先,輸入使用者名稱和密碼
第二,拿到輸入的使用者名稱和密碼,到資料庫裡面進行查詢,如果使用者名稱和密碼都正確,才表示登入成功;
但是如果使用者名稱和密碼,有一個是錯誤的,表示登入失敗。
11.2 演示sql的注入
(1)在登入時候,使用者名稱裡面輸入 bbb' or '1=1,因為在表裡面有一個使用者是bbb,可以登入成功
因為輸入的內容,被作為sql語句的一個條件,而不是作為整個使用者名稱。
select * from user where username='bbb' or '1=1' and password='rrr'
11.3 防止sql的注入
(1)使用PreparedStatement預編譯物件防止sql注入
(2)建立PreparedStatement物件 prepareStatement(String sql)
(3)PreparedStatement介面的父介面Statement
(4)什麼是預編譯
(5)步驟:
第一步,載入驅動,建立資料庫的連線
第二步,編寫sql
第三步,需要對sql進行預編譯
第四步,向sql裡面設定引數
第五步,執行sql
第六步,釋放資源
(6)程式碼
//使用工具類得到資料庫的連線
conn = MyJdbcUtils.getConnection();
//編寫sql
String sql = "select * from user where username=? and password=?";
//對sql進行預編譯
psmt = conn.prepareStatement(sql);
//設定引數
psmt.setString(1, username);
psmt.setString(2, password);
//執行sql
rs = psmt.executeQuery();
if(rs.next()) {
System.out.println("login success");
} else {
System.out.println("fail");
}
12、使用PreparedStatement預編譯物件實現crud的操作
注意地方:
第一,編寫sql時候,引數使用?表示(佔位符)
第二,預編譯sql,設定引數的值,執行sql
12.1 使用PreparedStatement預編譯物件實現查詢的操作
(1)預編譯物件executeQuery()執行查詢語句
12.2 使用PreparedStatement預編譯物件實現增加的操作
(1)預編譯物件executeUpdate()執行增加的語句
12.3 使用PreparedStatement預編譯物件實現修改的操作
(1)預編譯物件executeUpdate()執行修改的語句
12.4 使用PreparedStatement預編譯物件實現刪除的操作
(1)預編譯物件executeUpdate()執行刪除的語句
相關推薦
JDBC,DriverManager,Connection,Statement,ResultSet,sql的注入和防止
1、JDBC的簡介 1.1 jdbc:Java DataBase Connectivity,java資料庫的連線 1.2 比如有一臺電腦,想在電腦上安裝顯示卡,需要顯示卡的驅動,由顯示卡生產廠商
JDBC預處理物件PreprareStatement,預防SQL注入問題,提高安全性
PreparedStatement介面是Statement的子介面,它直接繼承並重載了Statement的方法。 PreprareStatement預處理物件為什麼能預防SQL注入提高安全性呢? 因為SQL語句在程式執行前已經進行了預編譯,在程式執行時第一次操作資料庫之前,SQL語
SQL注入,PreparedStatement和Statement
程式碼區 還是一個工具類 程式碼: package cn.itcats.jdbc; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLE
問題雜談:解決連線MySQL資料庫,執行緒休眠導致過滿的問題,“too Many Connection”
在開發Web應用時,可以自行處理資料連線,也可以交由所使用的Web框架管理。前段時間有人問我,為什麼自己已經將的資料連線事務交由Spring管理了,但在使用過程中還是總是出現“too Many Connection”的報錯。我在解決過程中發現了一些值得注意的地方,所以在這總結
Nodemanager 自動關閉,報錯Connection refused
啟動nodemanager報錯 INFO org.apache.hadoop.service.AbstractService: Service NodeManager failed in state
xshell無法連線,Xftp無法連線,ping可以通,connection closed by foreign host,時連時斷
問題描述: xshell無法連線,或者有時可以連線,有時不可連線 Xftp無法連線 ping可以通 就算連線上,也一會就斷,並提示 connection closed by foreign host 問題原因:伺服器ip衝突
玩轉JDBC打造資料庫操作萬能工具類JDBCUtil,加入了高效的資料庫連線池,利用了引數繫結有效防止SQL注入
SELECT * FROM emp_test 成功查詢到了14行資料 第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=張無忌}
IIS7 win64位作業系統,提示ADODB.Connection 錯誤 '800a0e7a' 。server.urlencode;server.htmlencode
IIS7 win64位作業系統,提示ADODB.Connection 錯誤 '800a0e7a' 由於64位作業系統不支援Microsoft OLE DB Provider for Jet驅動程杏爆也不支援更早的Microsoft Access Driver (*.mdb
關於jdbc 增刪改通用的方法,只需要傳sql語句和查詢條件
//第二個引數為給佔位符賦值,可以理解為一個數組 //例如executeUpdate("select *from user where id=? and pwd =?","admin","123") public int executeUpdate(String sql,O
JDBC學習筆記 MySQL的使用(建立表,插入查詢以及刪除)
1.建立資料庫 create database mydata; 2.連線資料庫 只有連線了才能在這個資料庫下建立表(不然不知道建哪裡去了) use mydata; 3.建立表 create table person( number int(11),
Error code 10053,Software caused connection abort.總結
發現問題的應用場景 C/S結構程式,請求響應採用非同步機制。即客戶端傳送一個請求後不是一直等待這個結果,客戶端將請求存放在請求佇列並獲得一個JOBID,伺服器執行後將執行結果存放在響應佇列,客戶端定時檢視響應佇列,根據JOBID定時從響應佇列中獲取結果。因此帶來的測試問
JDBC學習之路(三)防止SQL注入,PreparedStatement探索
現在登入註冊或者其他很多地方遇到使用者輸入的內容可以直接拿到資料庫內部去進行執行SQL語句,這個是一項很危險的運動,因為你不知道使用者會輸入什麼,如果使用者對SQL語句很熟悉,他就可以在輸入的時候加上''兩個冒號作為特殊字元,這樣的話會讓計算機認為他輸入的是SQL語句
批量插入 jdbc 把i格式化成num位的字串,不足的位補0;
@Override public void addBillDetail(FmBillMainEntity fmBillMain) { // 新增單據 int startNum = Integer.parseInt(fmBillMain.getStartNum(
JDBC對事務的使用(包括自動提交,回滾等知識)
首先得清楚什麼時候使用事務。 當你需要一次執行多條SQL語句時,可以使用事務。通俗一點說,就是,如果這幾條SQL語句全部執行成功,則才對資料庫進行一次更新,如果有一條SQL語句執行失敗,則這幾條SQL語句全部不進行執行,這個時候需要用到事務。 其次才是事務的具體使
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 找不到jar包的問題,路徑問題
驅動 -c 找到 查找 找不到 查找字符串 https 問題 not 1、參考連接: https://blog.csdn.net/huangbiao86/article/details/6428608 折騰了一上午,找到了這錯誤的原因。哎…&helli
sharding-jdbc 分庫分表的 4種分片策略,還蠻簡單的
上文[《快速入門分庫分表中介軟體 Sharding-JDBC (必修課)》](https://mp.weixin.qq.com/s?__biz=MzAxNTM4NzAyNg==&mid=2247488500&idx=1&sn=108bf704a54b0a9638e84698deb3ce4c&chksm=9b8
十四.nginx,web,反向代理,調用加權輪詢算法,nfs服務
文件夾 是否 觀察 查看 方式 har sys 重新啟動 chm 一.部署nginx反向代理web服務,調度算法使用加權輪詢: 1.首先配置一個nginx服務端,三個web客戶端。用vmware 新建虛擬機完成,並用xshell連接 2.在服務端和3個web客戶端都下載e
如果父類中有構造函數,並且構造函數有參數,而子類沒有,因為子類繼承了這個構造函數,那麽創建子類對象的時候,要傳參
bsp class nbsp 參數 int init log ini elf 1 class a(): 2 def __init__(self,aa): 3 self.aa = aa 4 class b(a): 5 def do(self)
梯有N階,上樓可以一步上一階,也可以一步上二階。編寫一個程序,計算共有多少中不同的走法?
技術 告訴 不同的 mis misc 技術分享 blog main print c語言實現,小夥伴們誰要有更好的實現方法,要告訴我呦 #include int main(void) { int f,i,f1=1,f2=2; printf("請輸入樓梯數"); scanf(
02_創建Git倉庫,克隆倉庫,git add,git commit,git push,git pull,同行沖突,不同行沖突的結局方案,git mergetool的使用
round rom weight art sdn automatic remote then config 1 創建Git資源庫,殘酷文件夾信息 創建git資源庫的命令: git init –bare 倉庫名稱 (當中-bare表示的意思是空的庫的意思)