dbutils可以用来简化数据操作的代码,这里我根据反射技术与元数据API写了一个简单的MyUtils的工具类。通过元数据的API可以的到结果集的列数与结果集的每列的数据,然后通过反射技术,获得字节码,并将前面获得的每列的值赋给字节码中对应的字段。下面贴上我写的代码:
首先是工具类的代码:
public class MyUtils
{
private DataSource datasource;
public MyUtils(DataSource datasource)
{
super();
this.datasource = datasource;
}
public void update(String sql,Object...obj)
{ //updata方法可以实现数据的增删改操作
try {
Connection con = datasource.getConnection();
PreparedStatement ps = con.prepareStatement(sql);
//使用元数据获得占位符的个数
ParameterMetaData pm = ps.getParameterMetaData();
int coun = pm.getParameterCount();
if(coun!=obj.length) {throw new RuntimeException();}
else{
for (int i = 0; i < obj.length; i++)
ps.setObject(i+1, obj[i]);
}
ps.executeUpdate();
} catch (Exception e) { e.printStackTrace(); }
}
public Object query(String sql, BeanHandler bean,Object...obj)
{ //query可以实现数据的查询工作
ResultSet rs=null;
try {
Connection con = datasource.getConnection();
PreparedStatement ps = con.prepareStatement(sql);
//使用元数据获得占位符的个数
ParameterMetaData pm = ps.getParameterMetaData();
int coun = pm.getParameterCount();
if(coun!=obj.length) {throw new RuntimeException();}
else{
for (int i = 0; i < obj.length; i++)
ps.setObject(i+1, obj[i]);
}
rs = ps.executeQuery();
} catch (Exception e) { e.printStackTrace(); }
return bean.reback(rs);
}
}
然后是仿照dbutils中ResultSetHandler的接口代码:
public interface BeanHandler
{ //面向接口编程
Object reback(ResultSet rs);
}
然后是实现BeanHandler的两个实现类,分别对应着dbutils中的BeanListHandler与BeanHandler:
public class ListBeanHandler implements BeanHandler
{
private Class cla;
private List<Object> lis;
public ListBeanHandler(Class cla)
{
super();
this.cla = cla;
}
@Override
public Object reback(ResultSet rs)
{
lis = new ArrayList<Object>();
try {
ResultSetMetaData remd = rs.getMetaData();
int count = remd.getColumnCount();
while(rs.next()){
Object bean = cla.newInstance();
for ( int i = 0; i < count; i++) {
String s = remd.getColumnName(i+1);
Field f = cla.getDeclaredField(s);
f.setAccessible(true);
f.set(bean, rs.getObject(i+1));
}
lis.add(bean);
}
} catch (Exception e) { e.printStackTrace(); }
return lis;
}
}
public class BeansHandler implements BeanHandler
{
private Class cla;
public BeansHandler(Class cla)
{ //获得字节码
super();
this.cla = cla;
}
@Override
public Object reback(ResultSet rs)
{ //将结果集封装到bean对象
Object bean = null;
try {
//使用元数据获得结果集的列数
ResultSetMetaData remd = rs.getMetaData();
int count = remd.getColumnCount();
for (int i = 0; i < count; i++) {
//通过元数据获得每一列的列名
String s = remd.getColumnName(i+1);
//使用反射得到字节码中的字段名,然后暴力反射将每一列的值赋给字节码中同名的字段
Field f = cla.getDeclaredField(s);
bean = cla.newInstance();
f.setAccessible(true);
f.set(bean, rs.getObject(s));
}
} catch (Exception e) { e.printStackTrace(); }
return bean;
}
}