使用JDBC連接數據庫
- jdbc簡介
JDBC-Java DataBase Connectivity (java數據庫連接) 是一種用於執行SQL語句的Java API;
簡單來說就是一組規範,將所有關係型數據庫都抽象出來的規範,只提供操作的接口,具體怎麼操作不是由JDBC來操作的,具體規範:https://www.jcp.org/en/home/index
關係型數據庫:(建立在關係模型上的數據庫)例如:oracle,DB2、PostgreSQL,Microsoft SQL Server,Microsoft Access,MySQL
作用:採用統一的方式來操作各種數據庫
主要功能:
(1)建立與數據庫或者其他數據源的鏈接
(2)向數據庫發送SQL命令
(3)處理數據庫的返回結果
- JDBC中常用的接口和類
1.驅動管理類(DriverManager):
作用於用戶與驅動程序之間,用來管理驅動並獲得連接
2.數據庫連接類(Connection):
Connection 代表java與數據庫的一個連接。
連接過程包括所執行的SQL語句和在該連接上所返回的結果。
打開連接與數據庫建立連接的標準方法是調用DriverManager.getConnection()方法。
用完一定要及時關閉
3.聲明類(Statement):
用來向數據庫發送sql,實際上有三種類型的Statement對象:Statement,PreparedStatement(從Statement繼承而來),CallableStatement(從PreparedStatement繼承而來);createStatement();
1.Statement對象用於執行不帶參數的簡單的sql語句;
2.PreparedStatement對象用於執行帶或不帶IN參數的預編譯SQL語句,是預編譯的statement,特點:1.解決sql注入的問題,2.爲不同的數據類型賦值更加方便,3.同一個sql執行多次時,性能更好;
如果sql語句帶參數建議使用PreparedStatement
sql注入:
通過傳遞一個sql片段來破壞原有的sql語句,及達到sql攻擊的目的
PreparedStatement和Statement:
關係:PreparedStatement繼承自Statement,都是接口
區別:PreparedStatement可以使用佔位符,是預編譯的,批處理比Statement效率高
(具體用法後面代碼)
3.CallableStatement對象用於執行對數據庫已存儲過程的調用;(這裏不做過多介紹)
Statement提供了許多方法,最常用的方法如下:
(1)execute()方法:運行語句,返回是否有結果集。
(2)executeQuery()方法:運行查詢語句,返回ReaultSet對象。
(3)executeUpdata()方法:運行更新操作,返回更新的行數。
4.結果集合類(ResuleSet):
ResultSet包含符合SQL語句中條件的所有行記錄,並且它通過一套get方法(這些get方法可以訪問當前行中的不同列)提供了對這些行中數據的訪問。ResultSet.next()方法使光標移動到下一行。
get(int)根據列號獲得當前字段的值,並轉換爲類型
get(int)根據列名獲得當前字段的值,並轉換爲類型
.close()關閉資源
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class javaTest {
public static void main(String[] args) throws Exception {
String url="jdbc:mysql://localhost:3306/java1114";
String user="root";
String password="tiger";
//1.加載驅動程序
Class.forName("com.mysql.jdbc.Driver");
//2.獲得數據庫鏈接
Connection conn=DriverManager.getConnection(url, user, password);
//3.通過數據庫的連接操作數據庫,實現增刪改查(使用Statement類)
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select * from user");
//4.處理數據庫的返回結果(使用ResultSet類)
while(rs.next()){
System.out.println(rs.getString("user_name")+" "
+rs.getString("user_password"));
}
//關閉資源
rs.close();
st.close();
conn.close();
}
}
增強性寫法:
/*可以寫一個靜態塊來加載驅動*/
package jdbc1020;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/*加載驅動*/
public class jdbcUtil {
static String url="jdbc:mysql://localhost:3306/java1114";
static String user="root";
static String password="root";
static
{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*獲得連接*/
public static Connection getConnections()
{
try {
return DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
package jdbc1020;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import com.mysql.jdbc.ResultSetMetaData;
public class Test {
public static void main(String[] args) throws Exception
{
String sql= "select *from course";
/*獲得連接,創建聲明*/
try語句塊執行完就釋放
try(Connection conn=jdbcUtil.getConnections();Statement st=conn.createStatement();)
{
/*執行sql*/
ResultSet r=st.executeQuery(sql);
for(int i=1;i<=4;i++) {
if(r.next())
{
System.out.println(r.getObject(1));
}
}
}
}
}
PreparedStatement
package jdbc1020;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
public class Preparedtest {
public static void main(String[] args) throws Exception {
String sql="select *from course where cname=? and tno=?";
try(Connection conn = jdbcUtil.getConnections();
PreparedStatement ps = conn.prepareStatement(sql)
)
{
ps.setString(1, "計算機導論");
ps.setInt(2, 825);
ResultSet rs = ps.executeQuery();//注意這裏沒有參數
if(rs.next()) {
System.out.println(rs.getInt(1));
}
}
}
}