JDBC如何連接mysql
個人理解
JDBC就是用了讓JAVA代碼能更好的與數(shù)據(jù)庫連接而由數(shù)據(jù)庫廠商提供的接口,驅(qū)動是其實現(xiàn)類。
使用JDBC需要幾個步驟,同時對于增刪改查也分為兩種不同的操作,為了避免設(shè)置拼串時可能出現(xiàn)異常,使用preparedStatement進行預(yù)處理,為了減少代碼量,可以將相同的代碼封裝到一個工具類內(nèi)。
一、概述
JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。是Java訪問數(shù)據(jù)庫的標準規(guī)范
JDBC提供了一種基準,據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。
DBC需要連接驅(qū)動,驅(qū)動是兩個設(shè)備要進行通信,滿足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設(shè)備提供商規(guī)定,設(shè)備提供商為設(shè)備提供驅(qū)動軟件,通過軟件可以與該設(shè)備進行通信。
二、原理
Java提供訪問數(shù)據(jù)庫規(guī)范稱為JDBC,而生產(chǎn)廠商提供規(guī)范的實現(xiàn)類稱為驅(qū)動。
JDBC是接口,驅(qū)動是接口的實現(xiàn)類,沒有驅(qū)動將無法完成數(shù)據(jù)庫連接,從而不能操作數(shù)據(jù)庫!
每個數(shù)據(jù)庫廠商都需要提供自己的驅(qū)動,用來連接自己公司的數(shù)據(jù)庫,也就是說驅(qū)動一般都由數(shù)據(jù)庫生成廠商提供。
三、開發(fā)步驟
1、注冊驅(qū)動
告知JVM使用的是哪一個數(shù)據(jù)庫的驅(qū)動
2、獲得連接
使用JDBC中的類,完成對MySQL數(shù)據(jù)庫的連接
3、獲得語句執(zhí)行平臺
通過連接對象獲取對SQL語句的執(zhí)行者對象
4、執(zhí)行sql語句
使用執(zhí)行者對象,向數(shù)據(jù)庫執(zhí)行SQL語句 獲取到數(shù)據(jù)庫的執(zhí)行后的結(jié)果
5、處理結(jié)果
6、釋放資源
調(diào)用一堆close()方法
package com.oracle.demo01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注冊驅(qū)動(靜態(tài)方法)(包名+類名)
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對象(導(dǎo)包都導(dǎo)sql里面的,不導(dǎo)jdbc里的;多態(tài)!報異常是因為用戶輸入的串可能寫錯)后面設(shè)置下數(shù)據(jù)格式
String url="jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="123456";
Connection conn=DriverManager.getConnection(url,user,password);
//System.out.println(conn);報地址為正確sql服務(wù)關(guān)了可能報錯
//3.獲取語句執(zhí)行平臺:
Statement sta=conn.createStatement();
//4.執(zhí)行SQL語句:增-----一套語句執(zhí)行一句sql語句 返回的是一個Int值,是指執(zhí)行了幾行
String sql="insert into sort(sname) values('口紅')";
int row=sta.executeUpdate(sql);
System.out.println(row);
//6.釋放資源(先開后關(guān))
sta.close();
conn.close();
}
}
1、導(dǎo)入驅(qū)動JAR包:
創(chuàng)建lib目錄,用于存放當前項目需要的所有jar包
- 選擇jar包,右鍵執(zhí)行build path / Add to Build Path
- 選擇jar包,右鍵執(zhí)行build path / Add to Build Path

2、注冊驅(qū)動:
3、獲得鏈接:
jdbc:mysql://localhost:3306/mydb
JDBC規(guī)定url的格式由三部分組成,每個部分中間使用冒號分隔。
- 第一部分是jdbc,這是固定的;
- 第二部分是數(shù)據(jù)庫名稱,那么連接mysql數(shù)據(jù)庫,第二部分當然是mysql了;
- 第三部分是由數(shù)據(jù)庫廠商規(guī)定的,我們需要了解每個數(shù)據(jù)庫廠商的要求,mysql的第三部分分別由數(shù)據(jù)庫服務(wù)器的IP地址(localhost==127.0.0.1)、端口號(3306),以及DATABASE名稱(mydb)組成。
4、獲得語句執(zhí)行平臺:
常用方法:
①、 int
- executeUpdate(String sql);
- --執(zhí)行insert 、update、 delete語句.
- 返回執(zhí)行的行數(shù)int值。所有的增刪改都執(zhí)行這個語句
②、 ResultSet
- executeQuery(String sql);
- --執(zhí)行select語句.
- 返回ResultSet的結(jié)果集對象(二維表格)
③、 boolean
- execute(String sql);
- --執(zhí)行select返回true
- 執(zhí)行其他的語句返回false
5、處理結(jié)果集:(執(zhí)行insert、update、delete無需處理)
ResultSet實際上就是一張二維的表格,我們可以調(diào)用其boolean next()方法指向某行記錄,當?shù)谝淮握{(diào)用next()方法時,便指向第一行記錄的位置,這時就可以使用ResultSet提供的getXXX(int col)方法(與索引從0開始不同個,列從1開始)來獲取指定列的數(shù)據(jù):
rs.next();//指向第一行 rs.getInt(1);//獲取第一行第一列的數(shù)據(jù)
package com.oracle.demo01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
public class Demo04 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//1.注冊驅(qū)動(靜態(tài)方法)(包名+類名)
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對象(導(dǎo)包都導(dǎo)sql里面的,不導(dǎo)jdbc里的;多態(tài)!報異常是因為用戶輸入的串可能寫錯)后面設(shè)置下數(shù)據(jù)格式
String url="jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="123456";
Connection conn=DriverManager.getConnection(url,user,password);
//System.out.println(conn);報地址為正確sql服務(wù)關(guān)了可能報錯
//3.獲取語句執(zhí)行平臺:
Statement sta=conn.createStatement();
//4.執(zhí)行sql語句
String sql="select * from sort";
ResultSet rs=sta.executeQuery(sql);
//5.處理結(jié)果集(括號里一般是第1列、第2列,但是可以寫字段名)
ArrayList<Sort> arr=new ArrayList<Sort>();
while(rs.next()){
//System.out.println(rs.getInt("sid")+"..."+rs.getString("sname"));
Sort sort=new Sort();
sort.setSid(rs.getInt("sid"));
sort.setSname(rs.getString("sname"));
arr.add(sort);
}
System.out.println(arr);
//6.釋放資源
rs.close();
sta.close();
conn.close();
}
}
6、釋放資源
使用后的東西都需要關(guān)閉!關(guān)閉的順序是先得到的后關(guān)閉,后得到的先關(guān)閉。
四、注入問題
假設(shè)有登錄案例SQL語句如下:
SELECT * FROM 用戶表 WHERE NAME = 用戶輸入的用戶名 AND PASSWORD = 用戶輸?shù)拿艽a;
此時,當用戶輸入正確的賬號與密碼后,查詢到了信息則讓用戶登錄。
但是當用戶輸入的賬號為XXX 密碼為:XXX’ OR ‘a’=’a時,則真正執(zhí)行的代碼變?yōu)椋?/p>
SELECT * FROM 用戶表 WHERE NAME = ‘XXX' AND PASSWORD =' XXX' OR 'a'='a';
此時,上述查詢語句時永遠可以查詢出結(jié)果的。
那么用戶就直接登錄成功了,顯然我們不希望看到這樣的結(jié)果,這便是SQL注入問題。
主要是Statement是用拼串傳值的!這樣就會造成可能出現(xiàn)危險!
為此,我們使用PreparedStatement(預(yù)編譯對象)來解決對應(yīng)的問題。
五、預(yù)處理對象
使用PreparedStatement預(yù)處理對象時,建議每條sql語句所有的實際參數(shù),都使用逗號分隔。
String sql = “insert into sort(sid,sname) values(?,?)”;;
PreparedStatement預(yù)處理對象代碼:
PreparedStatement psmt = conn.prepareStatement(sql)
package com.oracle.demo01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class Demo07 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//1.注冊驅(qū)動(靜態(tài)方法)(包名+類名)
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對象(導(dǎo)包都導(dǎo)sql里面的,不導(dǎo)jdbc里的;多態(tài)!報異常是因為用戶輸入的串可能寫錯)后面設(shè)置下數(shù)據(jù)格式
String url="jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="123456";
Connection conn=DriverManager.getConnection(url,user,password);
//System.out.println(conn);報地址為正確sql服務(wù)關(guān)了可能報錯
//3.獲取語句執(zhí)行平臺對象:
String sql="select count(*) from user where uname=? and pwd=?";
PreparedStatement pst=conn.prepareStatement(sql);
//4.執(zhí)行sql語句
Scanner sc=new Scanner(System.in);
System.out.println("請出入用戶名:");
String uname=sc.next();
System.out.println("請輸入密碼:");
String pwd=sc.next();
//給sql語句的?賦值
pst.setString(1,uname);
pst.setString(2, pwd);
ResultSet rs= pst.executeQuery();//()里不能寫sql
//5.處理結(jié)果集
int count=0;
while(rs.next()){
count=rs.getInt(1);//因為就一列
System.out.println(count);
}
//6.釋放資源
rs.close();
pst.close();
conn.close();
}
}
六、JDBC工具類
“獲得數(shù)據(jù)庫連接”操作,將在以后的增刪改查所有功能中都存在,可以封裝工具類JDBCUtils。
提供獲取連接對象的方法,從而達到代碼的重復(fù)利用。
package com.oracle.demo01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
//獲取連接對象的方法(靜態(tài)的)
public static Connection getConn(){
Connection conn=null;
try {
//1.注冊驅(qū)動(靜態(tài)方法)(包名+類名)
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對象(導(dǎo)包都導(dǎo)sql里面的,不導(dǎo)jdbc里的;多態(tài)!報異常是因為用戶輸入的串可能寫錯)后面設(shè)置下數(shù)據(jù)格式
String url="jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="123456";
conn=DriverManager.getConnection(url,user,password);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//釋放資源
public static void close(Connection conn,Statement sta){
if(sta!=null){
try {
sta.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//釋放資源2
public static void close(Connection conn,Statement sta,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(sta!=null){
try {
sta.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.oracle.demo01;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo08 {
public static void main(String[] args) throws SQLException {
add();
}
//新增分類Sort
public static void add() throws SQLException{
//1.獲得連接對象
Connection conn=JDBCUtils.getConn();
//測試下是地址不System.out.println(conn);
//2.獲取語句執(zhí)行平臺
String sql="insert into sort (sname) values(?)";
PreparedStatement pst=conn.prepareStatement(sql);
//3.執(zhí)行sql
pst.setString(1, "打火機");
int row=pst.executeUpdate();
System.out.println(row);
//4.釋放資源
JDBCUtils.close(conn, pst);
}
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySql添加新用戶及為用戶創(chuàng)建數(shù)據(jù)庫和給用戶分配權(quán)限方法介紹
這篇文章主要介紹了MySql添加新用戶及為用戶創(chuàng)建數(shù)據(jù)庫和給用戶分配權(quán)限方法介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Windows10下mysql 5.7.21 Installer版安裝圖文教程
這篇文章主要為大家詳細介紹了Windows10下mysql 5.7.21 Installer版安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
MySQL數(shù)據(jù)庫如何導(dǎo)入導(dǎo)出(備份還原)
這篇文章主要介紹了MySQL數(shù)據(jù)庫如何導(dǎo)入導(dǎo)出(備份還原),需要的朋友可以參考下2015-10-10
MySql 8.0.16版本安裝提示已經(jīng)不使用“UTF8B3”而是使用“UTF8B4”問題
這篇文章主要介紹了MySql 8.0.16版本安裝提示已經(jīng)不使用“UTF8B3”而是使用“UTF8B4”問題 ,需要的朋友可以參考下2019-07-07
MySQL百萬級數(shù)據(jù)大分頁查詢優(yōu)化的實現(xiàn)
在數(shù)據(jù)庫開發(fā)過程中我們經(jīng)常會使用分頁,但是如果是百萬級數(shù)據(jù)呢,本文就詳細的介紹一下MySQL百萬級數(shù)據(jù)大分頁查詢優(yōu)化的實現(xiàn),感興趣的可以了解一下2022-01-01
MySQL slow_log表無法修改成innodb引擎詳解
這篇文章主要給大家介紹了關(guān)于MySQL slow_log表無法修改成innodb引擎的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

