日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java数据库编程——执行查询操作(二)

發布時間:2023/12/3 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java数据库编程——执行查询操作(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】README

1) 本文部分文字描述和source code 均轉自 core java volume 2 , 旨在理解 java數據庫編程——執行查詢操作(二) 的基礎知識 ;
2) 本文和 java數據庫編程——執行查詢操作(一) 是姊妹篇, 共同組成了 java數據庫編程——執行查詢操作的全部內容, for java數據庫編程——執行查詢操作(一), please visit http://blog.csdn.net/PacosonSWJTU/article/details/50628980 ;
3)for database connection config, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/database.properties


【1】SQL轉義

1)轉義定義: 轉義語法支持各種數據庫普遍支持的特性, 但是數據庫使用的是與數據庫相關的語法變體, 因此,將轉義語法轉譯為 特定數據庫的語法是JDBC 驅動程序的任務之一。 (干貨——將轉義語法轉譯為 特定數據庫的語法是JDBC 驅動程序的任務之一)
2)轉義主要用于下列特性(Character):

  • C1)日期和時間字面常量;
  • C2)調用標量函數;
  • C3)調用存儲過程;
  • C4)外連接;
  • C5) 在 like 子句中的 轉義字符;
  • 2.1)應該使用d, t, ts 來表示 DATE, TIME 和 TIMESTAMP的值:

    {d, ‘2008-01-24’}
    {t, ‘23:59:59’}
    {ts, ‘2008-01-24 23:59:59.999’}

  • 2.2)標量函數: 是指僅返回一個值的函數;要調用函數, 需要嵌入標準的函數名和參數: (干貨——標量函數定義)
    {fn left(?, 20)}
    {fn user() }

  • 2.3 )存儲過程: 是在數據庫中執行的用數據庫相關的語言編寫的過程。要調用存儲過程, 需要使用 call 轉移命令, 其中在存儲過程沒有任何參數的時候, 就不用加上括號。另外,應該用=來捕獲存儲過程的返回值; (干貨——存儲過程定義)

    {call PROC1(?, ?)}
    {call PROC2}
    {call ?=PROC3(?)}

  • 2.4)外連接;

  • 2.5) _ 和 % 字符在 LIKE 子句中具有特殊含義: 用來匹配一個字符或一個字符序列。 目前并不存在任何在字面上使用它們的標準方式, 所以如果想要匹配所有包含_ 字符的字符串, 就必須使用下面結構: (干貨——_ 和 % 字符在 LIKE 子句中具有特殊含義)
    …. where ? like %!_% {escape ‘!’}
    這里, 我們將 ! 定義為 轉移字符, 而 !_ 組合表示字面常量下劃線; (干貨—— 嘆號! 定義為轉移字符)

【2】多結果集

0)多結果集定義: 在執行存儲過程,或在使用允許在單個查詢中提交多個select 語句的數據庫時,一個查詢有可能會返回多個結果集。 (干貨——多結果集定義)
1)下面是獲取結果集的步驟: (干貨——獲取結果集的步驟)

  • step1)使用execute 方法來執行 sql 語句;
  • step2) 獲取第一個結果集或更新計數;
  • step3)重復調用 getMoreResults 方法以移動到下一個結果集;
  • step4) 當不存在更多的結果集或更新計數時, 完成操作;

  • 1.1) 如果由多結果集構成的鏈中的下一項是結果集, execute 和 getMoreResults 方法將返回 true, 而如果在鏈中的下一項不是更新計數,getUpdateCount 方法將返回-1;

  • 1.2)下面的循環遍歷所有結果集:
boolean isResult = stat .execute(command); boolean done = false; while(!done) {if(isResult){ResultSet result = stat.getResultSet()do sth with result}else{int updateCount = stat.getUpdateCount();if(updateCount >= 0)do sth with updateCountelsedone = true;}if(!done)isResult = stat.getMoreResults(); }

2)看個多結果集的荔枝:

  • 2.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/execute_select/OneCommitMultipleSelect.java
  • 2.2)key source code at a glance:
package com.corejava.chapter4;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;public class OneCommitMultipleSelect {private static String cur_dir = System.getProperty("user.dir") + File.separator + "com" + File.separator + "corejava" + File.separator + "chapter4" + File.separator;// insert and select blob objpublic static void main(String[] args){try{try(Connection conn = getConnection()){// query starts. one sql commits multiple select statements.// String sql = "select id from student;select name from student";String sql = "call multi_select()";Statement stat = conn.createStatement(); boolean isResult = stat.execute(sql);boolean done = false;if(isResult){ResultSet result = stat.getResultSet();while(result.next()) // print result set named id {System.out.println("student.id = " + result.getInt(1));}}// 重復調用 getMoreResults 方法以移動到下一個結果集if((isResult = stat.getMoreResults())){ResultSet result = stat.getResultSet();while(result.next()) // print result set named 'name' {System.out.println("student.name = " + result.getString(1));}}System.out.println("the last stat.getMoreResults() == " + stat.getMoreResults());stat.close();conn.close();}}catch(Exception e){e.printStackTrace();}}public static Connection getConnection() throws IOException, SQLException{Properties prop = new Properties();try(InputStream in = Files.newInputStream(Paths.get(cur_dir + "database.properties"))){prop.load(in);}String drivers = prop.getProperty("jdbc.drivers");if(drivers != null){System.setProperty("jdbc.drivers", drivers); // register drivers for accessing database }String url = prop.getProperty("jdbc.url");String user = prop.getProperty("jdbc.username");String pass = prop.getProperty("jdbc.password");return DriverManager.getConnection(url, user, pass);} }
  • 2.3)relative printing results as follows:

Complementary)

  • C1)怎樣創建+查看+調用存儲過程;

  • C2)在創建存儲過程的命令行代碼中, delimiter // 以及 最后的 end// 是什么意思?
    它其實就是一個分隔符而已, 表明分隔符內的 分號; 并不表示輸入結束,輸入結束的標志是配對的 ‘//’: for detailed info , please visit http://database.51cto.com/art/201011/235017.htm


【3】獲取自動生成鍵

1)當我們向數據庫插入一個新行, 且其鍵自動生成時,可以實現下面的代碼來獲取這個鍵:

stmt.executeUpdate(insertStatement, Statement.RETURN_GENERATED_KEYS); // 自動生成主鍵; ResultSet rs = stmt.getGeneratorKeys(); // 返回自動生成鍵的結果集; if(rs.next()) {int key = rs.getInt(1);... }

2)看個獲取自動生成鍵的荔枝:

  • 2.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/execute_select/MyGetPrimaryKey.java
  • 2.2)key source code at a glance:
public static void main1(String[] args) throws SQLException, IOException{ try{try(Connection conn = getConnection()){String sql = "insert employee(name, salary, address) values('zhangsan',1000,'beijing')";Statement stat = conn.createStatement();stat.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);ResultSet rs = stat.getGeneratedKeys();if(rs.next()){System.out.println(rs.getInt(1)); // print generated keys}}}catch(Exception e){e.printStackTrace();}}public static Connection getConnection() throws IOException, SQLException{Properties prop = new Properties();try(InputStream in = Files.newInputStream(Paths.get(cur_dir + "database.properties"))){prop.load(in);}String drivers = prop.getProperty("jdbc.drivers");if(drivers != null){System.setProperty("jdbc.drivers", drivers); // register drivers for accessing database }String url = prop.getProperty("jdbc.url");String user = prop.getProperty("jdbc.username");String pass = prop.getProperty("jdbc.password");return DriverManager.getConnection(url, user, pass);}
  • 2.3)relative printing results as follows:

總結

以上是生活随笔為你收集整理的java数据库编程——执行查询操作(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。