91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JDBC常見面試問題有哪些

發布時間:2021-06-29 10:46:10 來源:億速云 閱讀:190 作者:chen 欄目:大數據

這篇文章主要講解了“JDBC常見面試問題有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JDBC常見面試問題有哪些”吧!

JDBC(Java Data Base Connectivity,java數據庫連接)是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。

初始化H2數據庫

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();
            }
        }
    }
}

JDBC 操作數據庫流程

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操作數據庫主要流程為:

  1. 注冊 JDBC 驅動(Class.forName("XXX");)

  2. 打開連接(DriverManager.getConnection("url","name","password"))

  3. 根據連接,創建 Statement(conn.prepareStatement(sql))

  4. 設置參數(stmt.setString(1, "wyf");)

  5. 執行查詢(stmt.executeQuery();)

  6. 處理結果,結果集映射(resultSet.next())

  7. 關閉資源(finally)

Statement、PreparedStatement和CallableStatement的區別

  • Statement:用于執行不帶參數的固定SQL語句,并返回它所生成的結果,每次執行SQL時都會編譯SQL。

  • PreparedStatement:預編譯的SQL語句的對象,用于執行帶參數的預編譯的SQL語句。高效,安全,可維護性好。

  • CallableStatement:用來調用數據庫中存儲過程的接口,如果有輸出參數要注冊,說明是輸出參數。

PreparedStatement 怎么防止的SQL注入

預編譯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 編程的缺點

  • 工作量大,流程長,操作數據庫存在很多重復工作

  • 業務代碼和技術代碼耦合嚴重

  • 每次需要新開連接資源,系統開銷大

  • 連接資源需要手動關閉,很容易忘記,帶來了隱患

因為上述原因,我們在實際項目開發過程中幾乎沒有直接使用JDBC來操作數據庫的,一般會使用數據庫連接池(druid) + ORM 框架(mybatis) 來操作數據庫。

使用連接池和ORM框架的優點

  • 連接資源可以重復使用,減少了系統開銷,提升了系統性能

  • 再也不用擔心忘記釋放資源,極大的簡化了操作數據庫的流程

  • 使技術代碼和業務代碼解耦

源碼

https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

spring-boot-student-mybatis工程

感謝各位的閱讀,以上就是“JDBC常見面試問題有哪些”的內容了,經過本文的學習后,相信大家對JDBC常見面試問題有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜黄县| 盐山县| 凤冈县| 巴里| 平罗县| 长宁区| 长汀县| 横峰县| 木兰县| 文山县| 临沭县| 临泽县| 长沙县| 高碑店市| 大埔区| 即墨市| 饶河县| 内乡县| 子洲县| 乐平市| 凯里市| 会宁县| 乐陵市| 大新县| 武鸣县| 台北市| 东乡| 桃园县| 麻栗坡县| 文山县| 南召县| 资溪县| 富阳市| 伊春市| 黔东| 双峰县| 盱眙县| 尉犁县| 夏河县| 云浮市| 南皮县|