JDBC的封裝類構(gòu)建
在JAVA中JDBC的訪問是比較麻煩的,為此可以使用封裝的方法構(gòu)建一個(gè)封裝性較好的JDBC工具類,提高編程的可復(fù)用性。
具體的想法是:可以生成一個(gè)類封裝JDBC的connection和statement的構(gòu)建,使用Property配置文件來保存JDBC訪問的路徑以及驅(qū)動(dòng),這樣可以有較好的可維護(hù)性,再使用反射特性構(gòu)建一個(gè)DataUtil類封裝JDBC獲取的結(jié)果集,并把其顯示出來。
1.首先新建一個(gè)jdbc.property文件存放jdbc的相關(guān)屬性
- 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";
 - //讀取資源文件, 設(shè)置輸入流
 - private static InputStream is = PropertiesUtil.class.getResourceAsStream(CONFIG);
 - //數(shù)據(jù)庫驅(qū)動(dòng)
 - public static String JDBC_DRIVER;
 - //jdbc連接url
 - public static String JDBC_URL;
 - //數(shù)據(jù)庫用戶名
 - public static String JDBC_USER;
 - //數(shù)據(jù)庫密碼
 - public static String JDBC_PASS;
 - static {
 - try {
 - //加載輸入流
 - properties.load(is);
 - //獲得配置的各個(gè)屬性
 - 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的數(shù)據(jù)源獲取工作,其中通過單例模式獲取數(shù)據(jù)庫的連接
- package jdbc;
 - import java.sql.Connection;
 - import java.sql.DriverManager;
 - import java.sql.ResultSet;
 - import java.sql.Statement;
 - public class JDBCExecutor{
 - //獲得驅(qū)動(dòng)
 - private static String DRIVER = PropertiesUtil.JDBC_DRIVER;
 - //獲得url
 - private static String URL = PropertiesUtil.JDBC_URL;
 - //獲得連接數(shù)據(jù)庫的用戶名
 - private static String USER = PropertiesUtil.JDBC_USER;
 - //獲得連接數(shù)據(jù)庫的密碼
 - private static String PASS = PropertiesUtil.JDBC_PASS;
 - //連接對象
 - private Connection connection;
 - //維護(hù)一個(gè)本類型的對象
 - private static JDBCExecutor jdbcExecutor;
 - //Statement對象,可以執(zhí)行SQL語句并返回結(jié)果
 - private Statement stmt;
 - //私有構(gòu)造器
 - private JDBCExecutor() {
 - try {
 - //初始化JDBC驅(qū)動(dòng)并讓驅(qū)動(dòng)加載到j(luò)vm中
 - Class.forName(DRIVER);
 - //創(chuàng)建數(shù)據(jù)庫連接
 - connection = DriverManager.getConnection(URL, USER, PASS);
 - //創(chuàng)建Statement對象
 - stmt = connection.createStatement();
 - } catch (Exception e) {
 - throw new JDBCException(e.getMessage());
 - }
 - }
 - //提供一個(gè)靜態(tài)方法返回本類的實(shí)例
 - public static JDBCExecutor getJDBCExecutor() {
 - //如果本類所維護(hù)jdbcExecutor屬性為空,則調(diào)用私有的構(gòu)造器獲得實(shí)例
 - if (jdbcExecutor == null) {
 - jdbcExecutor = new JDBCExecutor();
 - }
 - return jdbcExecutor;
 - }
 - /*
 - * 執(zhí)行一句查詢的sql
 - */
 - public ResultSet executeQuery(String sql) {
 - try {
 - //利用Statement對象執(zhí)行參數(shù)的sql
 - ResultSet result = stmt.executeQuery(sql);
 - return result;
 - } catch (Exception e) {
 - throw new QueryException(e.getMessage());
 - }
 - }
 - //執(zhí)行單句INSERT、UPDATE 或 DELETE 語句, 如果執(zhí)行INSERT時(shí), 返回主鍵
 - public int executeUpdate(String sql) {
 - int result = -1;
 - try {
 - //執(zhí)行SQL語句
 - stmt.executeUpdate(sql);
 - //獲得主鍵
 - ResultSet rs = stmt.getGeneratedKeys();
 - while(rs.next()) {
 - //返回最后一個(gè)主鍵
 - result = rs.getInt(1);
 - }
 - rs.close();
 - return result;
 - } catch (Exception e) {
 - throw new QueryException(e.getMessage());
 - }
 - }
 - }
 
3.為了將JDBC查詢操作的數(shù)據(jù)獲取,封裝數(shù)據(jù)獲取的類
- 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;
 - /**
 - * 數(shù)據(jù)轉(zhuǎn)換工具類
 - */
 - public class DataUtil {
 - static UserDAOImpl us=new UserDAOImpl();
 - //將rs中的值封裝成一個(gè)集合
 - public static Collection getDatas(Collection result, ResultSet rs, Class clazz) {
 - try {
 - while (rs.next()) {
 - //創(chuàng)建類的實(shí)例
 - 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;
 - }
 - //執(zhí)行一個(gè)方法, 從ResultSet中獲取一個(gè)字段的數(shù)據(jù), 調(diào)用vo的setter方法
 - private static void invokeMethod(ResultSet rs, Field field, Object vo,
 - Method setterMethod) {
 - try {
 - //當(dāng)使用ResultSet獲取某個(gè)字段的時(shí)候, 如果沒有該字段, 會(huì)出現(xiàn)SQLException, 在這里忽略該異常
 - String value = rs.getString(field.getName());
 - //從ResultSet中獲取與該對象屬性名一致的字段, 并執(zhí)行setter方法
 - setterMethod.invoke(vo, value);
 - } catch (Exception e) {
 - //忽略異常
 - }
 - }
 - //根據(jù)屬性名獲得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方法中的調(diào)用,可以看出能夠很輕易的操縱JDBC連接了。
原文鏈接:http://blog.csdn.net/rommel1/article/details/7294501
【編輯推薦】















 
 
 





 
 
 
 