JDBC的封裝類構(gòu)建
在JAVA中JDBC的訪問(wèn)是比較麻煩的,為此可以使用封裝的方法構(gòu)建一個(gè)封裝性較好的JDBC工具類,提高編程的可復(fù)用性。
具體的想法是:可以生成一個(gè)類封裝JDBC的connection和statement的構(gòu)建,使用Property配置文件來(lái)保存JDBC訪問(wèn)的路徑以及驅(qū)動(dòng),這樣可以有較好的可維護(hù)性,再使用反射特性構(gòu)建一個(gè)DataUtil類封裝JDBC獲取的結(jié)果集,并把其顯示出來(lái)。
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
通過(guò)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ù)庫(kù)驅(qū)動(dòng)
- public static String JDBC_DRIVER;
- //jdbc連接url
- public static String JDBC_URL;
- //數(shù)據(jù)庫(kù)用戶名
- public static String JDBC_USER;
- //數(shù)據(jù)庫(kù)密碼
- 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類來(lái)封裝JDBC的數(shù)據(jù)源獲取工作,其中通過(guò)單例模式獲取數(shù)據(jù)庫(kù)的連接
- 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ù)庫(kù)的用戶名
- private static String USER = PropertiesUtil.JDBC_USER;
- //獲得連接數(shù)據(jù)庫(kù)的密碼
- private static String PASS = PropertiesUtil.JDBC_PASS;
- //連接對(duì)象
- private Connection connection;
- //維護(hù)一個(gè)本類型的對(duì)象
- private static JDBCExecutor jdbcExecutor;
- //Statement對(duì)象,可以執(zhí)行SQL語(yǔ)句并返回結(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ù)庫(kù)連接
- connection = DriverManager.getConnection(URL, USER, PASS);
- //創(chuàng)建Statement對(duì)象
- 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對(duì)象執(zhí)行參數(shù)的sql
- ResultSet result = stmt.executeQuery(sql);
- return result;
- } catch (Exception e) {
- throw new QueryException(e.getMessage());
- }
- }
- //執(zhí)行單句INSERT、UPDATE 或 DELETE 語(yǔ)句, 如果執(zhí)行INSERT時(shí), 返回主鍵
- public int executeUpdate(String sql) {
- int result = -1;
- try {
- //執(zhí)行SQL語(yǔ)句
- 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();
- //獲取本對(duì)象的屬性
- 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í)候, 如果沒(méi)有該字段, 會(huì)出現(xiàn)SQLException, 在這里忽略該異常
- String value = rs.getString(field.getName());
- //從ResultSet中獲取與該對(duì)象屬性名一致的字段, 并執(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;
- }
- //測(cè)試方法
- 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());
- // }
- }
- }
通過(guò)上面Main方法中的調(diào)用,可以看出能夠很輕易的操縱JDBC連接了。
原文鏈接:http://blog.csdn.net/rommel1/article/details/7294501
【編輯推薦】