所谓元数据,指的是数据中定义了一些关于数据库、表、列的信息,在 JDBC技术规范中可以使用三大元数据DataBaseMetaData、ParameterMetaData、ResultSetMetaData 进行相应信息的获取。ResultSetMetaData:该元数据中保存了一些关于数据查询结果的相关信息;ParameterMetaData :该元数据中主要是包含了一些参数的信息;DataBaseMetaData:该元数据中主要是包含了一些数据库相关的信息。
使用元信息结合Java的反射机制,可以自定义一个JDBC的框架 。
package cn.com.bochy.db;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class DBUntil {
/**
* 1、加载驱动包
*/
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;
private static String username = "root";
private static String userpwd = "root";
private static String url = "jdbc:mysql://localhost:3306/";
private static String db = "test";
/**
* 1、获取连接对象的方法
*
*/
public Connection getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
// Driver d=new Driver();
conn = DriverManager.getConnection(url + db, username, userpwd);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 2、封装查询的方法,结果封装成结果集
*/
public ResultSet query(String sql, Object[] param) {
getConnection();
try {
pstmt = conn.prepareStatement(sql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
pstmt.setObject(i + 1, param[i]);
}
}
rs = pstmt.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
/**
* 3、封装查询的方法,结果封装成List
*/
public List<Object> getAll(String sql, Object[] param, Class<?> c) {
getConnection();
rs = query(sql, param);
List<Object> lis = new ArrayList<Object>();
try {
ResultSetMetaData r = rs.getMetaData();
// String packageName=r.get
while (rs.next()) {
Object bean = c.newInstance();
for (int i = 0; i < r.getColumnCount(); i++) {
String columnName = r.getColumnName(i + 1);
Object value = rs.getObject(columnName);
Field f = bean.getClass().getDeclaredField(columnName);
f.setAccessible(true);
f.set(bean, value);
}
lis.add(bean);
}
} 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 (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
closeAll();
return lis;
}
/**
* 4、封装查询的方法,结果封装成Bean
*/
public Object getBean(String sql, Object[] param,Class<?> c) {
getConnection();
rs = query(sql, param);
Object bean = null;
try {
ResultSetMetaData r = rs.getMetaData();
bean = c.newInstance();
for (int i = 0; i < r.getColumnCount(); i++) {
String columnName = r.getColumnName(i + 1);
Object value = rs.getObject(columnName);
Field f = bean.getClass().getDeclaredField(columnName);
f.setAccessible(true);
f.set(bean, value);
}
} 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 (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
closeAll();
return bean;
}
/**
* 5、封装非查询(添加、删除、修改)的方法
*/
public boolean noQuery(String sql, Object[] param) {
getConnection();
try {
pstmt = conn.prepareStatement(sql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
pstmt.setObject(i + 1, param[i]);
}
}
int rows = pstmt.executeUpdate();
closeAll();
if (rows > 0) {
return true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
/**
* 6、关闭资源
*/
public void closeAll() {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上述地方可以改良的地方:
1、配置信息可以写在一个.properties文件或者.xml文件中,通过读取配置文件获取配置信息,解决配置信息直接放入代码的硬编码方式。
2、可以加入连接池,使其连接对象由连接池统一管理,加强并发的处理能力。