- 為什么要使用JDBC?
- 如何使用JDBC?
- 使用JDBC進(jìn)行增刪改查
- 使用預(yù)編譯PreparedStatement進(jìn)行改進(jìn)
- execute與executeUpdate的區(qū)別
- DAO思想與設(shè)計(jì)
1.為什么要使用JDBC?
每個(gè)數(shù)據(jù)庫(kù)廠家使用的數(shù)據(jù)庫(kù)不同,所以Sun公司統(tǒng)一制定了數(shù)據(jù)庫(kù)連接規(guī)范
2.如何使用JDBC?
使用JDBC的基本操作
- 導(dǎo)入數(shù)據(jù)庫(kù)驅(qū)動(dòng)包
需要到網(wǎng)絡(luò)下載這里注意一下MySQL數(shù)據(jù)庫(kù)版本號(hào) - 初始化驅(qū)動(dòng)
Class.forName(com.mysql.cj.jdbc.Driver);
- 建立與數(shù)據(jù)庫(kù)的連接
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC",
"root",
"123456");
- 創(chuàng)建Statement
Statement st = connection.createStatement();
- 創(chuàng)建并執(zhí)行SQL語句
String addCodeSQL = "insert into test1 values(null,'006')";
st.execute(addCodeSQL);
- 關(guān)閉連接
st.close();
connection.close();
完整使用JDBC代碼
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestJDBC {
public static void main(String[] args) {
private static String DRIVER = "com.mysql.cj.jdbc.Driver";
private static String URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
private static String USERNAME = "root";
private static String PASSWORD = "123456";
Connection c = null;
Statement s = null;
try {
Class.forName(DRIVER);
c = DriverManager.getConnection(URL,USERNAME,PASSWORD);
s = c.createStatement();
String sql = "insert into hero values(null," 006")";
s.execute(sql);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 數(shù)據(jù)庫(kù)的連接時(shí)有限資源,相關(guān)操作結(jié)束后,養(yǎng)成關(guān)閉數(shù)據(jù)庫(kù)的好習(xí)慣
// 先關(guān)閉Statement
if (s != null)
try {
s.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 后關(guān)閉Connection
if (c != null)
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
- MySQL 8.0 以上版本驅(qū)動(dòng)包版本 [mysql-connector-java-8.0.16.jar]
- com.mysql.jdbc.Driver 更換為 com.mysql.cj.jdbc.Driver。
3.使用JDBC進(jìn)行增刪改查
3.1 增、刪、改
- 增、刪、改都是用同一個(gè)方式拼接字符串就可以了
package test;
import java.sql.*;
public class JavaTest {
private static String DRIVER = "com.mysql.cj.jdbc.Driver";
private static String URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
private static String USERNAME = "root";
private static String PASSWORD = "123456";
public static void main(String[] args) {
try {
// 1.創(chuàng)建驅(qū)動(dòng)
Class.forName(DRIVER);
System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載成功!");
//2.連接數(shù)據(jù)庫(kù)
Connection connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
System.out.println("連接成功"+connection);
//3.創(chuàng)建sql語句
String addCodeSQL = "insert into test1 values(null,'006')";
//4.執(zhí)行sql語句
Statement st = connection.createStatement();
st.execute(addCodeSQL);
System.out.println("執(zhí)行成功!");
//5.釋放資源
st.close();
connection.close();
} catch (SQLException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.2 查詢
- 查詢的結(jié)果是因?yàn)榉祷匾粋€(gè)集合,所以要使用
ResultSet結(jié)果集來接收 - 使用
executeQuery()方法來執(zhí)行查詢語句
package test;
import java.sql.*;
public class JavaTest {
private static String DRIVER = "com.mysql.cj.jdbc.Driver";
private static String URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
private static String USERNAME = "root";
private static String PASSWORD = "123456";
public static void main(String[] args) {
try {
// 1.創(chuàng)建驅(qū)動(dòng)
Class.forName(DRIVER);
System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載成功!");
//2.連接數(shù)據(jù)庫(kù)
Connection connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
System.out.println("連接成功"+connection);
//3.查詢語句
String searchSQL = "select * from test1";
//4.執(zhí)行sql語句
Statement st = connection.createStatement();
//4.1查詢結(jié)果集
ResultSet rs = st.executeQuery(searchSQL);
while (rs.next()){
int id = rs.getInt(1);
String code = rs.getString(2);
System.out.print("ID: " + id);
System.out.print(" Code: " + code + "\n");
}
rs.close();
System.out.println("執(zhí)行成功!");
//5.釋放資源
st.close();
connection.close();
} catch (SQLException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.使用預(yù)編譯PreparedStatement進(jìn)行改進(jìn)
4.1 為什么要使用PreparedStatement?
- 最基本的Statement方式?jīng)]有辦法防止SQL注入攻擊
OR 1=1 - 手動(dòng)拼接字符串太容易出錯(cuò),所以使用占位符
?來進(jìn)行占位
4.2 怎樣使用PreparedStatement?
以插入示例
Class.forName(DRIVER);
Connection connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
String addSQL = "insert into test1 values(null,?)";
PreparedStatement ps = connection.prepareStatement(addSQL);
ps.setString(1,"008");
ps.execute();
ps.close();
connection.close();
System.out.println("執(zhí)行成功!");
6.DAO設(shè)計(jì)思想
package test;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JavaTest {
private static String DRIVER = "com.mysql.cj.jdbc.Driver";
private static String URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
private static String USERNAME = "root";
private static String PASSWORD = "123456";
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//Student student1 = new Student("009");
//add(student1);
//Student student2 = new Student(9);
//delete(student2);
//Student student3 = new Student(8,"010");
//update(student3);
//list();
}
//public static void add(Hero h)
public static void add(Student student) throws SQLException, ClassNotFoundException {
Class.forName(DRIVER);
Connection connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
String addSQL = "insert into test1 values(null,?)";
PreparedStatement ps = connection.prepareStatement(addSQL);
ps.setString(1,student.getCode());
ps.execute();
ps.close();
connection.close();
System.out.println("執(zhí)行成功!");
}
//public static void delete(Hero h)
public static void delete(Student student) throws SQLException, ClassNotFoundException {
Class.forName(DRIVER);
Connection connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
String deleteSQL = "delete from test1 where id = ?";
PreparedStatement ps = connection.prepareStatement(deleteSQL);
ps.setInt(1,student.getId());
ps.execute();
ps.close();
connection.close();
System.out.println("執(zhí)行成功!");
}
//public static void update(Hero h)
public static void update(Student student) throws SQLException, ClassNotFoundException {
Class.forName(DRIVER);
Connection connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
String updateSQL = "update test1 set code = ? where id = ?";
PreparedStatement ps = connection.prepareStatement(updateSQL);
ps.setString(1,student.getCode());
ps.setInt(2,student.getId());
ps.execute();
ps.close();
connection.close();
System.out.println("執(zhí)行成功!");
}
//public static List<Hero> list();
public static List<Student> list() throws SQLException, ClassNotFoundException {
List<Student> list= new ArrayList<>();
Class.forName(DRIVER);
Connection connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
String searchSQL = "select * from test1";
PreparedStatement ps = connection.prepareStatement(searchSQL);
ResultSet rs = ps.executeQuery();
while (rs.next()){
int id = rs.getInt(1);
String code = rs.getString(2);
Student student = new Student(id,code);
list.add(student);
}
list.forEach(a-> System.out.println(a));
return list;
}
}