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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JDBC的封装类

發布時間:2025/1/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC的封装类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在JAVA中JDBC的訪問是比較麻煩的,為此可以使用封裝的方法構建一個封裝性較好的JDBC工具類,提高編程的可復用性。

具體的想法是:可以生成一個類封裝JDBC的connection和statement的構建,使用Property配置文件來保存JDBC訪問的路徑以及驅動,這樣可以有較好的可維護性,再使用反射特性構建一個DataUtil類封裝JDBC獲取的結果集,并把其顯示出來。

1.首先新建一個jdbc.property文件存放jdbc的相關屬性

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/user jdbc.user=root jdbc.pass=123456
通過PropertyUtil類可以獲得jdbc的屬性

package jdbc; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * 屬性工具類 */ public class PropertiesUtil { //屬性列表 private static Properties properties = new Properties(); //配置文件的路徑 private static String CONFIG = "/cfg/jdbc.properties"; //讀取資源文件, 設置輸入流 private static InputStream is = PropertiesUtil.class.getResourceAsStream(CONFIG); //數據庫驅動 public static String JDBC_DRIVER; //jdbc連接url public static String JDBC_URL; //數據庫用戶名 public static String JDBC_USER; //數據庫密碼 public static String JDBC_PASS; static { try { //加載輸入流 properties.load(is); //獲得配置的各個屬性 JDBC_DRIVER = properties.getProperty("jdbc.driver"); JDBC_URL = properties.getProperty("jdbc.url"); JDBC_USER = properties.getProperty("jdbc.user"); JDBC_PASS = properties.getProperty("jdbc.pass"); } catch (IOException e) { e.printStackTrace(); } } }
2.建立JDBCExecutor類來封裝JDBC的數據源獲取工作,其中通過單例模式獲取數據庫的連接

package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JDBCExecutor{ //獲得驅動 private static String DRIVER = PropertiesUtil.JDBC_DRIVER; //獲得url private static String URL = PropertiesUtil.JDBC_URL; //獲得連接數據庫的用戶名 private static String USER = PropertiesUtil.JDBC_USER; //獲得連接數據庫的密碼 private static String PASS = PropertiesUtil.JDBC_PASS; //連接對象 private Connection connection; //維護一個本類型的對象 private static JDBCExecutor jdbcExecutor; //Statement對象,可以執行SQL語句并返回結果 private Statement stmt; //私有構造器 private JDBCExecutor() { try { //初始化JDBC驅動并讓驅動加載到jvm中 Class.forName(DRIVER); //創建數據庫連接 connection = DriverManager.getConnection(URL, USER, PASS); //創建Statement對象 stmt = connection.createStatement(); } catch (Exception e) { throw new JDBCException(e.getMessage()); } } //提供一個靜態方法返回本類的實例 public static JDBCExecutor getJDBCExecutor() { //如果本類所維護jdbcExecutor屬性為空,則調用私有的構造器獲得實例 if (jdbcExecutor == null) { jdbcExecutor = new JDBCExecutor(); } return jdbcExecutor; } /* * 執行一句查詢的sql */ public ResultSet executeQuery(String sql) { try { //利用Statement對象執行參數的sql ResultSet result = stmt.executeQuery(sql); return result; } catch (Exception e) { throw new QueryException(e.getMessage()); } } //執行單句INSERT、UPDATE 或 DELETE 語句, 如果執行INSERT時, 返回主鍵 public int executeUpdate(String sql) { int result = -1; try { //執行SQL語句 stmt.executeUpdate(sql); //獲得主鍵 ResultSet rs = stmt.getGeneratedKeys(); while(rs.next()) { //返回最后一個主鍵 result = rs.getInt(1); } rs.close(); return result; } catch (Exception e) { throw new QueryException(e.getMessage()); } } }
3.為了將JDBC查詢操作的數據獲取,封裝數據獲取的類

package jdbc; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Collection; import vo.User; import dao.impl.UserDAOImpl; /** * 數據轉換工具類 */ public class DataUtil { static UserDAOImpl us=new UserDAOImpl(); //將rs中的值封裝成一個集合 public static Collection getDatas(Collection result, ResultSet rs, Class clazz) { try { while (rs.next()) { //創建類的實例 Object vo = clazz.newInstance(); //獲取本對象的屬性 Field[] fields = clazz.getDeclaredFields(); //獲取父類的屬性 // Field[] superFields = clazz.getSuperclass().getDeclaredFields(); // //父類的屬性和自己的屬性相加 // Field[] allFields = addFields(superFields, fields); //遍歷所有的屬性 for (Field field : fields) { //獲得setter方法的方法名 String setterMethodName = getSetterMethodName(field.getName()); //獲得setter方法 Method setterMethod = clazz.getMethod(setterMethodName, field.getType()); invokeMethod(rs, field, vo, setterMethod); } result.add(vo); } rs.close(); } catch (Exception e) { e.printStackTrace(); throw new DataException(e.getMessage()); } return result; } //執行一個方法, 從ResultSet中獲取一個字段的數據, 調用vo的setter方法 private static void invokeMethod(ResultSet rs, Field field, Object vo, Method setterMethod) { try { //當使用ResultSet獲取某個字段的時候, 如果沒有該字段, 會出現SQLException, 在這里忽略該異常 String value = rs.getString(field.getName()); //從ResultSet中獲取與該對象屬性名一致的字段, 并執行setter方法 setterMethod.invoke(vo, value); } catch (Exception e) { //忽略異常 } } //根據屬性名獲得setter方法的方法名 private static String getSetterMethodName(String fieldName) { String begin = fieldName.substring(0, 1).toUpperCase(); String end = fieldName.substring(1, fieldName.length()); String methodName = "set" + begin + end; return methodName; } //測試方法 public static void main(String[] args) { JDBCExecutor executor = JDBCExecutor.getJDBCExecutor(); us.AddUser(new User("111",12,"333")); // ResultSet rs = executor.executeQuery("select * from user"); // Collection<User> result = DataUtil.getDatas(new ArrayList<User>(), rs, // User.class); // for (User user : result) { // System.out.println(user.getName()); // } } }
通過上面Main方法中的調用,可以看出能夠很輕易的操縱JDBC連接了。


? ? ? ? ? ? ? ? ? ?轉載自:http://blog.csdn.net/rommel1/article/details/7294501 ? ?-----------感謝作者的無私奉獻

總結

以上是生活随笔為你收集整理的JDBC的封装类的全部內容,希望文章能夠幫你解決所遇到的問題。

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