JDBC API 学习
生活随笔
收集整理的這篇文章主要介紹了
JDBC API 学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前情提要:MySQL數據庫驅動JDBC實操隨筆(附文件)_年關的博客-CSDN博客
目錄
一、DriverManager
二、ResultSet
?編輯
三、?Statement
四、做個登陸驗證(假的-都是假的)
演示sql注入
演示PreparedStatement預編譯防止sql注入
咱們使用@Test注解進行測試,沒有環境的自己裝一下或者改一下代碼
一、DriverManager
DriverManager在java.sql這個包里面,管理一組 JDBC 驅動程序的基本服務
先看DriverManager經典使用場景
作用:1、管理和注冊驅動
? ? ? ? ? ? ? ? 2、創建數據庫連接
功能:就是類中的方法:registerDriver和getConnection 1.registerDriver注冊驅動:告訴程序該使用哪一個數據庫驅動jar static void registerDriver(Driver driver)//注冊與給定的驅動程序DriverManager寫的代碼使用: Class.forName("com.mysql.jdbc.Driver"); 通過查看源碼發現:在com.mysql.jdbc.Driver類中存在靜態代碼塊Static {try{java.sql.DriverManager.registerDriver(new Driver);}catch (SQLException E){throw new RuntimeException("Can't register driver!");} } 注意的是:在mysql5之后的驅動jar包可以省略注冊驅動的步驟2.getConnection獲取數據庫連接方法:static Connection getConnection(String url,String username,String password)參數:url:指定連接的路徑語法:jdbc:mysql://ip地址(域名):端口號/數據庫名稱例子:jdbc:mysql://localhost:3306/employee細節:如果連接是本機Mysql服務器,并且默認的端口是3306,則url可以 簡寫為:jdbc:mysql:///數據庫名二、ResultSet
從數據庫獲取返回結果集,用于查詢語句
@Testpublic void ResultSet1() throws Exception {//1、注冊驅動Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://192.168.5.222:3306/test";//這里的192.168.5.222:3306指的是我mysql服務器的ip如果是本機的mysql的話用下面這段//String url="jdbc:mysql://127.0.0.1:3306/test";//test指的是所需要用的數據庫系統中的具體某一個數據庫String username="root";String password="123456";//數據庫的賬號密碼Connection conn= DriverManager.getConnection(url,username,password);//sqlString sql="select * from sjj";//4獲取執行sql的對象Statement stmt=conn.createStatement();//6.執行查詢,得到ResultSetResultSet resultSet=stmt.executeQuery(sql);//處理ResultSetSystem.out.println("book_id\t|\tbook_name");System.out.println(resultSet);while(resultSet.next()) {int id = resultSet.getInt(1);String name = resultSet.getString("name");System.out.print(id +"\t\t\t");System.out.print(name +"\n");}resultSet.close();stmt.close();conn.close();}@Test/** 查詢數據將數據存放到sjj對象中* 1 定義實體類sjj* 2 查詢數據,封裝到sjj* 將Account對象存到ArrayList對象中去* */public void ResultSet2() throws Exception {//1、注冊驅動Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://192.168.5.222:3306/test";//這里的192.168.5.222:3306指的是我mysql服務器的ip如果是本機的mysql的話用下面這段//String url="jdbc:mysql://127.0.0.1:3306/test";//test指的是所需要用的數據庫系統中的具體某一個數據庫String username="root";String password="123456";//數據庫的賬號密碼Connection conn= DriverManager.getConnection(url,username,password);//sqlString sql="select * from sjj";//4獲取執行sql的對象Statement stmt=conn.createStatement();//6.執行查詢,得到ResultSetResultSet resultSet=stmt.executeQuery(sql);//處理ResultSetSystem.out.println("book_id\t|\tbook_name");//創建集合存放sjj對象List<sjj> list=new ArrayList<>();System.out.println(resultSet);while(resultSet.next()) {sjj sjj=new sjj();int id = resultSet.getInt(1);String name = resultSet.getString("name");System.out.print(id +"\t\t\t");System.out.print(name +"\n");sjj.setId(id);sjj.setName(name);list.add(sjj);}System.out.println(list);resultSet.close();stmt.close();conn.close();}?這里我們需要創建一個和實體類來存放數據
package pojo;public class sjj {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "sjj{" +"id=" + id +", name='" + name + '\'' +'}';} }三、?Statement
可以用于執行DML DDL DQL語句
package JDBC_API;import org.testng.annotations.Test;import java.sql.*;//Statement public class JDbc4_Statement {/*執行dml語句*/@Test/*測試方法*/public void testDML() throws Exception {////1、注冊驅動Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://192.168.5.222:3306/test";String username="root";String password="123456";Connection conn= DriverManager.getConnection(url,username,password);//sqlString sql="update sjj set id=10 where id=5";//4獲取執行sql的對象Statement stmt=conn.createStatement();//6.執行sqlint count=stmt.executeUpdate(sql);System.out.println(count);stmt.close();conn.close();}@Testpublic void jdbcDDL() throws Exception{//1、注冊驅動Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://192.168.5.222:3306/test";String username="root";String password="123456";Connection conn= DriverManager.getConnection(url,username,password);//sqlString sql="create database db2";//4獲取執行sql的對象Statement stmt=conn.createStatement();//6.執行sql 、、DDL語句返回值不再是數字。所以下面的方法注釋掉try {stmt.executeUpdate(sql);System.out.println("執行成功");} catch (Exception e) {System.out.println("執行失敗");throw new RuntimeException(e);} // if(count>0){ // System.out.println("執行成功"); // }else { // System.out.println("執行失敗"); // }stmt.close();conn.close();} }四、做個登陸驗證(假的-都是假的)
咱們這里用書籍id和名字做賬號密碼測試
//做個登錄驗證@Testpublic void ResultSet1() throws Exception {//1、注冊驅動Class.forName("com.mysql.cj.jdbc.Driver");String url="jdbc:mysql://192.168.5.222:3306/test";//這里的192.168.5.222:3306指的是我mysql服務器的ip如果是本機的mysql的話用下面這段//String url="jdbc:mysql://127.0.0.1:3306/test";//test指的是所需要用的數據庫系統中的具體某一個數據庫String username="root";String password="123456";//數據庫的賬號密碼Connection conn= DriverManager.getConnection(url,username,password);//接收用戶名和密碼String Username="仙逆";String pwd="6";String sql="select * from sjj where name='"+Username+"' and id="+pwd+"";System.out.println(sql);//獲取sql對象Statement stmt=conn.createStatement();//執行sql語句ResultSet rs=stmt.executeQuery(sql);//判斷登陸是否成功if(rs.next()){System.out.println("登陸成功");}else {System.out.println("登陸失敗");}//釋放資源rs.close();stmt.close();conn.close();}?結果
select * from sjj where name='仙逆' and id=6 登陸成功=============================================== Default Suite Total tests run: 1, Passes: 1, Failures: 0, Skips: 0 ===============================================進程已結束,退出代碼0演示sql注入
//演示sql注入@Testpublic void login_Inject() throws Exception {//1、注冊驅動Class.forName("com.mysql.cj.jdbc.Driver");String url="jdbc:mysql://192.168.5.222:3306/test";//這里的192.168.5.222:3306指的是我mysql服務器的ip如果是本機的mysql的話用下面這段//String url="jdbc:mysql://127.0.0.1:3306/test";//test指的是所需要用的數據庫系統中的具體某一個數據庫String username="root";String password="123456";//數據庫的賬號密碼Connection conn= DriverManager.getConnection(url,username,password);//接收用戶名和密碼String Username="xcxcxcc";//一個不存在的賬號String pwd="'' or '1'='1'";String sql="select * from sjj where name='"+Username+"' and id="+pwd+"";System.out.println(sql);//獲取sql對象Statement stmt=conn.createStatement();//執行sql語句ResultSet rs=stmt.executeQuery(sql);//判斷登陸是否成功if(rs.next()){System.out.println("登陸成功");}else {System.out.println("登陸失敗");}//釋放資源rs.close();stmt.close();conn.close();}結果注入成功
select * from sjj where name='xcxcxcc' and id='' or '1'='1' 登陸成功=============================================== Default Suite Total tests run: 1, Passes: 1, Failures: 0, Skips: 0 ===============================================進程已結束,退出代碼0日志
演示PreparedStatement預編譯防止sql注入
在這里說明一下,只是使用這個方法的話僅有防注入功能,如果真的通過預編譯提升性能請在連接url參數里設置打開!!!!!
//演示PreparedStatement預編譯防止sql注入@Testpublic void login_Inject2() throws Exception {//1、注冊驅動Class.forName("com.mysql.cj.jdbc.Driver");//useServerPrepStmts=true開啟預編譯功能String url="jdbc:mysql://192.168.5.222:3306/test?useServerPrepStmts=true";//這里的192.168.5.222:3306指的是我mysql服務器的ip如果是本機的mysql的話用下面這段//String url="jdbc:mysql://127.0.0.1:3306/test";//test指的是所需要用的數據庫系統中的具體某一個數據庫String username="root";String password="123456";//數據庫的賬號密碼Connection conn= DriverManager.getConnection(url,username,password);//接收用戶名和密碼String Username="xcxcxcc";//一個不存在的賬號String pwd="'' or '1'='1'";String sql="select * from sjj where name=? and id=?";System.out.println(sql);//獲取sql對象PreparedStatement pstmt=conn.prepareStatement(sql);pstmt.setString(1,Username);pstmt.setString(2,pwd);ResultSet rs=pstmt.executeQuery();//運行時不再需要寫語句//判斷登陸是否成功if(rs.next()){System.out.println("登陸成功");}else {System.out.println("登陸失敗");}//釋放資源rs.close();pstmt.close();conn.close();}運行結果:
select * from sjj where name=? and id=? 登陸失敗=============================================== Default Suite Total tests run: 1, Passes: 1, Failures: 0, Skips: 0 ===============================================改回來用戶名和密碼
//接收用戶名和密碼String Username="仙逆";//一個不存在的賬號String pwd="6";數據庫預編譯,自己查查吧
select * from sjj where name=? and id=? 登陸成功=============================================== Default Suite Total tests run: 1, Passes: 1, Failures: 0, Skips: 0 ===============================================進程已結束,退出代碼0日志多了一個預編譯狀態
在這里如果我們保持語句不變的情況下更改參數進行多次sql查詢
?數據庫將會復用曾經的預編譯,以此減少性能開銷
總結
以上是生活随笔為你收集整理的JDBC API 学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Outlook关闭时最小化到任务栏的完美
- 下一篇: 按计算机应用领域分类 情报检索系统属于,