工具:
連線驅動
,驅動是兩個裝置要進行通訊,滿足一定通訊資料格式,資料格式由裝置提供商規定,裝置提供商為裝置提供驅動軟體,通過軟體可以與該裝置進行通訊。
mysql-connector-java-8.0.20.jar
(適配MySQL8.0版本),如果是之前版本的MySQL建議使用應用次數較多的
mysql-connector-java-5.1.38.jar
JDBC核心規範:
- DriverManager:⽤於註冊驅動
- Connection: 表示與資料庫建立的連線
- Statement: 運算元據庫sql語句的物件
- ResultSet: 結果集或⼀張虛擬表
Java提供存取資料庫規範稱為JDBC
,而生產廠商提供規範的實現類稱為驅動
。JDBC是介面,驅動是介面的實現,沒有驅動將無法完成資料庫連線,從而不能運算元據庫!每個資料庫廠商都需要提供自己的驅動,用來連線自己公司的資料庫,也就是說驅動一般都由資料庫生成廠商提供(也就是在我們上邊匯入的jar包當中)。
開發步驟
首先熟悉一下JDBC的helloworld,
#建立分類表
create table category(
cid int PRIMARY KEY AUTO_INCREMENT,
cname varchar(100)
);
#初始化資料
insert into category (cname) values('家電');
insert into category (cname) values('服飾');
insert into category (cname) values('化妝品');
建立一個簡單的表
2. 匯入驅動jar包
在IDEA專案下建立lib目錄
在MVN下好jar包並複製,雙擊新建的lib目錄ctrl+v
,jar包就儲存到該目錄下,之後右鍵匯入的jar包,選擇新增到庫…
或Add as Library...
,就正式新增完畢了
MySQL8.0連線jdbc方法
package JDBCTest;
import org.junit.Test;
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
@Test
/**
* 1.註冊驅動, 就是把 Driver.class⽂件載入到記憶體
* mysql8.0之前的版本需要連線的驅動是com.mysql.jdbc.Driver
*/
Class.forName("com.mysql.cj.jdbc.Driver");
/**
* 2.獲得連線
* 引數 url : 需要連線資料庫的地址 jdbc:mysql://IP地址:端⼝號/要連線的資料庫名稱
* 引數 user : 連線資料庫 使⽤的⽤戶名
* 引數 password: 連線資料庫 使⽤的密碼
*/
String url = "jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatments=true";
Connection connection = DriverManager.getConnection(url, "root", "root");
/**
* 3.獲取執⾏sql語句的物件
*/
Statement statement = connection.createStatement();
/**
* 4.執行sql語句並返回結果
*/
String sql1 = "select * from category";
ResultSet resultSet = statement.executeQuery(sql1);
/**
* 5.處理結果
*/
while (resultSet.next()) {
int cid = resultSet.getInt("cid");
String cname = resultSet.getString("cname");
System.out.println("cid = " + cid + ", cname = " + cname);
}
/**
* 6.釋放資源
*/
resultSet.close();
statement.close();
connection.close();
}
}
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.jdbc.Driver");
static Connection getConnection(String url, String user, String password)
:試圖建立到給定資料庫 URL 的連線使用引數說明:
- url 需要連線資料庫的位置(網址)
- user使用者名稱 (要區別於資料庫表名)
- password 密碼
eg:getConnection("jdbc:mysql://localhost:3306/database", "root", "root");
URL是SUN公司和資料庫廠商的一個協定
jdbc:mysql://localhost:3306/database
協定子協定 IP:埠號資料庫
jdbc:mysql://localhost:3306/database
或者jdbc:mysql:///database
(預設本機連線)jdbc:oracle:thin:@localhost:1521:sid
java.sql.Connection介面:一個連線
介面的實現在資料庫驅動中,所有與資料庫互動都是基於連線物件的。
java.sql.Statement介面: 操作sql語句,並返回相應結果
String sql = "某SQL語句";
獲取Statement語句執⾏平臺:Statement stmt =con.createStatement();
常用方法:
int executeUpdate(String sql);
--執行insert update delete語句.
ResultSet executeQuery(String sql);
--執行select語句.
boolean execute(String sql);
--僅當執行select並且有結果時才返回true,執行其他的語句返回false.
ResultSet
實際上就是一張二維的表格,我們可以呼叫其 boolean next()
方法指向某行記錄,當第一次呼叫 next()
方法時,便指向第一行記錄的位置,這時就可以使用ResultSet
提供的 getXXX(int col)
方法來獲取指定列的資料:(與陣列索引從0開始不同,這裡索引從1開始)rs.next();//指向第⼀⾏
rs.getInt(1);//獲取第⼀⾏第⼀列的資料
常用方法:
Object getObject(int index)
/Object getObject(String name)
獲得任意物件String getString(int index)
/String getString(String name)
獲得字串int getInt(int index)
/int getInt(String name)
獲得整型double getDouble(int index)
/double getDouble(String name)
獲得雙精度浮點型
rs.close();
stmt.close();
con.close();
@Test
public void testJDBC2() throws SQLException, ClassNotFoundException {
/**
* JDBC 完成 記錄的插⼊
* 1.註冊驅動
* 2.獲得連線
* 3.獲得執⾏sql語句的物件
* 4.執⾏sql語句, 並返回結果
* 5.處理結果
* 6.釋放資源
*/
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydb";
Connection conn = DriverManager.getConnection(url, "root",
"root");
Statement stat = conn.createStatement();
String sql = "insert into category(cname) values('測試')";
int result = stat.executeUpdate(sql);
System.out.println("result = " + result);
stat.close();
conn.close();
}
@Test
public void testJDBC4() throws SQLException, ClassNotFoundException {
/**
* JDBC 完成 記錄的刪除
* 1.註冊驅動
* 2.獲得連線
* 3.獲得執⾏sql語句的物件
* 4.執⾏sql語句, 並返回結果
* 5.處理結果
* 6.釋放資源
*/
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydb";
Connection conn = DriverManager.getConnection(url, "root",
"root");
Statement stat = conn.createStatement();
String sql = "delete from category where cid=4";
int result = stat.executeUpdate(sql);
System.out.println("result = " + result);
stat.close();
conn.close();
}
@Test
public void testJDBC3() throws SQLException, ClassNotFoundException {
/**
* JDBC 完成 記錄的更新
* 1.註冊驅動
* 2.獲得連線
* 3.獲得執⾏sql語句的物件
* 4.執⾏sql語句, 並返回結果
* 5.處理結果
* 6.釋放資源
*/
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydb";
Connection conn = DriverManager.getConnection(url, "root",
"root");
Statement stat = conn.createStatement();
String sql = "update category set cname='測試2' where cid=4";
int result = stat.executeUpdate(sql);
System.out.println("result = " + result);
stat.close();
conn.close();
}
@Test
public void testJDBC5() throws SQLException, ClassNotFoundException {
/**
* JDBC 完成 記錄的刪除
* 1.註冊驅動
* 2.獲得連線
* 3.獲得執⾏sql語句的物件
* 4.執⾏sql語句, 並返回結果
* 5.處理結果
* 6.釋放資源
*/
// 通過id 查詢資料
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydb";
Connection conn = DriverManager.getConnection(url, "root",
"root");
Statement stat = conn.createStatement();
String sql = "select * from category where cid = 3";
ResultSet rs = stat.executeQuery(sql);
if (rs.next()) {
int cid = rs.getInt("cid");
String cname = rs.getString("cname");
System.out.println("cid = " + cid + ",cname = " +cname);
} else {
System.out.println("資料沒有查到");
}
rs.close();
stat.close();
conn.close();
}
為啥要用到工具類呢?
JDBC操作中有大量的重複性編碼,為了減少不必要的工作量,引入了工具類,獲得資料庫連線
操作,將在以後的增刪改查所有功能中都存在,可以封裝工具類JDBCUtils。提供獲取連線物件的方法,從而達到程式碼的重複利用。
該工具類提供方法: public static Connection getConnection()
MySQL8.0使用者
jdbc.driver=com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatments=true
jdbc.user=root
jdbc.password=root
MySQL8.0以前版本的使用者
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
jdbc.user=root
jdbc.password=root
public class JDBCUtils2 {
private static String driver;
private static String url;
private static String user;
private static String password;
static {
try{
//使⽤類載入器, 讀取設定⽂件
InputStream is=
JDBCUtils2.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties prop=new Properties();
prop.load(is);
driver=prop.getProperty("jdbc.driver");
url=prop.getProperty("jdbc.url");
user=prop.getProperty("jdbc.user");
password=prop.getProperty("jdbc.password");
//註冊驅動
Class.forName(driver);
}catch(IOException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
/**
* 返回連線物件 Connection
*/
public static Connection getConnection()throws SQLException{
Connection conn=DriverManager.getConnection(url,user,password);
return conn;
}
/**
* 釋放資源
*/
public static void close(ResultSet rs,Statement stat,Connection
conn)throws SQLException{
if(rs!=null){
rs.close();
}
if(stat!=null){
stat.close();
}
//看Connection來⾃哪⾥, 如果Connection是從連線池⾥⾯獲得的, close()⽅法其
實是歸還;如果Connection是建立的,就是銷燬
if(conn!=null){
conn.close();
}
}
}
@Test
public void testJDBC6() throws SQLException {
/**
* 使⽤JDBC⼯具類, 完成查詢所有分類
* 1.通過JDBC⼯具類, 獲得連線
* 2.獲得執⾏sql語句的物件
* 3.執⾏sql語句, 並返回結果
* 4.處理結果
* 5.釋放資源
*/
Connection conn = JDBCUtils2.getConnection();
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select * from category");
while (rs.next()) {
int cid = rs.getInt("cid");
String cname = rs.getString("cname");
System.out.println("cid = " + cid + ",cname = " + cname);
}
JDBCUtils2.close(rs, stat, conn);
}