java數(shù)據(jù)庫(kù)開(kāi)發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫(kù)
目前此代碼我只用過(guò)mysql和oracle數(shù)據(jù)庫(kù)測(cè)試過(guò),但相信其它數(shù)據(jù)庫(kù)都是可以的,只要導(dǎo)入你需要操作的數(shù)據(jù)庫(kù)jar包,驅(qū)動(dòng)等就可,下面上代碼:
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 對(duì)jdbc的完整封裝 * */ public class JDBCUtil { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; private CallableStatement callableStatement = null;//創(chuàng)建CallableStatement對(duì)象 private Connection conn = null; private PreparedStatement pst = null; private ResultSet rst = null; /* static { try { // 加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序 Class.forName(driver); } catch (ClassNotFoundException e) { System.out.println("加載驅(qū)動(dòng)錯(cuò)誤"); System.out.println(e.getMessage()); } } */ public JDBCUtil(String driver,String url ,String username,String password) { this.driver = driver; this.url = url; this.username = username; this.password = password; } /** * 建立數(shù)據(jù)庫(kù)連接 * @return 數(shù)據(jù)庫(kù)連接 */ public Connection getConnection() { try { // 加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序 try { Class.forName(driver); } catch (ClassNotFoundException e) { System.out.println("加載驅(qū)動(dòng)錯(cuò)誤"); System.out.println(e.getMessage()); e.printStackTrace(); } // 獲取連接 conn = DriverManager.getConnection(url, username, password); } catch (SQLException e) { System.out.println(e.getMessage()); } return conn; } /** * insert update delete SQL語(yǔ)句的執(zhí)行的統(tǒng)一方法 * @param sql SQL語(yǔ)句 * @param params 參數(shù)數(shù)組,若沒(méi)有參數(shù)則為null * @return 受影響的行數(shù) */ public int executeUpdate(String sql, Object[] params) { // 受影響的行數(shù) int affectedLine = 0; try { // 獲得連接 conn = this.getConnection(); // 調(diào)用SQL pst = conn.prepareStatement(sql); // 參數(shù)賦值 if (params != null) { for (int i = 0; i < params.length; i++) { pst.setObject(i + 1, params[i]); } } /*在此 PreparedStatement 對(duì)象中執(zhí)行 SQL 語(yǔ)句, 該語(yǔ)句必須是一個(gè) SQL 數(shù)據(jù)操作語(yǔ)言(Data Manipulation Language,DML)語(yǔ)句,比如 INSERT、UPDATE 或 DELETE 語(yǔ)句;或者是無(wú)返回內(nèi)容的 SQL 語(yǔ)句,比如 DDL 語(yǔ)句。 */ // 執(zhí)行 affectedLine = pst.executeUpdate(); } catch (SQLException e) { System.out.println(e.getMessage()); } finally { // 釋放資源 closeAll(); } return affectedLine; } /** * SQL 查詢將查詢結(jié)果直接放入ResultSet中 * @param sql SQL語(yǔ)句 * @param params 參數(shù)數(shù)組,若沒(méi)有參數(shù)則為null * @return 結(jié)果集 */ private ResultSet executeQueryRS(String sql, Object[] params) { try { // 獲得連接 conn = this.getConnection(); // 調(diào)用SQL pst = conn.prepareStatement(sql); // 參數(shù)賦值 if (params != null) { for (int i = 0; i < params.length; i++) { pst.setObject(i + 1, params[i]); } } // 執(zhí)行 rst = pst.executeQuery(); } catch (SQLException e) { System.out.println(e.getMessage()); } return rst; } /** * SQL 查詢將查詢結(jié)果:一行一列 * @param sql SQL語(yǔ)句 * @param params 參數(shù)數(shù)組,若沒(méi)有參數(shù)則為null * @return 結(jié)果集 */ public Object executeQuerySingle(String sql, Object[] params) { Object object = null; try { // 獲得連接 conn = this.getConnection(); // 調(diào)用SQL pst = conn.prepareStatement(sql); // 參數(shù)賦值 if (params != null) { for (int i = 0; i < params.length; i++) { pst.setObject(i + 1, params[i]); } } // 執(zhí)行 rst = pst.executeQuery(); if(rst.next()) { object = rst.getObject(1); } } catch (SQLException e) { System.out.println(e.getMessage()); } finally { closeAll(); } return object; } /** * 獲取結(jié)果集,并將結(jié)果放在List中 * * @param sql SQL語(yǔ)句 * params 參數(shù),沒(méi)有則為null * @return List * 結(jié)果集 */ public List<Object> excuteQuery(String sql, Object[] params) { // 執(zhí)行SQL獲得結(jié)果集 ResultSet rs = executeQueryRS(sql, params); // 創(chuàng)建ResultSetMetaData對(duì)象 ResultSetMetaData rsmd = null; // 結(jié)果集列數(shù) int columnCount = 0; try { rsmd = rs.getMetaData(); // 獲得結(jié)果集列數(shù) columnCount = rsmd.getColumnCount(); } catch (SQLException e1) { System.out.println(e1.getMessage()); } // 創(chuàng)建List List<Object> list = new ArrayList<Object>(); try { // 將ResultSet的結(jié)果保存到List中 while (rs.next()) { Map<String, Object> map = new HashMap<String, Object>(); for (int i = 1; i <= columnCount; i++) { map.put(rsmd.getColumnLabel(i), rs.getObject(i)); } list.add(map);//每一個(gè)map代表一條記錄,把所有記錄存在list中 } } catch (SQLException e) { System.out.println(e.getMessage()); } finally { // 關(guān)閉所有資源 closeAll(); } return list; } /** * 存儲(chǔ)過(guò)程帶有一個(gè)輸出參數(shù)的方法 * @param sql 存儲(chǔ)過(guò)程語(yǔ)句 * @param params 參數(shù)數(shù)組 * @param outParamPos 輸出參數(shù)位置 * @param SqlType 輸出參數(shù)類型 * @return 輸出參數(shù)的值 */ public Object excuteQuery(String sql, Object[] params,int outParamPos, int SqlType) { Object object = null; conn = this.getConnection(); try { // 調(diào)用存儲(chǔ)過(guò)程 // prepareCall:創(chuàng)建一個(gè) CallableStatement 對(duì)象來(lái)調(diào)用數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程。 callableStatement = conn.prepareCall(sql); // 給參數(shù)賦值 if(params != null) { for(int i = 0; i < params.length; i++) { callableStatement.setObject(i + 1, params[i]); } } // 注冊(cè)輸出參數(shù) callableStatement.registerOutParameter(outParamPos, SqlType); // 執(zhí)行 callableStatement.execute(); // 得到輸出參數(shù) object = callableStatement.getObject(outParamPos); } catch (SQLException e) { System.out.println(e.getMessage()); } finally { // 釋放資源 closeAll(); } return object; } /** * 關(guān)閉所有資源 */ private void closeAll() { // 關(guān)閉結(jié)果集對(duì)象 if (rst != null) { try { rst.close(); } catch (SQLException e) { System.out.println(e.getMessage()); } } // 關(guān)閉PreparedStatement對(duì)象 if (pst != null) { try { pst.close(); } catch (SQLException e) { System.out.println(e.getMessage()); } } // 關(guān)閉CallableStatement 對(duì)象 if (callableStatement != null) { try { callableStatement.close(); } catch (SQLException e) { System.out.println(e.getMessage()); } } // 關(guān)閉Connection 對(duì)象 if (conn != null) { try { conn.close(); } catch (SQLException e) { System.out.println(e.getMessage()); } } } }
使用的時(shí)候直接new一個(gè)JDBCUtil類,然后對(duì)傳入對(duì)應(yīng)的sql語(yǔ)句,例:
public class JDBCTest { public static void main(String[] args) { // TODO Auto-generated method stub JDBCUtil jdbcUtil = new JDBCUtil("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/myhelp?useUnicode=true&characterEncoding=utf-8&useSSL=false","root","142014068"); String sql = "delete from menu_detial where count=6"; System.out.println(jdbcUtil.executeUpdate(sql, null)); } }
更多關(guān)于java數(shù)據(jù)庫(kù)開(kāi)發(fā)的文章請(qǐng)查看下面的相關(guān)鏈接
- Java基礎(chǔ)之JDBC的數(shù)據(jù)庫(kù)連接與基本操作
- java使用JDBC連接數(shù)據(jù)庫(kù)的五種方式(IDEA版)
- Java連接 JDBC基礎(chǔ)知識(shí)(操作數(shù)據(jù)庫(kù):增刪改查)
- Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié)
- Java 如何使用JDBC連接數(shù)據(jù)庫(kù)
- 詳解Java數(shù)據(jù)庫(kù)連接JDBC基礎(chǔ)知識(shí)(操作數(shù)據(jù)庫(kù):增刪改查)
- Java如果通過(guò)jdbc操作連接oracle數(shù)據(jù)庫(kù)
- Java連接數(shù)據(jù)庫(kù)JDBC技術(shù)之prepareStatement的詳細(xì)介紹
- Java之jdbc連接mysql數(shù)據(jù)庫(kù)的方法步驟詳解
- Java基礎(chǔ)開(kāi)發(fā)之JDBC操作數(shù)據(jù)庫(kù)增刪改查,分頁(yè)查詢實(shí)例詳解
- java數(shù)據(jù)庫(kù)開(kāi)發(fā)之JDBC基礎(chǔ)使用方法及實(shí)例詳解
- Java JDBC連接數(shù)據(jù)庫(kù)常見(jiàn)操作總結(jié)
- Java使用JDBC連接postgresql數(shù)據(jù)庫(kù)示例
- Java實(shí)現(xiàn)JDBC連接數(shù)據(jù)庫(kù)簡(jiǎn)單案例
- java使用jdbc連接數(shù)據(jù)庫(kù)簡(jiǎn)單實(shí)例
- Java使用jdbc連接MySQL數(shù)據(jù)庫(kù)實(shí)例分析
- Java基于JDBC連接數(shù)據(jù)庫(kù)及顯示數(shù)據(jù)操作示例
- 詳細(xì)說(shuō)明關(guān)于Java的數(shù)據(jù)庫(kù)連接(JDBC)
相關(guān)文章
SpringBoot如何使用applicationContext.xml配置文件
這篇文章主要介紹了SpringBoot使用applicationContext.xml配置文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06詳解Java的MyBatis框架中動(dòng)態(tài)SQL的基本用法
這篇文章主要介紹了詳解Java的MyBatis框架中動(dòng)態(tài)SQL的基本用法,文中列出了一些常用SQL動(dòng)態(tài)語(yǔ)句進(jìn)行講解,需要的朋友可以參考下2016-04-04Java中反射reflect的基礎(chǔ)知識(shí)講解
這篇文章主要介紹了Java中反射reflect的基礎(chǔ)知識(shí)講解,Java中的反射,它算是Java當(dāng)中非常底層的一個(gè)技術(shù),平時(shí)我們我們用得不多,實(shí)際上它也的確非常復(fù)雜同時(shí)也難以理解,但是涉及到底層的東西Java都給我們封裝好了,我們直接拿來(lái)調(diào)用即可,需要的朋友可以參考下2023-10-10