条件~必须要有一个类 对应着数据库的表 数据库查询语句的必须取跟对应类的下的变量名一样的别名
1.利用泛型的方法获得类加载器
2.利用泛型返回所查询的对象值
3.方法的参数为数据库表所对应的类加载器,要执行的sql语句,PreparedStatement所对应的占位符的值,这里用可变形参传递
4.实现步骤
1》获取数据库链接对象
2》从数据库链接对象获取PreparedStatment对象(用于发送sql语句)(Connection下的 prepareStatement(sql)方法) 1.通过将可变形参设置到占位符上去
通过setObject(int index )设置上去
此方法会先通过 instance of判断 object具体是哪个类型然后去发送数据
3》获得ResultSet对象(PreparedStatement下的 excuteQuary())
4》从ResultSet下的对象获取ResultSetMetadata(数据源)对象(getMetadata())
5》通过ResultSetMetadata的 getColumnCount()可知道当前查询了多少列,通过getColumnName(int index)可返回 当前列的别名
6》新建一个map<String(别名),Object(别名所对应的那列的数据)>
7》通过第五的两个方法用循环可实现从第一列到最后一列获取列的别名,然后在通过 Result下的 getObject(int index)方法可获 取对应列下的值 。然后将 键:对应的别名 值:别名对应的值 put到map中去。
8》如果map中有值得话则通过第一个形参的类加载器的 newInstance()创建一个对象 没有的话返回null;
9》遍历map键值对 通过反射的方式将值设置到第八步所创建的对象中去。(在反射机制那章我们学到 如果有了运行时类对象,有了属性名称,是可以获得对应属性的值,和设置对应数据的值得)
代码:
private static <T> T get(Class<T> class1,String sql,Object ... args) {
// TODO Auto-generated method stub
T object=null;
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
ResultSetMetaData resultSetMetaData=null;
try {
//1.获取数据库链接对象
connection=JdbcUtil.getConnection();
//2.获取preparedStatement对象。
//1>获取
preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
//2>给占位符传值
for(int i=0;i<args.length;i++) {
preparedStatement.setObject(i+1, args[i]);
}
//1.得到ResultSet对象
resultSet=preparedStatement.executeQuery();
//2.得到ResultSetMetaData对象
resultSetMetaData = (ResultSetMetaData) resultSet.getMetaData();
//3.创建一个Map<String,Object>对象 键=列别名,值:列的值。
Map <String,Object> map=new HashMap<>();
//4.处理结果集
if(resultSet.next()) {
for(int i=0;i<resultSetMetaData.getColumnCount();i++) {
String columnname=resultSetMetaData.getColumnLabel(i+1);
Object obj=resultSet.getObject(i+1);
map.put(columnname, obj);
}
}
//5.遍历map利用反射给Class对象赋值
if(map.size()>0) {
object=class1.newInstance();
for(Map.Entry<String,Object> entry:map.entrySet()) {
String fieldName=entry.getKey();
Object value=entry.getValue();
ReflectionUtils.setFieldValue(object, fieldName, value);//通过反射的方法设置值这是自己创建的类
}
}
} catch (Exception e) {
// TODO: handle exception
}finally {
JdbcUtil.release(connection, preparedStatement, resultSet);
return object;
}
}