1,JDBC分析
image.png
image.png
1)概念
-
Java Database Connectivity:java數據庫連接。是Java中,規范client如何來訪問數據庫API接口,(類比于Servlet規范)。
在jdk的rt.jar庫文件中,定義了Connection接口,DriverManager類,PreparedStatement接口等。
image.png - 數據庫驅動程序:不同數據庫廠商對于JDBC接口實現,即對Connection等接口的實現類的jar文件。
eg:mysql-connector-java-5.1.38.jar
,使用jdbc連接不同的數據庫需要加載不同的驅動(Driver)。
image.png
2)使用jdbc
- 加載JDBC驅動程序 → 建立數據庫連接Connection → 創建執行SQL的語句Statement → 處理執行結果ResultSet → 釋放資源
- java任何class都要加載到JVM中才能運行。加載類會執行該類的靜態代碼段,DriverManager在決定使用哪個Driver時,通過遍歷所有已注冊的驅動來嘗試獲取連接,(第一個)成功就返回。
//當com.mysql.jdbc.Driver被加載時,會注冊驅動到DriverManager,執行以下代碼。
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
String url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF8";
String url="jdbc:oracle:thin:@localhost:1521:mydb";
String url="jdbc:sqlserver://localhost:1433;DatabaseName=mydb";
Class.forName("com.mysql.jdbc.Driver") ;
Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection(url,name,password);
stmt = conn.createStatement();
String sql = "select id, username from account where id = " + id;//sql注入,id = "1 or 1=1"就會返回所有數據。
//`select * from user_admin where id = 1 or 1 = 1;`
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int id = rs.getLong("id");
String username = rs.getString("username");
System.out.print("ID: " + id);
System.out.println("username: " + username);
}
rs.close();
stmt.close();
conn.close();
//防止sql注入。
String sql = "select id, username from account where id = ?";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setLong("1", 1L);
2,Connection 和 Session
- 連接(connection)是一個物理的概念,它指的是一個通過網絡建立的客戶端和mysql服務器的一個網絡連接。
- 會話(Session)是不同的用戶,與mysql實例(進程)建立的。
- 一個連接可以擁有多個會話也可以沒有會話,同一個連接上的不同會話之間不會相互影響。
- 一個會話可以創建多個事務。(使用客端登錄到數據庫)
- 一個事務只能由一個會話產生。
3,數據庫連接池。(druid, c3p0, dbcp等)
- 數據庫連接池負責分配、管理和釋放數據庫連接,允許應用程序重復使用一個現有的數據庫連接。
- 連接池基本的思想是在系統初始化的時候,將數據庫連接作為對象存儲在內存中,當用戶需要訪問數據庫時,并非建立一個新的連接,而是從連接池中取出一個已建立的空閑連接對象。
3,幾個對比
1)jdbc,jdbctemplate,dbutils
jdbc是java數據庫連接。
jdbctemplate是springframework-jdbc中對jdbc的封裝。
dbutils是對jdbc的輕量級封裝。
2)jpa,hibernate jpa,spring-data-jpa
jpa是Java Persistence API
是java持久化api。
hibernate jpa實現類jpa規范。
spring-data-jpa實現了jpa規范。