JAVA中使用JDBC、反射技术接收实体类列表(对象放入List集合中)

本文介绍如何利用Java反射机制从数据库中读取数据并映射到Java对象。通过具体实例展示了配置数据库连接、创建实体类、使用反射技术进行数据绑定的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]]


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值