Java反射机制之初见端倪

这里模拟一下Hibernate的save,初试OR Mapping。

首先建立JavaBean student类。

student.java

package hibernate.source;

public class student {
	private int id;
	private String name;
	private int age;

	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 int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}


编写测试方法,要求直接将student存入数据库。

TestStudent.java

import hibernate.source.student;

public class TestStudent {
	
		public static void main(String args[]) throws Exception {
			student cat=new student();
			
			cat.setAge(22);
			cat.setName("Jing");
			cat.setId(26);
			
			Session session=new Session();

			session.save(cat);
			
		}
}


我们模拟了Hibernate中的Session,这里我们需要自己编写Session类来实现将student存入数据库。

Session.java

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;
import hibernate.source.student;


public class Session {
	
	String TableName="student";
	Map<String,String> cfs=new HashMap<String,String>();
	String[] MethodName;
	Session() {
			
		cfs.put("id", "id");
		cfs.put("name", "name");
		cfs.put("age", "age");
		MethodName=new String[cfs.size()];
		
	}
	
	public void save(student cat) throws Exception{
		
		String sql=createSql();
			
		Class.forName("com.mysql.jdbc.Driver");
		Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test");
		PreparedStatement pst=conn.prepareStatement(sql);
		
		for(int i=0;i<cfs.size();i++) {
			
			Method m=cat.getClass().getMethod(MethodName[i]);
			Class<?> r=m.getReturnType();
			
			System.out.println(m.getName());
			System.out.println(r.getName());
			if(r.getName().equals("java.lang.String")) {
				String tem=(String)m.invoke(cat);
				pst.setString(i+1, tem);
			}
			if(r.getName().equals("int")) {
				Integer tem=(Integer)m.invoke(cat);
				pst.setInt(i+1,tem);
			}	
		}
		
		pst.execute();
		pst.close();
		conn.close();
		
	}

	public String createSql() {
		String sql1="";
		for(int i=0;i<cfs.size();i++){	
			sql1+=cfs.keySet().toArray()[i]+",";
			
			String property=(String)cfs.values().toArray()[i];
			String s=property.substring(0, 1).toUpperCase();
			MethodName[i]="get"+s+property.substring(1, property.length());
			System.out.println(MethodName[i]);
		}
		
		String sql2="";
		for(int i=0;i<cfs.size();i++) {
			sql2+="?"+",";	
		}
		
		sql2=sql2.substring(0, sql2.length()-1);
		sql1=sql1.substring(0, sql1.length()-1);
		
		String sql="insert into "+TableName+" ("+sql1+")"+" values"+" ("+sql2+")";
		System.out.println(sql);	
		return sql;
	}

	

}


思路:

1.拼接SQL语句,将用在Preparedstatement中。

2.需要将student的属性设到Preparedstatement中,问题是怎么实现呢?

3.利用Java反射机制。

    1)新建MethodName数组,目的将student中的方法名获得并存入MethodName中。

    2)Method类登场,让student类通过MethodName取得对应的方法,返回给Mehod对象。

    3)Method类invoke(Class), 将反射执行student对应的方法,获取对应属性值。


原文地址:https://www.cnblogs.com/jackhub/p/3147221.html