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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDBC——实现通用的查询

發布時間:2025/3/12 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC——实现通用的查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

上一篇jdbc的文章《JDBC——概述與JDBC的使用》介紹了JDBC的概念和背景知識,同時也討論了獲取數據庫連接的方式,以及簡單的實現了入庫操作(更新、刪除同理)。

本篇博客將會聚焦 PreparedStatement 的查詢操作、以及 ResultSet 的結果集處理邏輯,結合 ResultSetMetaData 和反射技術實現通用的查詢方法。

一、Java與SQL對應數據類型轉換表

Java類型SQL類型
booleanBIT
byteTINYINT
shortSMALLINT
intINTEGER
longBIGINT
StringCHAR、VARCHAR、LONGVARCHAR
byte arrayBINARY、VAR BINARY
java.sql.DateDATE
java.sql.TimeTIME
java.sql.timestampTIMESTAMP

?

?

?

?

?

?

?

?

?

?

?

二、相關類

JDBCUtils 封裝了獲取連接關閉資源等通用操作(封裝邏輯見《JDBC——概述與JDBC的使用》):

import java.io.InputStream; import java.sql.*; import java.util.Properties;public class JDBCUtils {public static Connection getConnection() {Connection connection = null;try {// 默認的識別路徑就是 src 目錄下InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");Properties props = new Properties();props.load(is);String url = props.getProperty("url");String username = props.getProperty("username");String password = props.getProperty("password");String driverName = props.getProperty("driverName");// 加載驅動類Class.forName(driverName);// 獲取連接connection = DriverManager.getConnection(url, username, password);} catch (Exception e) {e.printStackTrace();}return connection;}public static void closeResource(Connection conn, Statement statement, ResultSet rs) {try {if (rs != null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}try {if (statement != null) {statement.close();}} catch (SQLException e) {e.printStackTrace();}try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}} }

二、查詢一條記錄

public static <T> T selectOne(Class<T> clazz, String sql, Object... args) {Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;try {// 獲取數據連接connection = JDBCUtils.getConnection();// 獲取預編譯語句對象ps = connection.prepareStatement(sql);// 填充屬性值,注意下標從 1 開始for (int i = 0; i < args.length; i++) {ps.setObject(i + 1, args[i]);}// 執行查詢,獲取結果集rs = ps.executeQuery();// 獲取結果集的元數據:ResultSetMetaDataResultSetMetaData rsmd = rs.getMetaData();// 通過元數據獲取結果集中的列數int columnCount = rsmd.getColumnCount();// rs.next()方法判斷是否存在下一條,相當于集合迭代器的 hasNext()if (rs.next()) {// 實體類必須包含空參構造器,才可以正常執行 newInstance()T t = clazz.newInstance();for (int i = 0; i < columnCount; i++) {// 獲取別名(getColumnName()是獲取列名,不建議使用)// 下標同樣是從 1 開始String columnLabel = rsmd.getColumnLabel(i + 1);// 獲取列值Object columnVal = rs.getObject(i + 1);// 通過反射封裝對象Field field = clazz.getDeclaredField(columnLabel);field.setAccessible(true);field.set(t, columnVal);}return t;}} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(connection, ps, rs);}return null; }

三、查詢集合

將 if (rs.next()) 換成 while(rs.next())?即可,并通過構造一個 List 存儲取得的對象元素。

總結

只要掌握了獲取一條數據的通用方法,列表的處理邏輯就不在話下了。

需要關注一些重點:

1、PreparedStatement 填充占位符時,下標都是從 1 開始,通用的情況往往不知道填充的參數是何種類型,通過 setObject(..) 即可

2、與增刪改不同的是,執行查詢時,我們需要使用 executeQuery() 方法,并接收返回的 ResultSet 對象

3、ResultSet 并沒有直接存儲返回列的數量,我們需要獲取到 ResultSetMetaData 獲取列的數量,以及列的別名

4、rs.next() 實例方法用于判斷結果集中是否存在下一條數據,它的作用相當于集合迭代器中的 hasNext() ,同時帶有指針下移的操作

5、在使用 clazz.newInstance() 方法獲取對象時,一定要記得實體類必須要有空參構造器

6、使用反射方法封裝對象是唯一通用的方法,這樣才能保證不論我們封裝的是何種類型,都可以在運行時獲取到對應的屬性信息

?

總結

以上是生活随笔為你收集整理的JDBC——实现通用的查询的全部內容,希望文章能夠幫你解決所遇到的問題。

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