这里我以student类为例
首先创建一个student类
public class student {
private String name;
private Date date;
private int id;
public student() {
}
public student(String name, Date date, int id) {
this.name = name;
this.date = date;
this.id = id;
}
@Override
public String toString() {
return "student{" +
"name='" + name + '\'' +
", date=" + date +'\'' +
", id=" + id+
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
我数据库的表格如下:
这里有一点注意到的是:
可以看到,我设置的student类中date和birthday类名不同,为了程序的顺利进行,可以在sql语句中加上别名,这时就需要将getColumnName换成getColumnLabel,
getColumnLabel具有getColumnName的功能,并且还有识别别名的功能,所以getColumnLabel比getColumnName更常用
下面是查询的实现:
package JDBC;
import JDBC.packageTest.JDBCUtils;
import JDBC.packageTest.student;
import org.junit.Test;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
public class FinallyQuery {
public <T> T Query(Class<T> clazz,String sql,Object...args){
Connection conn = null;
PreparedStatement pre = null;
ResultSet re = null;
try {
conn = JDBCUtils.getConnection();//这里的JDBCUtils是额外创建的类,封装了连接和关闭数据库的方法
pre = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
pre.setObject(i+1,args[i]);
}
re = pre.executeQuery();
//获取结果集的元数据
ResultSetMetaData me = re.getMetaData();
//通过resultsetmetadata获取结果集中的列数
int co = me.getColumnCount();
if (re.next()){
T t = clazz.getDeclaredConstructor().newInstance();
for (int i = 0; i < co; i++) {
//获取列值
Object columValue = re.getObject(i + 1);
//获取每个列的列名
//getColumnname不常用
//getColumnLabel可以获取别名,当数据库表不一致时,在语句中设置别名更方便
String columnName = me.getColumnLabel(i + 1);
//给p对象指定的columnname属性,赋值为columnvalue,通过反射
Field field = student.class.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t, columValue);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.closeResource(conn,pre,re);
}
return null;
}
@Test
public void Test(){
String sql="select name,birthday date,id from student where id=?";
student query = Query(student.class, sql, 1);
System.out.println(query);
}
}
执行代码:
该查询功能可以对不同的表进行查询,修改Test()方法即可实现
其中还要注意一点的是在java1.9版本中,newInstance()已经被弃用,取而代之的是:
class.getDeclaredConstructor().newInstance()
已经在代码中更正。