完整的jdbc操作資料庫程式碼記錄
很久的程式碼整理一下分享給大家,記錄給自己
(一)DBC操作資料庫的基本步驟:
1)載入(註冊)資料庫驅動(到JVM)。
2)建立(獲取)資料庫連線。
3)建立(獲取)資料庫操作物件。
4)定義操作的SQL語句。
5)執行資料庫操作。
6)獲取並操作結果集。
7)關閉物件,回收資料庫資源(關閉結果集-->關閉資料庫操作物件-->關閉連線)。
(二)基本屬性值類:該類使用了單例模式來載入資料庫的基本資訊,程式碼如下,
package com.shuang.commons; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * 注意繼承Properties類 * @author shuang * */ public class Env extends Properties { /** * */ private static final long serialVersionUID = 1L; private static Env instance; /** * 構造方法私有化 */ private Env(){ try {//以流的形式載入配置檔案資訊 InputStream in=getClass().getResourceAsStream("/db.properties"); //使用父類的方法將檔案流載入到Properties物件 load(in); //關閉流 in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 提供獲取例項的方法 * @return */ public static Env getInstance(){ if(null==instance){ return new Env(); }else{ return instance; } } }
db.properties檔案內容
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
username=law
password=a
maxActive=30
maxIdle=10
maxWait=100
(三)資料庫操作類
package com.shuang.commons; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Blob; import java.sql.Connection; 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; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; /** * 連線池實現 * @author shuang * */ public class DBHelper { private Connection conn=null; private PreparedStatement pstmt=null; private ResultSet rs = null; public Connection getConnection(){ try { DataSource dataSource=(DataSource)BasicDataSourceFactory.createDataSource(Env.getInstance()); conn=dataSource.getConnection(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } /** * 給佔位符賦值 * @param pstmt :要操作的sql語句 * @param params :要執行的sql語句中對應的佔位符的值 為null則沒有佔位符 * @throws SQLException */ public void setValue(PreparedStatement pstmt, List<Object> params) throws SQLException { // 給佔位符賦值 if (params != null && params.size() > 0) { Object obj = null; String type = ""; for (int i = 0; i < params.size(); i++) { obj = params.get(i); if (obj != null) { type = obj.getClass().getName(); if ("[B".equals(type)) { pstmt.setBytes(i + 1, (byte[]) obj); } else { pstmt.setString(i + 1, String.valueOf(obj)); } } else { pstmt.setString(i + 1, String.valueOf(obj)); } } } } /** * 更新操作 * * @param sql * 要操作的sql語句 * @param params * 要執行的sql語句中對應的佔位符的值 為null則沒有佔位符 * @return */ public int update(String sql, List<Object> params) { int result = 0; try { conn = this.getConnection(); pstmt = conn.prepareStatement(sql); this.setValue(pstmt, params); result = pstmt.executeUpdate(); // 執行語句 } catch (SQLException e) { e.printStackTrace(); } return result; } /** * 查詢結果集 * * @param sql * 要執行的sql語句 * @param params * 要執行的sql語句中對應的佔位符的值 為null則沒有佔位符 * @return */ public List<Map<String, Object>> select(String sql, List<Object> params) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> map = null; // 以列名為鍵,以對應的值為鍵 try { conn = this.getConnection(); pstmt = conn.prepareStatement(sql); this.setValue(pstmt, params); rs = pstmt.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData();// 獲取元資料 // 從元資料中獲取列的資訊 String[] colNames = new String[rsmd.getColumnCount()]; for (int i = 0; i < colNames.length; i++) { colNames[i] = rsmd.getColumnName(i + 1); } while (rs.next()) { map = new HashMap<String, Object>(); Object obj = null; String type; if (colNames != null && colNames.length > 0) { // 迴圈取出每一個值 for (String s : colNames) { obj = rs.getObject(s); if (obj != null) { type = obj.getClass().getName(); if ("oracle.sql.BLOB".equals(type)) { Blob blob = rs.getBlob(s); byte[] bt = null; InputStream is = blob.getBinaryStream(); if (is != null) { bt = new byte[(int) blob.length()]; try { is.read(bt); } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } map.put(s, bt); } else { map.put(s, null); } } else { map.put(s, String.valueOf(obj)); } } else { map.put(s, null); } } } list.add(map); } } catch (SQLException e) { e.printStackTrace(); } return list; } /** * 聚合查詢 * * @param sql * 要執行的sql語句 * @param params * 要執行的sql語句中對應的佔位符的值 為null則沒有佔位符 * @return */ public double selectPloymer(String sql, List<Object> params) { double result = 0; conn = this.getConnection(); try { pstmt = conn.prepareStatement(sql); this.setValue(pstmt, params); rs = pstmt.executeQuery(); if (rs.next()) { result = rs.getDouble(1); } } catch (SQLException e) { e.printStackTrace(); } return result; } /** * 聚合查詢 * * @param sql * 要執行的sql語句 * @param params * 要執行的sql語句中對應的佔位符的值 為null則沒有佔位符 * @return */ public List<Double> selectPloymers(String sql, List<Object> params) { List<Double> result = new ArrayList<Double>(); ; conn = this.getConnection(); try { pstmt = conn.prepareStatement(sql); this.setValue(pstmt, params); rs = pstmt.executeQuery(); if (rs.next()) { for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) { result.add(rs.getDouble(i + 1)); } } } catch (SQLException e) { e.printStackTrace(); } return result; } /** * 關閉資源的方法 */ public void close(){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { //e.printStackTrace(); throw new RuntimeException(); } } if(pstmt!=null){ try { pstmt.close(); } catch (SQLException e) { //e.printStackTrace(); throw new RuntimeException(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { //e.printStackTrace(); throw new RuntimeException(); } } } /** * DDL操作 * * @param sql * 要執行的語句 * @return */ public boolean createOp(String sql) { boolean bl = false; try { conn = this.getConnection(); pstmt = conn.prepareStatement(sql); bl = pstmt.execute(); } catch (SQLException e) { e.printStackTrace(); } return bl; } // 查詢結果 公共的方法 public <T> List<T> find(String sql, List<Object> params, Class<T> c) { List<T> list = new ArrayList<T>(); try { // 獲取資料庫連線物件 conn = this.getConnection(); pstmt = conn.prepareStatement(sql);// 獲取預處理物件 this.setValue(pstmt, params); rs = pstmt.executeQuery(); // 獲取返回結果集眾所有列的列名 ResultSetMetaData rsmd = rs.getMetaData();// 獲取元資料,包含類的名稱,型別等資訊 String columnNames[] = new String[rsmd.getColumnCount()]; for (int i = 0; i < rsmd.getColumnCount(); i++) {// 迴圈獲取列名儲存到陣列中 columnNames[i] = rsmd.getColumnName(i + 1); } // 獲取當前給定類中所有公有的方法 Method[] methods = c.getMethods(); // set列名與給定的類中的方法忽略大小寫迴圈比較,如果能夠匹配上,則啟用該方法將當前列的注入到物件對應的屬性中 T t;// 例項化物件 String methodName = null;// 方法名 String colName = null;// 列名 String typeName = null;// 引數型別名 Object val = null; // 當前迴圈列的值 while (rs.next()) { t = (T) c.newInstance();// 例項化一個類的物件 for (int i = 0; i < columnNames.length; i++) { // 獲取當前迴圈的列名 colName = columnNames[i]; // 根據列名獲取當前列的值 val = rs.getObject(colName); for (Method m : methods) {// 迴圈方法與方法名進行比較 methodName = m.getName(); if (("set" + colName).equalsIgnoreCase(methodName) && null != val) { // 獲取返回值的型別 typeName = val.getClass().getName(); if ("java.math.BigDecimal".equals(typeName)) { m.invoke(t, rs.getInt(colName)); // 啟用方法並設定 } else if ("java.lang.String".equals(typeName)) { m.invoke(t, rs.getString(colName)); // 啟用方法並設定 // 後續自己完成 } else if("java.lang.Boolean".equals(typeName)) { m.invoke(t, rs.getBoolean(colName)); }else if("java.lang.Byte".equals(typeName)){ m.invoke(t, rs.getByte(colName)); }else if("java.lang.Short".equals(typeName)){ m.invoke(t, rs.getShort(colName)); }else if("java.lang.Integer".equals(typeName)){ m.invoke(t, rs.getInt(colName)); }else if("java.lang.Long".equals(typeName)){ m.invoke(t, rs.getLong(colName)); }else if("java.lang.Float".equals(typeName)){ m.invoke(t, rs.getFloat(colName)); }else if("java.lang.Double".equals(typeName)){ m.invoke(t, rs.getDouble(colName)); }else if("[B".equals(typeName)){ m.invoke(t, rs.getBytes(colName)); }else if("java.sql.Time".equals(typeName)){ m.invoke(t, rs.getTime(colName)); }else if("java.sql.Timestamp".equals(typeName)){ m.invoke(t, rs.getTimestamp(colName)); }else if("oracle.sql.CLOB".equals(typeName)){ m.invoke(t,rs.getString(colName)); }else{ m.invoke(t, rs.getString(colName)); } } } } list.add(t); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } /** * 多表查詢 * @param sql:查詢語句 * @param params: 查詢語句中?所對應的值 * @return:結果集,存在一個List表中,用Map一對一的存放 * @throws SQLException */ public List<String> findList(String sql,List<Object> params){ List<String> result=new ArrayList<String>(); //將結果一次存在list中返回 conn=this.getConnection(); try { pstmt=conn.prepareStatement(sql); this.setValue(pstmt, params); rs=pstmt.executeQuery(); ResultSetMetaData md=rs.getMetaData(); //獲取結果集的元資料 String[] colnames=new String[md.getColumnCount()]; //獲取結果集中的列名 for(int i=0;i<colnames.length;i++){ colnames[i]=md.getColumnName(i+1); } while(rs.next()){ for(int i=0;i<colnames.length;i++){ result.add(rs.getString(i+1)); } } } catch (SQLException e) { throw new RuntimeException(e); }finally{ this.close(); } return result; } }
相關推薦
完整的jdbc操作資料庫程式碼記錄
很久的程式碼整理一下分享給大家,記錄給自己(一)DBC操作資料庫的基本步驟: 1)載入(註冊)資料庫驅動(到JVM)。 2)建立(獲取)資料庫連線。 3)建立(獲取)資料庫操作物件。 4)定義操作的SQL語句。 5)執行資料庫操作。 6)獲
JDBC操作資料庫(SQL server)——建立資料庫程式碼
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class Test { static
JDBC操作資料庫(SQL server)——連線資料庫程式碼
import java.sql.*; public class SqlLink { public static void main(String []args) { String userName = "TangHao"; String user
完整java開發中JDBC連線資料庫程式碼和步驟
宣告:來自Hongten(部落格園) JDBC連線資料庫 建立一個以JDBC連線資料庫的程式,包含7個步驟: 1、載入JDBC驅動程式: 在連線資料庫之前,首先要載入想要連線的資料庫的驅動到JVM(Java虛擬機器), 這通過java.lang
JAVA JDBC 連線資料庫程式碼
package ora; import java.sql.Connection; import java.sql.DriverManager; public class springhead { //驅動程式就是之前在classpath中配置的JDBC的驅動程式的JAR 包中 publ
01.JDBC操作資料庫-快速入門操作
/** * 簡單入門操作 * 注:先將mysql-connector-java-5.1.36.jar 構建 Build Path環境當中去 * @param args * @throws Exception */ public static v
Spring Boot 使用 JDBC 操作資料庫
1 第3-1課:Spring Boot 使用 JDBC 操作資料庫 《精通 Spring Boot 42 講》共分五大部分,第三部分主要講解 Spring Boot 和資料庫開發,共 8 課。Spring Boot 支援了主流的 ORM 框架:MyBatis、Hibern
JDBC操作資料庫以及三層架構模式
JDBC操作資料庫 1、JDBC概念 JDBC是實現java程式對各種資料庫的訪問,是一組類和介面,位於java.sql與javax.sql包 2、通過JDBC連線資料庫(不優化前) //1、載入驅動 Class.forName("com.mysql.jdbc.Dr
Java通過反射建立JDBC操作資料庫的通用方法
JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。 首先我們看個反射的小例子。 1.我們新建一個User的類。 2.通過反射獲取User物
jdbc篇第2課:使用jdbc操作資料庫
上節課我們成功的連線了資料庫,這節課我們試試來用java操作資料庫 想要操作資料庫,必定要藉助sql,java.sql包裡提供了一些類和介面來方便我們執行sql語句 Demo 01: package jdbc; imp
jdbc操作資料庫學習
jdbc程式設計的步驟大致分為: 1.載入資料庫驅動,首先對於不同的資料庫要匯入其相應的jar包,我這裡是mysql資料庫,可直接在eclipse中建立maven專案,在maven中匯入其對應的jar包 以下為載入jdbc驅動 Class.forName("com.mysql.jdbc.Dri
JDBC 操作資料庫
jdbc: package org.java.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Resul
利用jdbc操作資料庫——prepareStatement和Statement的比較以及利用batch模式提高效率的心得
1.prepareStatement vs statement (1)prepareStatement預編譯SQL語句,批處理效率高 什麼是預編譯,好處?(參考https://blog.csdn.net/Marvel__Dead/article/details/69
JDBC操作資料庫基礎
JDBC操作資料庫 一、JDBC的概念 JDBC:JavaDataBaseConnection:通過java程式碼操作資料庫。可以把JDBC看成一個操作Mysql的一個客戶端。 JDBC使用步驟: 1、載入mysql的驅動類:mysql-connector-j
jdbc 操作資料庫 資料的公用方法
/* * 處理Sql語句的工具類 */ public class SqlUtil { /* * 執行 增 改 的公用方法(支援事物) */ public static int executeUpdate(Conne
通過JDBC操作資料庫時出現中文亂碼的問題,Navicat
問題的發生 昨天我幫我同學做了一個前端加後端的專案,使用的是jdbc+Servlet+jsp技術。 但是通過junit測試向資料庫插入資料時,插入中文,在Navicat中是以問號顯示的。 獻上程式碼 @Test public void test1() t
JDBC操作資料庫基本步驟
轉自:http://jokerlinisty.iteye.com/blog/2198399 1、JDBC概念 1)從物理結構:JDBC是Java語言訪問資料庫的一套介面(API)集合。 2)從本質上:JDBC是呼叫者(開發人員)和實現者(資料庫廠商)之間的協
解決JDBC操作資料庫出現中文亂碼的問題
通過JDBC操作資料庫表時,如果記錄中有中文,可能會碰到亂碼的問題。主要原因是字元編碼(characterEncoding)不正確,不外乎以下幾個方面: 1、在資料庫伺服器上建立表格時沒有選擇支援中文的編碼方式 2、建立JDBC連線時沒有指明支援中文的編碼方
Java-JDBC操作資料庫
一.簡述 全稱是Java database connectivity,是java語言操作資料庫的 api (應用程式程式設計介面) 二.一般操作步驟 (1)載入驅動 (Driver) jdbc的驅動就是一個連線工廠,生成的產品是連線物件 com.mysql.jdbc.Driv
面試題:說下原生jdbc 操作資料庫流程?
原生的jdbc操作資料庫流程: 1.註冊驅動程式:Class.forName(“com.mysql.jdbc.Driver”); 2.使用驅動管理類來獲取資料連線物件:conn = DriverManager.getConnection(…); 3.獲取資料庫操作物件:Stateme