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

	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章