使用原因
我们在进行数据库查询的时候,查询出来的结果是ResultSet对象,我们需要一行一行的遍历,用Object.setXxxx(ressultSet.getString(“xxx”))。如果表的字段比较多的话,每次查询都这样写工作量就很多拉,无疑是浪费时间和精力。
解决思路
我们可以让查询的RestultSet对象一行数据和数据库表对象的实体类Object一起传入一个类中进行“加工”,把ResultSet中的值通过Object.setXxx方法写入Object对象中。
实现过程
一、创建数据库表
在数据库中创建一个Student表作测试
二、创建实体类
public class Student {
private String s_sno;
private String s_name;
private String s_age;
public String getS_sno() {
return s_sno;
}
public void setS_sno(String s_sno) {
this.s_sno = s_sno;
}
public String getS_name() {
return s_name;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
public String getS_age() {
return s_age;
}
public void setS_age(String s_age) {
this.s_age = s_age;
}
}
三、创建加工类(主要的是toObject方法用于ResultSet转换为Object)
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class DButil {
public static void toObject(ResultSet resultSet , Object object) {
Class<?> c = object.getClass();
Map<String, Object> map=new HashMap<>();
Field[] fields=c.getDeclaredFields();//获取属性数组
for(int i=0;i<fields.length;i++){
try {
System.out.println(fields[i].getName());
map.put(fields[i].getName(), resultSet.getObject(fields[i].getName()));
} catch (SQLException e) {
e.printStackTrace();
}
}
Method[] methods = c.getMethods();//获取对象方法
for (Method method : methods) {
if (method.getName().startsWith("set")) {
String name = method.getName();
System.out.println(name);
name = name.substring(3, 4).toLowerCase() + name.substring(4, name.length());//获取属性名
System.out.println(name);
if (map.containsKey(name)) {
try {
method.invoke(object, map.get(name));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
public static Connection getConnection(String driver ,String url ,String user ,String password) {
Connection connection = null;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}
return connection;
}
}
四、测试类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class test {
public static void main(String[] args) {
//("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/ddserver", "root", "");
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost/student";
String user="root";
String password="";
String sql = "select * from students";
Student student = null;
Connection connection = DButil.getConnection(driver, url, user, password);
try {
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()) {
student = new Student();
DButil.toObject(resultSet, student);
}
} catch (SQLException e) {
e.printStackTrace();
}
if(student !=null) {
System.out.println(student.toString());
}
}
}
五、测试结果
六、注意事项
注意:实体类的属性必须和数据库里面的字段对应,属性的类型也要和数据库对应。属性类型最好使用对象类型不要使用基本数据类型,比如int写成Integer、double写成Double。实体类bi要有get和set方法。