元數據:數據庫、表、列的定義信息
DataBaseMetaData 對象
用Connection對象的getMetaData()方法來獲取DataBaseMetaData對象。
方法:
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驅動程序等常規工作的工具類,裏面的所有方法都是靜態的。
方法:
QueryRunner類
該類簡單化了SQL查詢,它與ResultSetHandler組合在一起使用可以完成大部分的數據庫操作,能夠大大減少編碼量。
QueryRunner類提供了兩個構造方法:
默認的構造方法
需要一個 javax.sql.DataSource 來作參數的構造方法。
大文本操作
方法:
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(*)的值。