文章目錄
1.JDBC概述
1.1 JDBC的概念
- JDBC: Java Database Connectivity sun公司爲了簡化和統一java連接數據庫,定義的一套規範。
- JDBC和數據庫驅動的關係:類似接口和接口的實現類, 通過驅動程序,java應用程序可與數據庫進行通信。
1.2 爲什麼要使用JDBC
- 沒有JDBC如下
- 有JDBC
2. 第一個jdbc程序
2.1 數據庫
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
nickname varchar(20)
);
INSERT INTO `USER` VALUES(null,'zhangsan','123','張三');
INSERT INTO `USER` VALUES(null,'lisi','1234','李四');
INSERT INTO `USER` VALUES(null,'wangwu','12345','王五');
2.2 代碼實現
package com.freedom.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
public class JdbcDemo {
@Test
public void testQuery() throws ClassNotFoundException, SQLException {
// 1. 註冊驅動驅動
// 加載字節碼文件,獲取的字節碼對象, 將字節碼文件加載到jvm中
Class.forName("com.mysql.jdbc.Driver");
// 2.建立連接
String url = "jdbc:mysql://localhost:3306/javaweb";
String user = "root";
String password = "258369";
Connection connection = DriverManager.getConnection(url, user, password);
// 3.獲取一個執行SQL的對象
Statement statement = connection.createStatement();
// 4.執行sql
String sql = "select * from user";
ResultSet rs = statement.executeQuery(sql);
// 5.獲取結果處理結果
while (rs.next()) {
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println("===");
}
// 6.關閉資源
rs.close();
statement.close();
connection.close();
}
}
3. JDBC API詳解
3.1 java.sql.Drivermanager
作用: 主要是用於加載驅動,並且創建和數據庫的連接
- java.sql.DriverManager.registerDriver(new Driver()),這種方式會兩次new Driver();
- Class.forName(“com.mysql.jdbc.Driver”);推薦這種寫法
- getConnection(String url, String user, String password) ;與數據庫建立連接
3.2 java.sql.Connection接口
接口的實現在數據庫驅動中。所有與數據庫交互都是基於連接對象的。
- createStatement() ;創建執行sql語句對象
- prepareStatement(String sql) ;創建預編譯執行sql語句的對象
3.3 java.sql.Statement接口
接口的實現在數據庫驅動中,操作sql語句,並返回相應結果對象。
- ResultSet executeQuery(String sql) 根據查詢語句返回結果集。只能執行select語句。
- int executeUpdate(String sql) 根據執行的DML(insert update delete)語句,返回受影響的行數。
- boolean execute(String sql) 此方法可以執行任意sql語句。返回boolean值,表示是否返回的是ResultSet結果集。僅當執行select語句,且有返回結果時返回true, 其它語句都返回false。
3.4 java.sql.ResultSet接口
封裝結果集,查詢結果表的對象
- 提供一個遊標,默認遊標指向結果集第一行之前。
- 調用一次next(),遊標向下移動一行。
- 提供一些getXXX方法。XXX代表的是數據類型
ResultSet接口常用API
- boolean next() ;將光標從當前位置向下移動一行。
- XXX getXXX(int columnIndex) : 根據列的序號獲取XXX類型的值,列的序號從1開始。
- XXX getXXX(String columnName) : 根據列名去獲取XXX類型的值。
- void close()關閉ResultSet 對象。
4. SQL注入問題解決:preparedStatement
package com.freedom.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
public class JdbcDemo {
@Test
public void testQuery() throws ClassNotFoundException, SQLException {
// 1. 註冊驅動驅動
// 加載字節碼文件,獲取的字節碼對象, 將字節碼文件加載到jvm中
Class.forName("com.mysql.jdbc.Driver");
// 2.建立連接
String url = "jdbc:mysql://localhost:3306/javaweb";
String user = "root";
String password = "258369";
Connection connection = DriverManager.getConnection(url, user, password);
// 3.預編譯sql
String sql = "select * from user where username=? and password=?";
PreparedStatement prepareStatement = connection.prepareStatement(sql);
String username = "zhangsan";
String password1 = "123";
prepareStatement.setString(1, username);
prepareStatement.setString(2, password1);
// 4.執行
ResultSet rs = prepareStatement.executeQuery();
// 5.獲取結果處理結果
while (rs.next()) {
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println("===");
}
// 6.關閉資源
rs.close();
prepareStatement.close();
connection.close();
}
}