這篇文章主要講解了“JDBC常見面試問題有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“JDBC常見面試問題有哪些”吧!
創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站制作與策劃設(shè)計,瑪沁網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:瑪沁等地區(qū)?,斍咦鼍W(wǎng)站價格咨詢:18982081108
JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。
public class BaseTest { protected void initH2db(Connection conn) throws SQLException, ClassNotFoundException, URISyntaxException { Statement st = null; try { String schema = getClass().getResource("/db/schema.sql").toURI().toString().substring(6); String data = getClass().getResource("/db/data.sql").toURI().toString().substring(6); st = conn.createStatement(); // 這一句可以不要 st.execute("drop all objects;"); // 執(zhí)行初始化語句 st.execute("runscript from '" + schema + "'"); st.execute("runscript from '" + data + "'"); } finally { if (Objects.nonNull(st)) { st.close(); } } } }
public class JdbcDemoTest extends BaseTest { @Test public void testJdbcDemo() { String sql = "select `id`, `name`, `age`, `address` from person where name = ?"; Connection conn = null; PreparedStatement stmt = null; ResultSet resultSet = null; try { // 注冊 JDBC 驅(qū)動 Class.forName("org.h3.Driver"); // 打開連接 conn = DriverManager.getConnection("jdbc:h3:mem:ssb_test", "root", "root"); initH2db(conn); // 創(chuàng)建 Statement stmt = conn.prepareStatement(sql); stmt.setString(1, "wyf"); // 執(zhí)行查詢 resultSet = stmt.executeQuery(); // 處理結(jié)果 // 展開結(jié)果集數(shù)據(jù)庫 List<Person> peoples = new ArrayList<>(); while (resultSet.next()) { Person person = new Person(); // 通過字段檢索 person.setId(resultSet.getLong("id")); person.setName(resultSet.getString("name")); person.setAge(resultSet.getInt("age")); person.setAddress(resultSet.getString("address")); peoples.add(person); } System.out.println(JSON.toJSONString(peoples)); } catch (Exception e) { e.printStackTrace(); } finally { // 關(guān)閉資源 if (Objects.nonNull(resultSet)) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (Objects.nonNull(stmt)) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (Objects.nonNull(conn)) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
我們可以看到JDBC操作數(shù)據(jù)庫主要流程為:
注冊 JDBC 驅(qū)動(Class.forName("XXX");)
打開連接(DriverManager.getConnection("url","name","password"))
根據(jù)連接,創(chuàng)建 Statement(conn.prepareStatement(sql))
設(shè)置參數(shù)(stmt.setString(1, "wyf");)
執(zhí)行查詢(stmt.executeQuery();)
處理結(jié)果,結(jié)果集映射(resultSet.next())
關(guān)閉資源(finally)
Statement:用于執(zhí)行不帶參數(shù)的固定SQL語句,并返回它所生成的結(jié)果,每次執(zhí)行SQL時都會編譯SQL。
PreparedStatement:預(yù)編譯的SQL語句的對象,用于執(zhí)行帶參數(shù)的預(yù)編譯的SQL語句。高效,安全,可維護性好。
CallableStatement:用來調(diào)用數(shù)據(jù)庫中存儲過程的接口,如果有輸出參數(shù)要注冊,說明是輸出參數(shù)。
預(yù)編譯SQL使用?
號來占位,在設(shè)置參數(shù)是通過加上單引號''
來防止SQL注入。例如:
select `id`, `name`, `age`, `address` from person where name = ?
最終執(zhí)行時會變成:
select `id`, `name`, `age`, `address` from person where name = 'wyf or id > 0'
通過單引號 ''
來有效防止了or
語句的執(zhí)行。
工作量大,流程長,操作數(shù)據(jù)庫存在很多重復(fù)工作
業(yè)務(wù)代碼和技術(shù)代碼耦合嚴重
每次需要新開連接資源,系統(tǒng)開銷大
連接資源需要手動關(guān)閉,很容易忘記,帶來了隱患
因為上述原因,我們在實際項目開發(fā)過程中幾乎沒有直接使用JDBC來操作數(shù)據(jù)庫的,一般會使用數(shù)據(jù)庫連接池(druid) + ORM 框架(mybatis) 來操作數(shù)據(jù)庫。
連接資源可以重復(fù)使用,減少了系統(tǒng)開銷,提升了系統(tǒng)性能
再也不用擔(dān)心忘記釋放資源,極大的簡化了操作數(shù)據(jù)庫的流程
使技術(shù)代碼和業(yè)務(wù)代碼解耦
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
spring-boot-student-mybatis工程
感謝各位的閱讀,以上就是“JDBC常見面試問題有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對JDBC常見面試問題有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
網(wǎng)站名稱:JDBC常見面試問題有哪些
URL地址:http://jinyejixie.com/article48/peoohp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、動態(tài)網(wǎng)站、網(wǎng)站制作、品牌網(wǎng)站建設(shè)、小程序開發(fā)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)