一文帶你快速學(xué)會(huì)JDBC及獲取連接的五種方式
快速學(xué)會(huì)JDBC及獲取連接的五種方式
1. JDBC基本介紹
- JDBC為訪問(wèn)不同的數(shù)據(jù)庫(kù)提供了統(tǒng)一的接口,為使用者屏蔽了細(xì)節(jié)問(wèn)題
- Java程序員使用JDBC,可以連接任何提供了JDBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)系統(tǒng),完成對(duì)數(shù)據(jù)庫(kù)的各種操作。
- JDBC基本原理圖
2. JDBC快速入門(mén)
2.1 JDBC程序編寫(xiě)步驟
- 注冊(cè)驅(qū)動(dòng)-加載Driver類(lèi)
- 獲取連接-得到Connection
- 執(zhí)行增刪改查-發(fā)送SQL給MySQL執(zhí)行
- 釋放資源-關(guān)閉相關(guān)連接
2.2 案例演示
2.2.1 前置工作,在數(shù)據(jù)庫(kù)中建立對(duì)應(yīng)表
CREATE TABLE `actor`( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(32) NOT NULL DEFAULT '', sex CHAR(1) NOT NULL DEFAULT '女', borndate DATETIME, phone VARCHAR(12));
2.2.2 前置工作,導(dǎo)入MySQL數(shù)據(jù)庫(kù)的對(duì)應(yīng)jar包
在項(xiàng)目下新建一個(gè)文件夾如libs,將對(duì)應(yīng)jar包拷入,并將其加入library中
public static void main(String[] args) throws SQLException { //注冊(cè)驅(qū)動(dòng) Driver driver = new Driver(); String url="jdbc:mysql://localhost:3306/zxy_db01"; String user="root"; String psd = "123"; DriverManager.registerDriver(driver); //獲得連接 Connection connection = DriverManager.getConnection(url,user,psd); //執(zhí)行SQL語(yǔ)句 String sql = "insert into actor values(null, '劉德華', '男', '1970-11-11', '110')"; //statement 用于執(zhí)行靜態(tài) SQL 語(yǔ)句并返回其生成的結(jié)果的對(duì)象 Statement statement = (Statement) connection.createStatement(); int rows = statement.executeUpdate(sql); System.out.println(rows > 0 ? "成功" : "失敗"); //關(guān)閉資源 statement.close(); connection.close(); }
然后我們?cè)偃ゲ樵償?shù)據(jù)庫(kù),就會(huì)發(fā)現(xiàn)已經(jīng)成功啦
3. 相關(guān)類(lèi)的介紹
3.1 Statement
相信對(duì)于上面的代碼中你最好奇的就是Statement這個(gè)類(lèi),我們就來(lái)聊一聊這個(gè)。
基本介紹:
- 用于執(zhí)行靜態(tài)Sql語(yǔ)句并返回其生成結(jié)果
- 在連接建立后,需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),執(zhí)行命名或是SQL語(yǔ)句,可以通過(guò)Statement(存在SQL注入問(wèn)題)PrepardStatement(預(yù)處理) CallableStatement(存儲(chǔ)過(guò)程)
- Statement對(duì)象執(zhí)行SQL語(yǔ)句,存在SQL注入風(fēng)險(xiǎn)
- SQL注入是利用某些系統(tǒng)沒(méi)有對(duì)用戶輸入對(duì)數(shù)據(jù)進(jìn)行充分對(duì)檢查,而在用戶輸入數(shù)據(jù)中注入非法對(duì)SQL語(yǔ)句段或命令,惡意攻擊數(shù)據(jù)庫(kù)
- 要防范SQL注入,只要用PreparedStatement(從Statement擴(kuò)展而來(lái)),取代Statement就可以了
其實(shí)歸根究底,這個(gè)類(lèi)就是一個(gè)用來(lái)調(diào)用執(zhí)行SQL語(yǔ)句的類(lèi)。
3.2 ResultSet[結(jié)果集]
這個(gè)是執(zhí)行查詢的SQL時(shí)返回的對(duì)象,如下面這段代碼
String sql = "select id, name , sex, borndate from actor"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { // 讓光標(biāo)向后移動(dòng),如果沒(méi)有更多行,則返回 false int id = resultSet.getInt(1); //獲取該行的第 1 列 String name = resultSet.getString(2);//獲取該行的第 2 列 String sex = resultSet.getString(3); Date date = resultSet.getDate(4); System.out.println(id + "\t" + name + "\t" + sex + "\t" + date); }
表示數(shù)據(jù)庫(kù)結(jié)果集的數(shù)據(jù)表,通常通過(guò)執(zhí)行查詢數(shù)據(jù)庫(kù)的語(yǔ)句生成。
ResultSet對(duì)象保持一個(gè)光標(biāo)指向其當(dāng)前的數(shù)據(jù)行。 最初,光標(biāo)位于第一行之前。 next方法將光標(biāo)移動(dòng)到下一行,并且由于在ResultSet對(duì)象中沒(méi)有更多行時(shí)返回false ,因此可在while循環(huán)中使用循環(huán)來(lái)遍歷結(jié)果集。
3.3 PreparedStatement
這個(gè)類(lèi)其實(shí)和上面介紹的Statement效果類(lèi)似,相當(dāng)于Statement的改進(jìn)版,增加了預(yù)處理過(guò)程避免了sql注入現(xiàn)象(簡(jiǎn)單來(lái)講就是破獲你的數(shù)據(jù)庫(kù)中的信息),下面我們就來(lái)聊聊它
- PreparedStatement執(zhí)行的SQL語(yǔ)句中的參數(shù)用問(wèn)號(hào)(?)來(lái)表示,調(diào)用PreparedStatement對(duì)象額setXxx()方法來(lái)設(shè)置這些參數(shù),setXxx()方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是要設(shè)置的SQL語(yǔ)句中的參數(shù)的索引(從1開(kāi)始),第二個(gè)是設(shè)置的SQL語(yǔ)句中的參數(shù)的值。
- 調(diào)用executeQuery(),返回ResultSet對(duì)象
- 調(diào)用 executeUpdate(),執(zhí)行增刪改等操作。
其優(yōu)點(diǎn)也是極其明顯的
- 不再使用+拼接SQL語(yǔ)句,減少語(yǔ)法錯(cuò)誤
- 有效的解決了SQL注入問(wèn)題
- 大大減少了編譯次數(shù),效率提高
話不多說(shuō),我們直接上案例
String sql = "select name , pwd from admin where name =? and pwd = ?"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, "劉德華"); preparedStatement.setString(2, "123"); ResultSet resultSet = preparedStatement.executeQuery(sql); if (resultSet.next()) { //如果查詢到一條記錄,則說(shuō)明該管理存在 System.out.println("恭喜, 登錄成功"); } else { System.out.println("對(duì)不起,登錄失敗"); }
4. 關(guān)閉資源
在JDBC編碼過(guò)程中,我們創(chuàng)建了resultSet,statement,connection等資源,這些資源在使用完畢后一定要進(jìn)行關(guān)閉資源,關(guān)閉的過(guò)程中遵循從里到外的原則,因?yàn)樵谠鰟h改查中的操作中都要用到這樣的關(guān)閉操作
resultSet.close(); statement.close(); connection.close();
5. 獲取數(shù)據(jù)庫(kù)連接的五種方式
方式一
直接通過(guò)Driver類(lèi)獲得連接
public void way1() throws SQLException { Driver driver = new Driver(); String url = "jdbc:mysql://localhost:3306/zxy_db01"; Properties info = new Properties(); info.setProperty("user","root"); info.setProperty("psd","123"); Connection connect = driver.connect(url, info); System.out.println(connect); }
方式二
通過(guò)反射的方式加載Driver類(lèi)獲得連接
public void way2() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException { Class<?> clzz = Class.forName("com.mysql.jdbc.Driver"); Driver driver = (Driver) clzz.newInstance(); String url = "jdbc:mysql://localhost:3306/zxy_db01"; Properties info = new Properties(); info.setProperty("user","root"); info.setProperty("psd","123"); Connection connect = driver.connect(url, info); System.out.println(connect); }
方式三
使用DriverManager替換Driver獲得連接
public void way3() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException { Class<?> clzz = Class.forName("com.mysql.jdbc.Driver"); Driver driver = (Driver) clzz.newInstance(); String url="jdbc:mysql://localhost:3306/zxy_db01"; String user="root"; String psw = "123"; DriverManager.registerDriver(driver); Connection connection = DriverManager.getConnection(url,user,password); System.out.println(connection); }
方式四
使用Class.forName自動(dòng)完成驅(qū)動(dòng)注冊(cè)獲得鏈接
public void way4() throws SQLException, ClassNotFoundException { Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/zxy_db01"; String user="root"; String psd = "123"; Connection connection = DriverManager.getConnection(url, user, password); System.out.println(connection); }
方式五
借助配置文件獲得來(lái)獲得連接
user=root psd=123 url=jdbc:mysql://localhost:3306/zxy_db01 driver=com.mysql.jdbc.Driver
public void way5() throws SQLException, ClassNotFoundException, IOException { Properties properties = new Properties(); properties.load(new FileInputStream("src\\mysql.properties")); String user = properties.getProperty("user"); String password = properties.getProperty("psd"); String url = properties.getProperty("url"); String driver = properties.getProperty("driver"); Class.forName(driver); Connection connection = DriverManager.getConnection(url, user, psd); System.out.println(connection); }
相信看完本篇你對(duì)jdbc已經(jīng)有了不錯(cuò)的了解了
總結(jié)
到此這篇關(guān)于一文快速學(xué)會(huì)JDBC及獲取連接的五種方式的文章就介紹到這了,更多相關(guān)學(xué)會(huì)JDBC及獲取連接方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java判斷字符串是否是有效的括號(hào)(實(shí)例詳解)
給定一個(gè)只包括 '(',')','{','}','[',']' 的字符串 s ,判斷字符串是否有效,有效字符串需要滿足:左括號(hào)必須用相同類(lèi)型的右括號(hào)閉合,這篇文章主要介紹了Java判斷字符串是否是有效的括號(hào),需要的朋友可以參考下2023-10-10MyBatis實(shí)現(xiàn)物理分頁(yè)的實(shí)例
這篇文章主要介紹了MyBatis實(shí)現(xiàn)物理分頁(yè)的實(shí)例,MyBatis使用RowBounds實(shí)現(xiàn)的分頁(yè)是邏輯分頁(yè),有興趣的可以了解一下。2017-01-01Java實(shí)現(xiàn)Redis分布式鎖的三種方案匯總
setnx、Redisson、RedLock?都可以實(shí)現(xiàn)分布式鎖,從易到難得排序?yàn)椋簊etnx?<?Redisson?<?RedLock,本文為大家整理了三種方法的實(shí)現(xiàn),希望對(duì)大家有所幫助2023-11-11Spring Boot2.0 @ConfigurationProperties使用詳解
這篇文章主要介紹了Spring Boot2.0 @ConfigurationProperties使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11解決java.sql.Timestamp丟失精度的問(wèn)題
這篇文章主要介紹了解決java.sql.Timestamp丟失精度的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09解決mybatis批量更新出現(xiàn)SQL報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了mybatis批量更新出現(xiàn)SQL報(bào)錯(cuò),解決辦法也很簡(jiǎn)單只需要在application.properties配置文中的數(shù)據(jù)源url后面添加一個(gè)參數(shù),需要的朋友可以參考下2022-02-02更簡(jiǎn)單更高效的Mybatis?Plus最新代碼生成器AutoGenerator
這篇文章主要為大家介紹了更簡(jiǎn)單更高效的Mybatis?Plus最新代碼生成器AutoGenerator使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02詳解@Autowired(required=false)注入注意的問(wèn)題
這篇文章主要介紹了@Autowired(required=false)注入注意的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04