元数据
什么是元数据?
一、数据库相关的信息:(封装到数据库元对象: DataBaseMetaData)
数据库的版本
驱动程序的版本
二、参数相关的信息:(封装到参数元对象:ParameterMetaData)
参数数量
参数类型
三、结果相关的信息:(封装到结果集元对象: ResultSetMetaData)
列数量
列名称
jdbc步骤:
1)连接数据库,获取Connection对象 (得到DataBaseMetaData)
2)创建Statment,预编译sql语句 (得到ParameterMetaData)
3)设置参数
4)执行sql,返回结果集 (得到ResultSetMetaData)
5)遍历结果集
6)关闭连接
练习:
抽取两个通用的jdbc方法
1)通用的修改方法(insert、update、delete)
update() 用于任何表的任何更新操作
2)通用的查询方法,查询后返回List集合
find() 无论查询什么表,都能返回我们需要的List集合
提示:使用元数据
/**
* jdbc的工具方法
* @author APPle
*
*/
public class DBUtil {
private static ComboPooledDataSource ds = new ComboPooledDataSource();
/**
* 通用的更新方法
* 不同更新操作的不同点:
* 1)sql语句不同
* 2)参数列表不同
*/
public static void update(String sql,Object[] values){
Connection conn = null;
PreparedStatement stmt = null;
try {
//获取连接
conn = ds.getConnection();
//预编译sql
stmt = conn.prepareStatement(sql);
//设置参数
ParameterMetaData md = stmt.getParameterMetaData();
//得到参数数量
int count = md.getParameterCount();
if(values!=null){
for(int i=1;i<=count;i++){
stmt.setObject(i, values[i-1]);
}
}
//执行sql
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally{
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
/**
* 通用的查询方法
* 不同点:
* 1)sql语句不同
* 2)参数不同
* 3)List集合中的对象不同
*/
public static List find(String sql,Object[] values,Class clazz){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
List list = new ArrayList();
try {
//获取连接
conn = ds.getConnection();
//预编译sql
stmt = conn.prepareStatement(sql);
//设置参数
ParameterMetaData md = stmt.getParameterMetaData();
int count = md.getParameterCount();
if(values!=null){
for(int i=1;i<=count;i++){
stmt.setObject(i, values[i-1]);
}
}
//执行sql
rs = stmt.executeQuery();
//得到结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
//得到列数据
int columnCount = rsmd.getColumnCount();
//遍历结果集
while(rs.next()){
//创建一个javabean对象
Object obj = clazz.newInstance();
//把每行的结果放入javabean对象
//遍历每列
for(int i=1;i<=columnCount;i++){
//得到列名称
String columnName = rsmd.getColumnName(i);
//得到列内容
Object value = rs.getObject(columnName);
//把列内容赋值给javabean
/**
* 约定前提: 数据库表的字段名称和javabean的属性名称保持一致!!!!
*/
BeanUtils.copyProperty(obj, columnName, value);
}
//把javabean放入list集合
list.add(obj);
}
return list;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally{
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}