元數據 --- 如何編寫JDBC框架--DBUTILS框架

元數據:數據庫、表、列的定義信息


DataBaseMetaData 對象

用Connection對象的getMetaData()方法來獲取DataBaseMetaData對象。

方法:

getURL():返回一個String類對象,代表數據庫的URL。
getUserName():返回連接當前數據庫管理系統的用戶名。
getDatabaseProductName():返回數據庫的產品名稱。
getDatabaseProductVersion():返回數據庫的版本號。
getDriverName():返回驅動驅動程序的名稱。
getDriverVersion():返回驅動程序的版本號。
isReadOnly():返回一個boolean值,指示數據庫是否只允許讀操作。


ParameterMetaData 對象

PreparedStatement.getParameterMetaData() 來獲取對象

方法:

getParameterCount() :獲得指定參數的個數
getParameterType(int param) :獲得指定參數的sql類型(驅動可能不支持)


ResultSetMetaData  對象

ResultSet. getMetaData() 來獲取對象

方法:

getColumnCount() :返回resultset對象的列數
getColumnName(int column) :獲得指定列的名稱
getColumnTypeName(int column):獲得指定列的類型 java.sql.Types


例:

package com.itheima.utils;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils {

	private static ComboPooledDataSource ds;

	static {
		ds = new ComboPooledDataSource("mysql");
	}

	public static Connection getConnection() throws SQLException {

		return ds.getConnection();
	}

	public static void release(ResultSet rs, Statement stmt, Connection conn) {

		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
	}

	public static void update(String sql, Object[] params) {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			conn = JdbcUtils.getConnection();
			stmt = conn.prepareStatement(sql);

			ParameterMetaData pmd = stmt.getParameterMetaData();

			int count = pmd.getParameterCount();

			if (params.length == count) {

				for (int x = 0; x < count; x++) {

					stmt.setObject(x + 1, params[x]);
				}
				stmt.executeUpdate();
			} else {
				throw new RuntimeException("參數不正確!");
			}

		} catch (SQLException e) {
			throw new RuntimeException("執行失敗");
		} finally {
			release(rs, stmt, conn);
		}
	}

	public static List selectToBean(String sql, Object[] params,
			ResultSetHandler rsh) {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			conn = JdbcUtils.getConnection();
			stmt = conn.prepareStatement(sql);
			rs = stmt.executeQuery();
			
			return (List) rsh.handler(rs);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

package com.itheima.utils;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public interface ResultSetHandler {

	public Object handler(ResultSet rs);
}

class myHandler implements ResultSetHandler {

	private Class clazz;

	public myHandler(Class clazz) {
		this.clazz = clazz;
	}

	@Override
	public Object handler(ResultSet rs) {

		List list = new ArrayList();
		try {
			while (rs.next()) {
				try {
					Object bean = clazz.newInstance();
					ResultSetMetaData rsmd = rs.getMetaData();

					int count = rsmd.getColumnCount();

					for (int x = 0; x < count; x++) {
						String columnName = rsmd.getColumnName(x + 1);
						Object columnValue = rs.getObject(columnName);

						try {
							PropertyDescriptor pd = new PropertyDescriptor(
									columnName, bean.getClass());
							Method method = pd.getWriteMethod();
							method.invoke(bean, columnValue);
						} catch (Exception e) {
							continue;
						}
					}
					list.add(bean);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			return list;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

DBUtils框架

Apatch提供DBUtils開源JDBC工具類庫

API介紹

org.apache.commons.dbutils.QueryRunner :DBAssist
org.apache.commons.dbutils.ResultSetHandler


工具類:

org.apache.commons.dbutils.DbUtils

提供如關閉連接、裝載JDBC驅動程序等常規工作的工具類,裏面的所有方法都是靜態的。

方法:

public static void close(…)throws java.sql.SQLException: DbUtils類提供了三個重載的關閉方法。這些方法檢查所提供的參數是不是NULL,如果不是的話,它們就關閉Connection、Statement和ResultSet。
public static voidcloseQuietly(…): 這一類方法不僅能在Connection、Statement和ResultSet爲NULL情況下避免關閉,還能隱藏一些在程序中拋出的SQLEeception。
public static voidcommitAndCloseQuietly(Connection conn): 用來提交連接,然後關閉連接,並且在關閉連接時不拋出SQL異常。
public static booleanloadDriver(java.lang.String driverClassName):這一方裝載並註冊JDBC驅動程序,如果成功就返回true。使用該方法,你不需要捕捉這個異常ClassNotFoundException。


QueryRunner類

該類簡單化了SQL查詢,它與ResultSetHandler組合在一起使用可以完成大部分的數據庫操作,能夠大大減少編碼量。
QueryRunner類提供了兩個構造方法:
默認的構造方法
需要一個 javax.sql.DataSource 來作參數的構造方法。
大文本操作

方法:

lpublicObject query(Connection conn, String sql, Object[] params, ResultSetHandlerrsh) throws SQLException:執行一個查詢操作,在這個查詢中,對象數組中的每個元素值被用來作爲查詢語句的置換參數。該方法會自行處理PreparedStatementResultSet 的創建和關閉
lpublicObject query(String sql, Object[] params, ResultSetHandler rsh) throwsSQLException: 幾乎與第一種方法一樣;唯一的不同在於它不將數據庫連接提供給方法,並且它是從提供給構造方法的數據源(DataSource) 或使用的setDataSource 方法中重新獲得Connection。
public Object query(Connection conn, String sql, ResultSetHandler rsh) throwsSQLException : 執行一個不需要置換參數的查詢操作。
public int update(Connection conn, String sql, Object[] params) throws SQLException:用來執行一個更新(插入、更新或刪除)操作。l
public int update(Connection conn, String sql) throws SQLException:用來執行一個不需要置換參數的更新操作。


ResultSetHandler 接口

該接口用於處理 java.sql.ResultSet,將數據按要求轉換爲另一種形式。
ResultSetHandler 接口提供了一個單獨的方法:Object handle (java.sql.ResultSet .rs)。

實現類:

ArrayHandler:把結果集中的第一行數據轉成對象數組。
ArrayListHandler:把結果集中的每一行數據都轉成一個數組,再存放到List中。
BeanHandler:將結果集中的第一行數據封裝到一個對應的JavaBean實例中。
BeanListHandler:將結果集中的每一行數據都封裝到一個對應的JavaBean實例中,存放到List裏。
ColumnListHandler:將結果集中某一列的數據存放到List中。
KeyedHandler(name):將結果集中的每一行數據都封裝到一個Map<列名,列值>裏,再把這些map再存到一個map裏,其key爲指定的key(指定的key就是我們指定哪個字段名爲key)
MapHandler:將結果集中的第一行數據封裝到一個Map裏,key是列名,value就是對應的值。
MapListHandler:將結果集中的每一行數據都封裝到一個Map裏,然後再存放到List


ScalarHandler:select count(*) from account;可以取出count(*)的值。











發佈了67 篇原創文章 · 獲贊 8 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章