1. 程式人生 > >完整的jdbc操作資料庫程式碼記錄

完整的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