您好,登錄后才能下訂單哦!
這篇文章主要講解了“JDBC常見面試問題有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JDBC常見面試問題有哪些”吧!
JDBC(Java Data Base Connectivity,java數據庫連接)是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。
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;"); // 執行初始化語句 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 驅動 Class.forName("org.h3.Driver"); // 打開連接 conn = DriverManager.getConnection("jdbc:h3:mem:ssb_test", "root", "root"); initH2db(conn); // 創建 Statement stmt = conn.prepareStatement(sql); stmt.setString(1, "wyf"); // 執行查詢 resultSet = stmt.executeQuery(); // 處理結果 // 展開結果集數據庫 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 { // 關閉資源 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操作數據庫主要流程為:
注冊 JDBC 驅動(Class.forName("XXX");)
打開連接(DriverManager.getConnection("url","name","password"))
根據連接,創建 Statement(conn.prepareStatement(sql))
設置參數(stmt.setString(1, "wyf");)
執行查詢(stmt.executeQuery();)
處理結果,結果集映射(resultSet.next())
關閉資源(finally)
Statement:用于執行不帶參數的固定SQL語句,并返回它所生成的結果,每次執行SQL時都會編譯SQL。
PreparedStatement:預編譯的SQL語句的對象,用于執行帶參數的預編譯的SQL語句。高效,安全,可維護性好。
CallableStatement:用來調用數據庫中存儲過程的接口,如果有輸出參數要注冊,說明是輸出參數。
預編譯SQL使用?
號來占位,在設置參數是通過加上單引號''
來防止SQL注入。例如:
select `id`, `name`, `age`, `address` from person where name = ?
最終執行時會變成:
select `id`, `name`, `age`, `address` from person where name = 'wyf or id > 0'
通過單引號 ''
來有效防止了or
語句的執行。
工作量大,流程長,操作數據庫存在很多重復工作
業務代碼和技術代碼耦合嚴重
每次需要新開連接資源,系統開銷大
連接資源需要手動關閉,很容易忘記,帶來了隱患
因為上述原因,我們在實際項目開發過程中幾乎沒有直接使用JDBC來操作數據庫的,一般會使用數據庫連接池(druid) + ORM 框架(mybatis) 來操作數據庫。
連接資源可以重復使用,減少了系統開銷,提升了系統性能
再也不用擔心忘記釋放資源,極大的簡化了操作數據庫的流程
使技術代碼和業務代碼解耦
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
spring-boot-student-mybatis工程
感謝各位的閱讀,以上就是“JDBC常見面試問題有哪些”的內容了,經過本文的學習后,相信大家對JDBC常見面試問題有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。