文章目錄 1. 數據庫驅動 2. JDBC 3. 第一個JDBC程序 4. statement對象 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 . * ;
public class JdbcFirstDemo {
public static void main
( String
[ ] args
) throws ClassNotFoundException
, SQLException {Class
. forName
( "com.mysql.jdbc.Driver" ) ; String url
= "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true" ; String username
= "root" ; String password
= "123456" ; Connection connection
= DriverManager
. getConnection
( url
, username
, password
) ; Statement statement
= connection
. createStatement
( ) ; 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
( "==================================" ) ; }resultSet
. close ( ) ; statement
. close ( ) ; connection
. close ( ) ; }
}
Class
. forName
( "com.mysql.jdbc.Driver" ) ;
Connection connection
= DriverManager
. getConnection
( url
, username
, password
) ;
connection
. rollback ( ) ;
connection
. commit ( ) ;
connection
. setAutoCommit
( ) ;
String url
= "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true" ;
Statement 執行SQL 的對象 PrepareStatement 執行SQL 的對象
String
sql = "SELECT * FROM users" ; statement
. executeQuery
( ) ;
statement
. execute ( ) ;
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 ) ;
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 ( ) ) {
}
(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" ) ; 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
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
( ) ; 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
) ; }}
}
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
( ) ; 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
) ; }}
}
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
( ) ; 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
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
( ) ; String
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
( " '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
( ) ; 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 ) ; st
. setInt
( 1 , 4 ) ; st
. setString
( 2 , "xiaopang" ) ; st
. setString
( 3 , "1232112" ) ; st
. setString
( 4 , "24734673@qq.com" ) ; 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 ) ; 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 ) ; 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 = ?" ; st
= 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
( "'' 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
( ) ; String
sql = "select * from users where `NAME`=? and `PASSWORD`=?" ; st
= 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对象 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。