1)导入jar包
2)配置数据库信息,创建连接对象
public class JdbcUtils {
// jdbc驱动
private static String jdbcDriver = "com.mysql.jdbc.Driver";
// 数据库地址
private static String jdbcUrl = "jdbc:mysql://localhost:3306/test?characterEncoding=utf-8";
// 数据库账户
private static String username = "root";
// 数据库密码
private static String password = "123456";
//注册数据库连接驱动
static{
try {
Class.forName(jdbcDriver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("加载数据库连接驱动失败");
}
}
/*
* 获取数据库连接
*/
public static Connection getConnection(String url, String username, String password) {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, username, password);
//获取连接成功
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("获取数据库连接失败!");
}
return conn;
}
/*
* 关闭数据库连接
*/
public static void closeDb(Connection con , Statement st , ResultSet rs) throws SQLException{
if(rs != null){
rs.close();
}
if(st != null){
st.close();
}
if(con != null){
con.close();
}
}
}
3)MYSQL数据库中创建表,插入部分测试数据
CREATE TABLE `student` (
`id` varchar(30) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(10) DEFAULT NULL,
`pic` varchar(50) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES ('1', 'lisi', null, null);
INSERT INTO `student` VALUES ('1', 'zhangsan1', '1', null);
INSERT INTO `student` VALUES ('2', 'zhangsan2', null, null);
4)创建学生实体类
public class Student {
private String id;
private String name ;
private Integer age;
private String pic;
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
5)所用到的方法练习,先看一边流程
public class ReflectDemo {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Class clazz = Student.class;
//返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName()+"是Student对象中的属性,类型为"+field.getType());
}
System.out.println("");
//返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName()+"是Student中的方法");
}
System.out.println();
Object object = clazz.newInstance();
System.out.println(object.getClass().getName());
Student stu = (Student)object;
System.out.println(stu.getClass().getName());
}
}
}
6)代码实现
public static void main(String[] args) throws Exception {
Connection conn = getConnection(jdbcUrl, username, password);
//使用反射技术将取出数据封装到对象中
reflectDemo(conn,"com.test.Student");
}
private static void reflectDemo(Connection conn,String className) throws Exception, IllegalAccessException {
PreparedStatement ps = conn.prepareStatement("select * from student");
ResultSet rs = ps.executeQuery();
ResultSetMetaData data = rs.getMetaData();
List<Object> resultList = new ArrayList<Object>();
// System.out.println(data.getColumnCount());
Class clazz = Class.forName(className);
while(rs.next()){
Object obj = clazz.newInstance();
for (int i = 1; i < data.getColumnCount(); i++) {
String filedName = data.getColumnName(i);
try{
//获取属性
Field f = clazz.getDeclaredField(filedName);
//获取属性类型
Class fieldType = f.getType();
String methodName="set"+filedName.substring(0,1).toUpperCase()+filedName.substring(1);
Method m = clazz.getDeclaredMethod(methodName, fieldType);
Object fieldValue = rs.getObject(filedName);
m.invoke(obj, fieldValue);
}catch (Exception e){
continue;
}
}
System.out.println();
resultList.add(obj);
}
System.out.println(resultList);
}
7)输出结果
[Student [id=1, name=lisi, age=null], Student [id=1, name=zhangsan1, age=1], Student [id=2, name=zhangsan2, age=null], Student [id=3, name=zhangsan3, age=3]]