<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ## JDBC插入 數據庫操作總結起來就四個字:增刪改查,行話叫CRUD:Create,Retrieve,Update和Delete。 插入操作是`INSERT`,即插入一條新記錄。通過JDBC進行插入,本質上也是用`PreparedStatement`執行一條SQL語句,不過最后執行的不是`executeQuery()`,而是`executeUpdate()`。示例代碼如下: ``` package day07; import org.apache.log4j.Logger; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class day02jdbc { // 日志 private static Logger logger = Logger.getLogger(day02jdbc.class); // 配置文件 private static String JDBC_MYSQL(String jdbcPATH,String jdbcData) throws Exception{ Properties properties = new Properties(); InputStream iStream = new FileInputStream(new File(jdbcPATH)); properties.load(iStream); String str = properties.getProperty(jdbcData); return str; } // mysql操作 private static String MYSQL() throws Exception { Statement stmt = null; String DB_URL = JDBC_MYSQL("src/day07/jdbcmysql.properties","jdbc.DB_URL"); String USER = JDBC_MYSQL("src/day07/jdbcmysql.properties","jdbc.USER"); String PASS = JDBC_MYSQL("src/day07/jdbcmysql.properties","jdbc.PASS"); String JDBC_DRIVER = JDBC_MYSQL("src/day07/jdbcmysql.properties","jdbc.JDBC_DRIVER"); try { logger.info(Class.forName(JDBC_DRIVER)); Connection conn = DriverManager.getConnection(DB_URL,USER,PASS); logger.info(conn); String sql = "INSERT INTO gin_user(id,name,age,money,Department_id,bonus) values(?,?,?,?,?,?)"; PreparedStatement pr = conn.prepareStatement(sql); pr.setObject(1,25); // id pr.setObject(2,"linda"); // name pr.setObject(3,21); // age pr.setDouble(4,3492.40); // money pr.setObject(5,2390); pr.setObject(6,123); logger.info(pr); int res = pr.executeUpdate(); if (res > 0) { logger.info(res); System.out.println("insert success."); } else { System.out.println("insert faild."); } pr.close(); conn.close(); } catch (Exception e) { System.out.println(e.getMessage()); } return null; } public static void main(String args[]) throws Exception{ MYSQL(); } } ``` ``` public static void main(String args[]) throws Exception{ // MYSQL(); String DB_URL = JDBC_MYSQL("src/day07/jdbcmysql.properties","jdbc.DB_URL"); String USER = JDBC_MYSQL("src/day07/jdbcmysql.properties","jdbc.USER"); String PASS = JDBC_MYSQL("src/day07/jdbcmysql.properties","jdbc.PASS"); String JDBC_DRIVER = JDBC_MYSQL("src/day07/jdbcmysql.properties","jdbc.JDBC_DRIVER"); try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) { try (PreparedStatement pr = conn.prepareStatement( "INSERT INTO gin_user(id,name,age,money,Department_id,bonus) values(?,?,?,?,?,?)")) { pr.setObject(1,26); // id pr.setObject(2,"kkxi"); // name pr.setObject(3,23); // age pr.setDouble(4,1492.40); // money pr.setObject(5,2590); pr.setObject(6,133); int n = pr.executeUpdate(); // 1 } } } } ``` 設置參數與查詢是一樣的,有幾個`?`占位符就必須設置對應的參數。雖然`Statement`也可以執行插入操作,但我們仍然要嚴格遵循*絕不能手動拼SQL字符串*的原則,以避免安全漏洞。 當成功執行`executeUpdate()`后,返回值是`int`,表示插入的記錄數量。此處總是`1`,因為只插入了一條記錄。 <br> <br> ## 插入并獲取主鍵 如果數據庫的表設置了自增主鍵,那么在執行`INSERT`語句時,并不需要指定主鍵,數據庫會自動分配主鍵。對于使用自增主鍵的程序,有個額外的步驟,就是如何獲取插入后的自增主鍵的值。 要獲取自增主鍵,不能先插入,再查詢。因為兩條SQL執行期間可能有別的程序也插入了同一個表。獲取自增主鍵的正確寫法是在創建`PreparedStatement`的時候,指定一個`RETURN_GENERATED_KEYS`標志位,表示JDBC驅動必須返回插入的自增主鍵。示例代碼如下: ``` public static void main(String args[]) throws Exception { // MYSQL(); String DB_URL = JDBC_MYSQL("src/day07/jdbcmysql.properties", "jdbc.DB_URL"); String USER = JDBC_MYSQL("src/day07/jdbcmysql.properties", "jdbc.USER"); String PASS = JDBC_MYSQL("src/day07/jdbcmysql.properties", "jdbc.PASS"); String JDBC_DRIVER = JDBC_MYSQL("src/day07/jdbcmysql.properties", "jdbc.JDBC_DRIVER"); try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) { try (PreparedStatement pr = conn.prepareStatement( "INSERT INTO gin_user(id,name,age,money,Department_id,bonus) values(?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS)) { pr.setObject(1, 27); // id pr.setObject(2, "mmc"); // name pr.setObject(3, 25); // age pr.setDouble(4, 9821.40); // money pr.setObject(5, 3922); pr.setObject(6, 102); int n = pr.executeUpdate(); // 1 try (ResultSet rs = pr.getGeneratedKeys()) { if (rs.next()) { long id = rs.getLong(1); // 注意:索引從1開始 } } } } } ``` 觀察上述代碼,有兩點注意事項: 一是調用`prepareStatement()`時,第二個參數必須傳入常量`Statement.RETURN_GENERATED_KEYS`,否則JDBC驅動不會返回自增主鍵; 二是執行`executeUpdate()`方法后,必須調用`getGeneratedKeys()`獲取一個`ResultSet`對象,這個對象包含了數據庫自動生成的主鍵的值,讀取該對象的每一行來獲取自增主鍵的值。如果一次插入多條記錄,那么這個`ResultSet`對象就會有多行返回值。如果插入時有多列自增,那么`ResultSet`對象的每一行都會對應多個自增值(自增列不一定必須是主鍵)。 <br> <br> ## 更新 更新操作是`UPDATE`語句,它可以一次更新若干列的記錄。更新操作和插入操作在JDBC代碼的層面上實際上沒有區別,除了SQL語句不同: ``` try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) { try (PreparedStatement ps = conn.prepareStatement("UPDATE students SET name=? WHERE id=?")) { ps.setObject(1, "Bob"); // 注意:索引從1開始 ps.setObject(2, 999); int n = ps.executeUpdate(); // 返回更新的行數 } } ``` `executeUpdate()`返回數據庫實際更新的行數。返回結果可能是正數,也可能是0(表示沒有任何記錄更新)。 <br> <br> ### 刪除 刪除操作是`DELETE`語句,它可以一次刪除若干列。和更新一樣,除了SQL語句不同外,JDBC代碼都是相同的: ~~~ try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) { try (PreparedStatement ps = conn.prepareStatement("DELETE FROM students WHERE id=?")) { ps.setObject(1, 999); // 注意:索引從1開始 int n = ps.executeUpdate(); // 刪除的行數 } } ~~~ ### 小結 使用JDBC執行`INSERT`、`UPDATE`和`DELETE`都可視為更新操作; 更新操作使用`PreparedStatement`的`executeUpdate()`進行,返回受影響的行數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看