日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDBC(一)——statement对象、PreparedStatement对象

發布時間:2025/3/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC(一)——statement对象、PreparedStatement对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. 數據庫驅動
  • 2. JDBC
  • 3. 第一個JDBC程序
  • 4. statement對象
    • 4.1 簡述
    • 4.2 CRUD操作
    • 4.3 代碼實現
  • 5. PreparedStatement對象

1. 數據庫驅動

驅動:聲卡,顯卡、數據庫

我們的程序會通過 數據庫 驅動,和數據庫打交道!

2. JDBC

Java數據庫連接(Java Database Connectivity,簡稱JDBC)是Java語言中用來規范客戶端程序如何來訪問數據庫的應用程序接口,提供了諸如查詢和更新數據庫中數據的方法。
這些規范的實現由具體的廠商去做
對于開發人員來說,我們只需要掌握 JDBC 接口的操作即可

3. 第一個JDBC程序

(1)SQLyog中創建測試數據庫

CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci; USE jdbcStudy; CREATE TABLE users( id INT PRIMARY KEY, NAME VARCHAR(40), PASSWORD VARCHAR(40), email VARCHAR(60), birthday DATE );INSERT INTO users(id,NAME,PASSWORD,email,birthday) VALUES(1,'zhansan','123456','zs@sina.com','1980-12-04'), (2,'lisi','123456','lisi@sina.com','1981-12-04'), (3,'wangwu','123456','wangwu@sina.com','1979-12-04');


(2)IDEA中創建項目
①創建一個普通項目
②導入數據庫驅動

③編寫測試代碼

package com.kuang.lesson01;import java.sql.*;// 我的第一個JDBC程序 public class JdbcFirstDemo {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1. 加載驅動// DriverManager.registerDriver(new com.mysql.jdbc.Driver());Class.forName("com.mysql.jdbc.Driver"); // 固定寫法,加載驅動//2. 用戶信息和url// useUnicode=true&characterEncoding=utf8&useSSL=trueString url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";String username = "root";String password = "123456";//3. 連接成功,數據庫對象 Connection 代表數據庫Connection connection = DriverManager.getConnection(url, username, password);//4. 執行SQL的對象 Statement 執行sql的對象Statement statement = connection.createStatement();//5. 執行SQL的對象 去 執行SQL,可能存在結果,查看返回結果String sql = "SELECT * FROM users";ResultSet resultSet = statement.executeQuery(sql); //返回的結果集,結果集中封裝了我們全部的查詢出來的結果while (resultSet.next()){System.out.println("id=" + resultSet.getObject("id"));System.out.println("name=" + resultSet.getObject("NAME"));System.out.println("pwd=" + resultSet.getObject("PASSWORD"));System.out.println("email=" + resultSet.getObject("email"));System.out.println("birth=" + resultSet.getObject("birthday"));System.out.println("==================================");}//6、釋放連接resultSet.close();statement.close();connection.close();} }
  • 運行結果

  • 步驟總結
    ①加載驅動
    ②連接數據庫 DriverManager
    ③獲得執行sql的對象 Statement
    ④獲得返回的結果集
    ⑤釋放連接

  • DriverManager

// DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Class.forName("com.mysql.jdbc.Driver"); // 固定寫法,加載驅動 Connection connection = DriverManager.getConnection(url, username, password); // connection 代表數據庫 // 數據庫設置自動提交 // 事務提交 // 事務滾回 connection.rollback(); connection.commit(); connection.setAutoCommit();
  • URL
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true"; // mysql -- 3306 // 協議 : //主機地址:端口號/數據庫名?參數1&參數2&參數3 // oralce -- 1521 //jdbc:oracle:thin:@localhost:1521:sid
  • Statement 執行SQL 的對象 PrepareStatement 執行SQL 的對象
String sql = "SELECT * FROM users"; // 編寫SQL statement.executeQuery(); //查詢操作返回 ResultSet statement.execute(); // 執行任何SQL statement.executeUpdate(); // 更新、插入、刪除。都是用這個,返回一個受影響的行數
  • ResultSet 查詢的結果集:封裝了所有的查詢結果
    獲得指定的數據類型
resultSet.getObject(); // 在不知道列類型的情況下使用 // 如果知道列的類型就使用指定的類型 resultSet.getString(); resultSet.getInt(); resultSet.getFloat(); resultSet.getDate(); resultSet.getObject(); ....

遍歷,指針

resultSet.beforeFirst(); // 移動到最前面 resultSet.afterLast(); // 移動到最后面 resultSet.next(); //移動到下一個數據 resultSet.previous(); //移動到前一行 resultSet.absolute(row); //移動到指定行
  • 釋放資源
//6、釋放連接 resultSet.close(); statement.close(); connection.close(); // 耗資源,用完關掉!

4. statement對象

4.1 簡述

  • Jdbc中的statement對象用于向數據庫發送SQL語句,想完成對數據庫的增刪改查,只需要通過這個對象向數據庫發送增刪改查語句即可。
  • Statement對象的executeUpdate方法,用于向數據庫發送增、刪、改的語句,executeUpdate執行完后,將會返回一個整數(即增刪改語句導致了數據庫幾行數據發生了變化)。
  • Statement.executeQuery方法用于向數據庫發送查詢語句,executeQuery方法返回代表查詢結果的ResultSet對象。

4.2 CRUD操作

  • CRUD是指在做計算處理時的增加(Create)讀取(Read)更新(Update)刪除(Delete) 幾個單詞的首字母簡寫。CRUD主要被用在描述軟件系統中數據庫的基本操作功能。

(1)CRUD操作-create
使用executeUpdate(String sql)方法完成數據添加操作,示例操作:

Statement st = conn.createStatement(); String sql = "insert into user(….) values(…..) "; int num = st.executeUpdate(sql); if(num>0){ System.out.println("插入成功!!!");}

(2)CRUD操作-read
使用executeQuery(String sql)方法完成數據查詢操作,示例操作:

Statement st = conn.createStatement(); String sql = "select * from user where id=1"; ResultSet rs = st.executeQuery(sql); while(rs.next()){ //根據獲取列的數據類型,分別調用rs的相應方法映射到java對象中 }

(3)CRUD操作-update
使用executeUpdate(String sql)方法完成數據修改操作,示例操作:

Statement st = conn.createStatement(); String sql = "update user set name='' where name=''"; int num = st.executeUpdate(sql); if(num>0){ System.out.println(“修改成功!!!"); }

(4)CRUD操作-delete
使用executeUpdate(String sql)方法完成數據刪除操作,示例操作:

Statement st = conn.createStatement(); String sql = "delete from user where id=1"; int num = st.executeUpdate(sql); if(num>0){ System.out.println(“刪除成功!!!"); }

4.3 代碼實現

(1)在 src 下建立資源文件 db.properties

(2)提取工具類

import java.io.InputStream; import java.sql.*; import java.util.Properties;public class JdbcUtils {private static String driver = null;private static String url = null;private static String username = null;private static String password = null;static {try{InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");Properties properties = new Properties();properties.load(in);driver = properties.getProperty("driver");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");//1.驅動只用加載一次Class.forName(driver);} catch (Exception e) {e.printStackTrace();}}//獲取連接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, username, password);}//釋放連接資源public static void release(Connection conn, Statement st, ResultSet rs){if (rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if (conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}} }

(3)編寫增刪改的方法, executeUpdate

  • TestInsert(增)
import com.kuang.lesson02.utils.JdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class TestInsert {public static void main(String[] args) {Connection conn = null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection(); //獲取數據庫連接st = conn.createStatement(); //獲得SQL的執行對象String sql = "INSERT INTO users(id,`NAME`,`PASSWORD`,`email`,`birthday`)" +"VALUES(4,'dalao','123456','24736743@qq.com','2020-01-01')";int i = st.executeUpdate(sql);if (i>0){System.out.println("插入成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}} }

  • TestDelete(刪)
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class TestDelete {public static void main(String[] args) {Connection conn = null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection(); //獲取數據庫連接st = conn.createStatement(); //獲得SQL的執行對象String sql = "DELETE FROM users WHERE id = 2";int i = st.executeUpdate(sql);if (i>0){System.out.println("刪除成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}} }

  • TestUpdate(改)
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class TestUpdate {public static void main(String[] args) {Connection conn = null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection(); //獲取數據庫連接st = conn.createStatement(); //獲得SQL的執行對象String sql = "UPDATE users SET `NAME`='xiaohua',`email`='24736743@qq.com' WHERE id=1";int i = st.executeUpdate(sql);if (i>0){System.out.println("更新成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}} }


(3)查詢 executeQuery

  • TestSelect(查)
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestSelect {public static void main(String[] args) {Connection conn =null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();st = conn.createStatement();//SQLString sql = "select * from users where id = 1";rs = st.executeQuery(sql); //查詢完畢會返回一個結果集while (rs.next()){System.out.println(rs.getString("NAME"));}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}} }



(4)SQL 注入的問題
sql 存在漏洞,會被攻擊導致數據泄露SQL會被拼接 or

import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class SQL注入 {public static void main(String[] args) {// login("kuangshen","123456");login(" 'or '1=1"," 'or'1=1"); // 技巧}// 登錄業務public static void login(String username,String password){Connection conn =null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();st = conn.createStatement();// SELECT * FROM users WHERE `Name` = 'kuangshen' AND `password` = '123456';// SELECT * FROM users WHERE `Name` = '' or '1=1' AND `password` = '' or '1=1';String sql = "select * from users where `NAME`='"+username+"' AND `password` ='"+password+"'";rs = st.executeQuery(sql); //查詢完畢會返回一個結果集while (rs.next()){System.out.println(rs.getString("NAME"));System.out.println(rs.getString("password"));System.out.println("============================");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}} }

5. PreparedStatement對象

PreparedStatement 可以防止SQL注入,效率更好!
(1)新增

import java.sql.Connection; import java.util.Date; import java.sql.PreparedStatement; import java.sql.SQLException;public class TestInsert {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();// 區別// 使用? 占位符代替參數String sql = "insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`) values(?,?,?,?,?)";st = conn.prepareStatement(sql); //預編譯SQL,先寫sql,然后不執行// 手動給參數賦值st.setInt(1,4); //idst.setString(2,"xiaopang");st.setString(3,"1232112");st.setString(4,"24734673@qq.com");// 注意點: sql.Date 數據庫 java.sql.Date()// util.Date Java new Date().getTime() 獲得時間戳st.setDate(5,new java.sql.Date(new Date().getTime()));//執行int i = st.executeUpdate();if (i>0){System.out.println("插入成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,null);}} }


(2)刪除

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;public class TestDelete {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();// 區別// 使用? 占位符代替參數String sql = "delete from users where id=?";st = conn.prepareStatement(sql); //預編譯SQL,先寫sql,然后不執行// 手動給參數賦值st.setInt(1,4);//執行int i = st.executeUpdate();if (i>0){System.out.println("刪除成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,null);}} }


(3)更新

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;public class TestUpdate {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();// 區別// 使用? 占位符代替參數String sql = "update users set `NAME`=? where id=?;";st = conn.prepareStatement(sql); //預編譯SQL,先寫sql,然后不執行// 手動給參數賦值st.setString(1,"xiaohuang");st.setInt(2,1);//執行int i = st.executeUpdate();if (i>0){System.out.println("更新成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,null);}} }


(4)查詢

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class TestSelect {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();String sql = "select * from users where id = ?"; // 編寫SQLst = conn.prepareStatement(sql); // 預編譯st.setInt(1,2); //傳遞參數rs = st.executeQuery(); //執行if (rs.next()){System.out.println(rs.getString("NAME"));}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}} }


(5)防止SQL注入

import java.sql.*; public class SQL注入 {public static void main(String[] args) {// login("lisi","123456");login("'' or 1=1","123456"); //}// 登錄業務public static void login(String username,String password){Connection conn =null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();// PreparedStatement 防止SQL注入的本質,把傳遞進來的參數當做字符// 假設其中存在轉義字符,比如說 ' 會被直接轉義String sql = "select * from users where `NAME`=? and `PASSWORD`=?"; // Mybatisst = conn.prepareStatement(sql);st.setString(1,username);st.setString(2,password);rs = st.executeQuery(); //查詢完畢會返回一個結果集while (rs.next()){System.out.println(rs.getString("NAME"));System.out.println(rs.getString("password"));System.out.println("============================");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}} }

如下所示 查詢不到數據

總結

以上是生活随笔為你收集整理的JDBC(一)——statement对象、PreparedStatement对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。