JDBC的封裝類構建

openkk 12年前發布 | 34K 次閱讀 JDBC Java開發

在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

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!