JDBC鏈接MySql數(shù)據(jù)庫的簡單講解
一航闺、JDBC簡介
- 數(shù)據(jù)庫驅(qū)動
-
SUN公司為了簡化,同意對數(shù)據(jù)庫的操作喝滞,定義了一套java操作數(shù)據(jù)庫的規(guī)范
- JDBC全稱:Java Data Base Connectivity(java數(shù)據(jù)庫連接)阁将,它主要由接口組成。
- 組成JDBC的2個包:
* java.sql
* javax.sql - 開發(fā)JDBC應(yīng)用需要以上2個包的支持外右遭,還需要導(dǎo)入相應(yīng)JDBC的數(shù)據(jù)庫實現(xiàn)(即數(shù)據(jù)庫驅(qū)動)做盅。
二、第一個JDBC程序
-
一窘哈、搭建實驗環(huán)境 :
- 1吹榴、在mysql中創(chuàng)建一個庫,并創(chuàng)建user表和插入表的數(shù)據(jù)滚婉。
- 2图筹、新建一個Java工程,并導(dǎo)入數(shù)據(jù)驅(qū)動。 -
二远剩、編寫程序扣溺,在程序中加載數(shù)據(jù)庫驅(qū)動
DriverManager. registerDriver(Driver driver)
-
三、建立連接(Connection)
Connection conn = DriverManager.getConnection(url,user,pass);
-
四瓜晤、創(chuàng)建用于向數(shù)據(jù)庫發(fā)送SQL的Statement對象锥余,并發(fā)送sql
Statement st = conn.createStatement(); ResultSet rs = st.excuteQuery(sql);
五、從代表結(jié)果集的ResultSet中取出數(shù)據(jù)痢掠,打印到命令行窗口
ResultSet rs = stmt.executeQuery("select * from stu");
// 5驱犹、輸出結(jié)果集的數(shù)據(jù)
while (rs.next()) {
System.out.println("id :" + rs.getInt("id") + " name :" + rs.getString("name"));
}
- 六、斷開與數(shù)據(jù)庫的連接志群,并釋放相關(guān)資源
// 6着绷、關(guān)閉鏈接、命令對象锌云、結(jié)果集
rs.close();
stmt.close();
conn.close();
- 七荠医、具體的代碼:
//這里我把異常拋出去了,為了代碼的簡潔桑涎,不過在開發(fā)的時候不要這么干啊
public static void main(String[] args) throws Exception {
// 1彬向、注冊驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
// 2、創(chuàng)建一個連接對象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
// 3攻冷、創(chuàng)建一個sql語句發(fā)送的命令對象
Statement stmt = conn.createStatement();
// 4娃胆、執(zhí)行SQL,拿到查詢的結(jié)果集對象
ResultSet rs = stmt.executeQuery("select * from stu");
// 5、輸出結(jié)果集的數(shù)據(jù)
while (rs.next()) {
System.out.println("id :" + rs.getInt("id") + " name :" + rs.getString("name"));
}
// 6等曼、關(guān)閉鏈接里烦、命令對象、結(jié)果集
rs.close();
stmt.close();
conn.close();
}
三禁谦、注冊驅(qū)動的三種方式
//這里我把異常拋出去了胁黑,為了代碼的簡潔,不過在開發(fā)的時候不要這么干啊
public static void main(String[] args) throws Exception {
// 連接地址
String url = "jdbc:mysql://localhost:3306/mydb";
// 用戶名
String name = "root";
// 密碼
String pwd = "root";
// 1州泊、注冊驅(qū)動
// Class.forName("com.mysql.jdbc.Driver");
/**
* 第一種注冊方式
*/
// Driver driver = new Driver();
// DriverManager.registerDriver(driver);
/**
* 第二種方式 反射機(jī)制
*/
// Driver driver = (Driver)
// Class.forName("com.mysql.jdbc.Driver").newInstance();
// DriverManager.registerDriver(driver);
/**
* 第三種注冊方式 **建議使用的**
*/
Class.forName("com.mysql.jdbc.Driver");
// 2丧蘸、創(chuàng)建一個連接對象
Connection conn = DriverManager.getConnection(url, name, pwd);
// 3、創(chuàng)建一個sql語句發(fā)送的命令對象
Statement stmt = conn.createStatement();
// 4遥皂、執(zhí)行SQL,拿到查詢的結(jié)果集對象
ResultSet rs = stmt.executeQuery("select * from stu");
// 5力喷、輸出結(jié)果集的數(shù)據(jù)
while (rs.next()) {
System.out.println("id :" + rs.getInt("id") + " name :" + rs.getString("name"));
}
// 6、關(guān)閉鏈接演训、命令對象弟孟、結(jié)果集
rs.close();
stmt.close();
conn.close();
}
四、獲取連接對象的三種方式
public static void main(String[] args) throws Exception {
// 連接地址
String url = "";
// 用戶名
String name = "";
// 密碼
String pwd = "";
//我們要在src/目錄下創(chuàng)建一個.properties文件
Properties pro = new Properties();
InputStream is = JdbcDemo3.class.getClassLoader().getResourceAsStream("dbcof.properties");
pro.load(is);
// Connection conn =
// DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", pro);
url = pro.getProperty("url");
name = pro.getProperty("user");
pwd = pro.getProperty("password");
// 1样悟、注冊驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
// 2拂募、創(chuàng)建一個連接對象
// Connection conn =
// DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb",
// "root", "root");
/**
* 第一種連接方式 用戶名和密碼作為參數(shù)在網(wǎng)址后面
*/
// Connection conn =
// DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?user=root&password=root");
/**
* 第二種方式 采用properties文件
*/
// 讀取properties文件
/*
* Properties pro = new Properties(); InputStream is =
* JdbcDemo3.class.getClassLoader().getResourceAsStream(
* "dbcof.properties"); pro.load(is); Connection conn =
* DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb",pro);
*/
/**
* 第三種方式創(chuàng)建連接對象
*/
Connection conn = DriverManager.getConnection(url, name, pwd);
// 3、創(chuàng)建一個sql語句發(fā)送的命令對象
Statement stmt = conn.createStatement();
// 4、執(zhí)行SQL,拿到查詢的結(jié)果集對象
ResultSet rs = stmt.executeQuery("select * from stu");
// 5没讲、輸出結(jié)果集的數(shù)據(jù)
while (rs.next()) {
System.out.println("id :" + rs.getInt("id") + " name :" + rs.getString("name"));
}
// 6眯娱、關(guān)閉鏈接、命令對象爬凑、結(jié)果集
rs.close();
stmt.close();
conn.close();
}
- 這里我們創(chuàng)建的properties(以鍵值對的方式存在)文件內(nèi)容如下:
driverClass=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/mydb
user=root
password=root
五徙缴、數(shù)據(jù)庫URL
-
URL用于標(biāo)識數(shù)據(jù)庫的位置,程序員通過URL地址告訴JDBC程序連接哪個數(shù)據(jù)庫嘁信,URL的寫法為:
- 常用數(shù)據(jù)庫URL地址的寫法:
Oracle寫法:jdbc:oracle:thin:@localhost:1521:sid
SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
MySql—jdbc:mysql://localhost:3306/sid
六于样、Connection講解
- Jdbc程序中的Connection,它用于代表數(shù)據(jù)庫的鏈接潘靖,Collection是數(shù)據(jù)庫編程中最重要的一個對象穿剖,客戶端與數(shù)據(jù)庫所有交互都是通過connection對象完成的。
- 這個對象的常用方法:
- createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送sql的statement對象卦溢。
- prepareStatement(sql) :創(chuàng)建向數(shù)據(jù)庫發(fā)送預(yù)編譯sql的PrepareSatement對象糊余。
- prepareCall(sql):創(chuàng)建執(zhí)行存儲過程的callableStatement對象。
- setAutoCommit(boolean autoCommit):設(shè)置事務(wù)是否自動提交单寂。
- commit() :在鏈接上提交事務(wù)贬芥。
- rollback() :在此鏈接上回滾事務(wù)。
七宣决、Statement講解
- Jdbc程序中的Statement對象用于向數(shù)據(jù)庫發(fā)送SQL語句
- Statement對象常用方法:
- executeQuery(String sql) :用于向數(shù)據(jù)發(fā)送查詢語句蘸劈。
- executeUpdate(String sql):用于向數(shù)據(jù)庫發(fā)送insert、update或delete語句
- execute(String sql):用于向數(shù)據(jù)庫發(fā)送任意sql語句
- addBatch(String sql) :把多條sql語句放到一個批處理中尊沸。
- executeBatch():向數(shù)據(jù)庫發(fā)送一批sql語句執(zhí)行威沫。
八、ResultSet講解
Jdbc程序中的ResultSet用于代表Sql語句的執(zhí)行結(jié)果洼专。Resultset封裝執(zhí)行結(jié)果時棒掠,采用的類似于表格的方式。ResultSet 對象維護(hù)了一個指向表格數(shù)據(jù)行的游標(biāo)壶熏,初始的時候句柠,游標(biāo)在第一行之前浦译,調(diào)用ResultSet.next() 方法棒假,可以使游標(biāo)指向具體的數(shù)據(jù)行,進(jìn)行調(diào)用方法獲取該行的數(shù)據(jù)精盅。
-
ResultSet既然用于封裝執(zhí)行結(jié)果的帽哑,所以該對象提供的都是用于獲取數(shù)據(jù)的get方法:
- 獲取任意類型的數(shù)據(jù)
getObject(int index) getObject(string columnName)
- 獲取指定類型的數(shù)據(jù),(封裝數(shù)據(jù)時方便)例如:
getString(int index) getString(String columnName)
ResultSet還提供了對結(jié)果集進(jìn)行滾動的方法:
next():移動到下一行
Previous():移動到前一行
absolute(int row):移動到指定行
beforeFirst():移動resultSet的最前面叹俏。
afterLast() :移動到resultSet的最后面妻枕。
例如以下的幾個查詢:
//String sql = "select id 編碼,name 姓名 from stu"; 第一種
String sql = "select * from stu";
ResultSet rs = stmt.executeQuery(sql);
// 5、輸出結(jié)果集的數(shù)據(jù)
while (rs.next()) {
// System.out.println("id :" + rs.getInt("id") + " name :" +
// rs.getString("name"));
// 第一種根據(jù)字段名查找 對應(yīng)//String sql = "select id 編碼,name 姓名 from stu"; 第一種
// int id = rs.getInt("編碼"); //
// String name = rs.getString("姓名");
// int age = rs.getInt("age");
// String addr = rs.getString("address");
// System.out.println("id :" + id + " name :" + name);
// System.out.println("id :" + id + " name :" + name + " age :" +
// age + " addr " + addr);
// 第二種是根據(jù)字段的索引 是結(jié)果集的序號(下標(biāo)從 1 開始)
// int id = rs.getInt(1);
// String name = rs.getString(2);
// System.out.println("id :" + id + " name :" + name);
/**
* String sql = "select * from stu";
* 當(dāng)sql語句是上面的時候,就可以下面的這種方式查找了
*/
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String addr = rs.getString("address");
System.out.println("id :" + id + " name :" + name + " age :" + age + " addr " + addr);
}
九屡谐、釋放資源
Jdbc程序運(yùn)行完后述么,切記要釋放程序在運(yùn)行過程中,創(chuàng)建的那些與數(shù)據(jù)庫進(jìn)行交互的對象愕掏,這些對象通常是ResultSet, Statement和Connection對象度秘。
特別是Connection對象,它是非常稀有的資源饵撑,用完后必須馬上釋放剑梳,如果Connection不能及時、正確的關(guān)閉滑潘,極易導(dǎo)致系統(tǒng)宕機(jī)垢乙。Connection的使用原則是盡量晚創(chuàng)建,盡量早的釋放语卤。
為確保資源釋放代碼能運(yùn)行追逮,資源釋放代碼也一定要放在finally語句中。
十粹舵、代碼地址
https://github.com/wuyinlei/Jdbc
好了羊壹,今天就總結(jié)這么多,有些只是簡單的提示齐婴,如想要了解更多油猫,可以自行g(shù)oogle。也可以交流