使用JDBC連接數據庫

使用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));
      	}
      	   
      	  }
      }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章