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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JDBC 工具类

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

?

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

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

?

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

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

[java] view plaincopy
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的數據源獲取工作,其中通過單例模式獲取數據庫的連接

[java] view plaincopy
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查詢操作的數據獲取,封裝數據獲取的類

[java] view plaincopy
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

轉載于:https://www.cnblogs.com/szlwork/p/3333208.html

總結

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

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