1. JDBC工具類
使用properties配置文件實現JDBC工具類
1.1 properties配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/數據庫名稱
username=root
password=123456
1.2 JDBC工具類
/**
* JDBC工具類
* @Author: fangju
* @Date: 2019/6/15
*/
public class JDBCUtil {
private static String driver;
private static String url;
private static String username;
private static String password;
//靜態代碼塊,在程序編譯的時候執行
static {
try {
//創建Properties對象
Properties p = new Properties();
//獲取文件輸入流
ClassLoader classloader = JDBCUtil.class.getClassLoader();
URL res = classloader.getResource("jdbc.properties");
String path = res.getPath();
//加載輸入流
p.load(new FileReader(path));
//獲取數據庫連接驅動名字
driver = p.getProperty("driverClassName",null);
//獲取數據庫連接地址
url = p.getProperty("url",null);
//獲取數據庫連接用戶名
username = p.getProperty("username",null);
//獲取數據庫連接密碼
password = p.getProperty("password",null);
if(driver != null && url != null
&& username != null && password != null){
//加載驅動
Class.forName(driver);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲取連接對象
* @return Connection連接對象
*/
public static Connection getConn(){
Connection conn = null;
try {
conn = DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 關閉連接(Connection連接對象必須在最後關閉)
* @param conn Connection連接對象
* @param st 編譯執行對象
* @param rs 結果集
*/
public static void close(Connection conn, Statement st, ResultSet rs){
try {
if(rs != null){
rs.close();
}
if(st != null){
st.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2. CRUD工具類
/**
* 增刪改工具類
* @Author: fangju
* @Date: 2019/6/15
*/
public class CRUDTemplate {
/**
* 增刪改操作
* @param sql 傳入的SQL語句
* @param params 可變參數
* @return 操作結果
*/
public static int executeUpdate(String sql,Object... params){
Connection conn = null;
PreparedStatement psmt = null;
int result = 0;
try {
//獲取數據庫連接對象
conn = JDBCUtil.getConn();
//獲取預編譯語句對象
psmt = conn.prepareStatement(sql);
//給預編譯語句賦值
for (int i = 0; i < params.length; i++) {
psmt.setObject(i+1,params[i]);
}
//執行SQL語句獲取執行結果
result = psmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//關閉數據庫連接
JDBCUtil.close(conn,psmt,null);
}
return result;
}
/**
* 查詢操作
* @param sql SQL語句
* @param handler 判斷查詢一個還是多個
* @param params 可變參數
* @param <T> 具體操作的實體類
* @return 返回IResultSetHandler接口中的泛型
*/
public static <T> T executeQuery(String sql, IResultSetHandler<T> handler,Object... params){
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
//獲取數據庫連接對象
conn = JDBCUtil.getConn();
//獲取預編譯語句對象
psmt = conn.prepareStatement(sql);
//給預編譯語句賦值
for (int i = 0; i < params.length; i++) {
psmt.setObject(i+1,params[i]);
}
//執行SQL語句獲取結果集
rs = psmt.executeQuery();
//處理結果集
return handler.handle(rs);
} catch (Exception e) {
e.printStackTrace();
} finally {
//關閉數據庫連接
JDBCUtil.close(conn,psmt,rs);
}
return null;
}
}
對於查詢,可能返回一個JavaBean對象,也可能返回一個JavaBean的集合,所以我們可以定義一個接口,這個接口專門來處理結果集,接口方法返回的爲泛型參數,具體返回什麼由用戶自己定義。
(1)接口
/**
* 把JDBC返回的結果集封裝成特定類型
* @Author: fangju
* @Date: 2019/6/15
*/
public interface IResultSetHandler<T> {
T handle(ResultSet rs) throws Exception;
}
(2)接口實現類
/**
* 返回一個JavaBean
* @Author: fangju
* @Date: 2019/6/15
*/
public class BeanHandler<T> implements IResultSetHandler<T> {
private Class<T> clazz;
public BeanHandler(Class<T> clazz){
this.clazz = clazz;
}
@Override
public T handle(ResultSet rs) throws Exception{
//結果集默認指向爲第一個數據的前一個
if (rs.next()){
//根據傳入的字節碼創建傳入的指定對象
T obj = clazz.newInstance();
//獲取指定字節碼信息
BeanInfo beanInfo = Introspector.getBeanInfo(clazz,Object.class);
//獲取所有屬性描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd:pds){
//獲取結果集中對應字段名的值
Object o = rs.getObject(pd.getName());
//執行當前方法並傳入參數
pd.getWriteMethod().invoke(obj,o);
}
return obj;
}
return null;
}
}
/**
* 返回一個JavaBean的集合
* @Author: fangju
* @Date: 2019/6/15 17:31
*/
public class BeanListHandler<T> implements IResultSetHandler<List<T>> {
private Class<T> clazz;
public BeanListHandler(Class<T> clazz){
this.clazz = clazz;
}
@Override
public List<T> handle(ResultSet rs) throws Exception {
//獲取指定字節碼信息
BeanInfo beanInfo = Introspector.getBeanInfo(clazz,Object.class);
//獲取所有屬性描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
List<T> list = new ArrayList<>();
while (rs.next()){
T obj = clazz.newInstance();
for (PropertyDescriptor pd:pds){
//獲取結果集中對應字段名的值
Object o = rs.getObject(pd.getName());
//執行當前方法並傳入參數
pd.getWriteMethod().invoke(obj,o);
}
list.add(obj);
}
return list;
}
}
3. 測試
轉自:https://blog.csdn.net/qq_40833790/article/details/92164828
表示感謝!!