元数据:数据库、表、列的定义信息
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(*)的值。