java 使用JBDC訪問MySQL數據庫

1)JBDC簡介:

    JBDC 是java數據庫鏈接技術的簡稱,提供鏈接各種常用數據庫的能力

JBDC的工作原理:


JBDC API:

    提供者:Sun公司

    內容:供程序員調用的接口與類,集成在 Java.sql 和 javax.sql 包中,

    如:

    DriverManager 類:

    Connection接口:

    Statement接口:

    ResultSet接口:

DriverManager:

    提供者:Sun公司

    作用:管理各種不同的JBDC驅動

JBDC驅動:

    提供者:數據庫廠商

    作用:負責鏈接各種不同的數據庫

JBDC API主要功能:

    與數據庫建立連接、執行SQL語句、處理結果


    DriverManager: 依據數據庫的不同,管理JDBC驅動

    Connection:負責鏈接數據庫並擔任傳送數據的任務

    Statement: 由Connection 產生、負責執行SQL語句

    ResultSet :負責保存Statement 執行後所產生的查詢結果

2)連接數據庫庫

JBDC驅動由數據庫廠商提供:

在個人開發測試中,可以使用JBDC-ODBC橋連方式

 在生產型開發中,推薦使用純java 驅動方式


使用JBDC - OBDC 橋方式連接數據庫

    將對JBDC API 的調用,轉換爲對另一組數據庫連接API的調用

    優點:可以訪問所有ODBC可以訪問的數據庫

    缺點:執行效率低、功能不夠強大




=====================================================================

JDBC驅動:

    使用純java方式連接數據庫

    由JDBC驅動直接訪問數據庫

    優點:100% java,快又可跨平臺

    缺點:訪問不同的數據庫需要下載專用的JDBC驅動

    

    在使用純java方式連接數據庫之前需要先引用相關架包

    下載地址:https://download.csdn.net/download/qq_41303423/10291176

    

    引用完後就可以使用了。以下代碼演示,如若拷貝代碼,請註釋記錄日誌代碼,以免有錯誤

    使用純java方式連接數據庫的步驟:

    1.加載驅動     2.建立連接    3.異常處理    4.關閉連接

package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 純java方式連接關閉數據庫
 *<p>Title:Text01</p>
 *<p>Description:</p>
 *<p>Company:</p>
 * @author MLQ
 * @date 2018年3月16日 下午5:21:42
 */
public class Text01 {
	//記錄日誌
	private static Logger log=LoggerFactory.getLogger(Text01.class);
	public static void main(String[] args) {
		Connection con=null;
		//1.加載驅動
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			log.error(e.toString());
		}
		//2.建立連接
		try {
			/**
			 * localhost:3306 本地
			 * Library:要操作的數據庫
			 * text:用戶名
			 * 123:密碼
			 */
			con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
			System.out.println("建立連接成功");
		} catch (SQLException e) {
			e.printStackTrace();
			log.error(e.toString());
		}
		finally
		{
			try {
				if(con!=null){
				con.close();
				System.out.println("關閉連接成功");
				}
			} catch (SQLException e) {
				e.printStackTrace();
				log.error(e.toString());
			}
		}
	}
}

3)使用 Statement 和 ResultSet

Statement常用方法:



ResultSet常用方法:

代碼演示向數據庫添加信息:

package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Text02 {
	private static Logger log=LoggerFactory.getLogger(Text02.class);
	public static void main(String[] args) {
		//連接數據庫
		Connection con=null;
		//向數據庫發送信息
		Statement stmt=null;
		//1.加載驅動
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			log.error(e.toString());
		}
		//2.建立連接
		try {
			/**
			 * localhost:3306 本地
			 * Library:要操作的數據庫
			 * text:用戶名
			 * 123:密碼
			 */
			StringBuffer sql=new StringBuffer();
			con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
			//發送給數據庫命令,並執行sql語句
			stmt=con.createStatement();
			//拼接sql語句
			//INSERT INTO `reader` VALUES('006','測試',4,'吳名區');
			sql.append("INSERT INTO `reader` VALUES(");
			sql.append("'007',");
			sql.append("'測試1',");
			sql.append("4,");
			sql.append("'吳名區1');");
			//執行sql
			//boolean flog=stmt.execute(sql.toString());
			int num=stmt.executeUpdate(sql.toString());
			if(num>0)
			{
				System.out.println("插入成功");
			}else
			{
				System.err.println("插入失敗!!!");
			}
//			if(flog)
//			{
//				System.out.println("插入成功");
//			}else
//			{
//				System.err.println("插入失敗!!!");
//			}
			
		} catch (SQLException e) {
			e.printStackTrace();
			log.error(e.toString());
		}
		finally
		{
			try {
				if(stmt!=null)
				{
					stmt.close();
				}
				if(con!=null){
					con.close();		
				}
			} catch (SQLException e) {
				e.printStackTrace();
				log.error(e.toString());
			}
		}
	}
}

//對數據庫進行修改

public static void main(String[] args) {
		//連接數據庫
			Connection con=null;
			//向數據庫發送信息
			Statement stmt=null;
			//1.加載驅動
			try {
				Class.forName("com.mysql.jdbc.Driver");
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
				log.error(e.toString());
			}
			//2.建立連接
			try {
				con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
				//發送給數據庫命令,並執行sql語句
				stmt=con.createStatement();
				int num = stmt.executeUpdate("UPDATE `reader` SET `rName`='測試數據' WHERE `Rid`='007';");
				if(num>0)
				{
					System.out.println("修改成功");
				}else
				{
					System.err.println("修改失敗!!!");
				}
			} catch (SQLException e) {
				e.printStackTrace();
			log.error(e.toString());
			}
			finally
			{
				try {
					if(stmt!=null)
					{
						stmt.close();
					}
					if(con!=null){
						con.close();		
					}
				} catch (SQLException e) {
					e.printStackTrace();
					log.error(e.toString());
				}
			}			
//查詢數據庫中一張表的信息
public static void main(String[] args) {
			//連接數據庫
			Connection con=null;
			//向數據庫發送信息
			Statement stmt=null;
			//定義一個容器
			ResultSet set=null;
			//1.加載驅動
			try {
				Class.forName("com.mysql.jdbc.Driver");
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
				log.error(e.toString());
			}
			//2.建立連接
			try {
				con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
				//發送給數據庫命令,並執行sql語句
				stmt=con.createStatement();
				set=stmt.executeQuery("select * from reader");//把查詢到的信息保存到一個容器裏面
				//循環讀取
				System.out.println("編號\t姓名\t測試\t地址");
				while(set.next())
				{//循環所有行
					System.out.print(set.getInt(1)+"\t");//輸出每一列
					System.out.print(set.getString(2)+"\t");
					System.out.print(set.getInt(3)+"\t");
					System.out.println(set.getString(4));
				}
			} catch (SQLException e) {
				e.printStackTrace();
			log.error(e.toString());
			}
			finally
			{
				try {
					if(stmt!=null)
					{
						stmt.close();
					}
					if(con!=null){
						con.close();		
					}
				} catch (SQLException e) {
					e.printStackTrace();
					log.error(e.toString());
				}
			}			 

4)PreparedStatement接口: 

使用PreparedStatement接口

    繼承自Statement接口

    比Statement對象使用起來更加靈活,更有效率

    


代碼演示:

public static void main(String[] args) {
		//連接數據庫
			Connection con=null;
			//向數據庫發送信息
			PreparedStatement stmt=null;
			//1.加載驅動
			try {
				Class.forName("com.mysql.jdbc.Driver");
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
				log.error(e.toString());
			}
			//2.建立連接
			try {
				con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
				//發送給數據庫命令,並執行sql語句
				stmt=con.prepareStatement("UPDATE `reader` SET `rName`=? WHERE `Rid`=?;");
				stmt.setString(1, "判斷");
				stmt.setInt(2, 007);
				int num=stmt.executeUpdate();
				if(num>0)
				{
					System.out.println("修改成功");
				}else
				{
					System.err.println("修改失敗!!!");
				}
			} catch (SQLException e) {
				e.printStackTrace();
			log.error(e.toString());
			}
			finally
			{
				try {
					if(stmt!=null)
					{
						stmt.close();
					}
					if(con!=null){
						con.close();		
					}
				} catch (SQLException e) {
					e.printStackTrace();
					log.error(e.toString());
				}
			}			
	}

}

5)PreparedStatement  與  Statement  執行SQL時的差異區別

數據庫User表  UserId爲:2018   密碼UserPwd:123

測試結果如下:

調用:statementText() 方法時可以登錄成功

調用:preparedStatementText() 方法時登陸失敗

具體詳情請參考以下代碼:

----------------------內容重置-------------------------

PreparedStatement接口繼承自Statement接口

提高了代碼的可讀性和維護性

提高了SQL語句執行性能和安全性


<--------僅供參考------->























發佈了65 篇原創文章 · 獲贊 20 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章